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