Как обнаружить причину ошибки 500?
Попробуйте дебагеры, логирование а-ля "position 1", "position 2" после каждого существенного действия. Но это не на продакшен сервере естественно. Также вероятно это дыра в запросе в БД. Посмотрите, может там нет "LIMIT 1" какого-то.
Ведь очень похоже, что раз "mysql" кушает процессор и много-много памяти - значит очень тяжелый запрос, скорее всего "SELECT".
И 40 секунд скорее всего - максимальное время ответа что-ли, после веб сервер отдает 500 ошибку. Но в этом я не уверен. Может быть просто PHP падает от размера объекта.
есть только общая инструкция "смотреть логи". Что скрипт делает ? там по идее бесконечный цикл должен быть, и конкретно ваша 500ая ошибка от перегрузки. При том если вы пишете что грузит mysqld , значит... чую не те логи вы смотрите :)  посмотрите что база делает в данный момент, к чему идут обращения. Далее смотреть какое место в коде вызывает зти запросы.