Мы находимся в таком сценарии: https://stackoverflow.com/questions/7304826/how-to-debug-a-multithreaded-hung-process-in-linux
Когда мы пытаемся посмотреть на мошеннический процесс (который потребляет 100% ЦП), он находится в таком состоянии:
ls -l /proc/XXXX/fd
lrwx------ 1 root root 64 Feb 1 16:08 9 -> /tmp/.ZendSem.sdiU42 (deleted)
Мы хотели бы знать, что было в файле (который теперь удален), чтобы попытаться отследить причину проблемы. Я думаю, что ftrace может это сделать (или, может быть, другой инструмент), но я не знаю, как это сделать.
/tmp/.ZendSem.sdiU42
это файл блокировки, который был намеренно удален сразу после создания. Этого достаточно, чтобы предотвратить снятие этой блокировки другими потоками. У него также есть приятное свойство исчезать после завершения процесса. См. Исходники php: ext / opcache / zend_shared_alloc.c
Вам нужно собрать гораздо больше контекста о том, что делает ваше приложение, и как это взаимодействует с программным стеком и ядром.
Определите PID в журналах веб-сервера и посмотрите, сможете ли вы идентифицировать что-нибудь, возможно, когда воркер был разветвлен.
Профиль исполнения. В Linux запустите perf top
и посмотрите, где это больше всего времени. Устанавливайте символы отладки для этой программы и ядра, пока не сможете разобраться в именах функций. Также попробуйте ltrace
если вы хотите что-то вроде strace
но для вызовов пользовательской библиотеки.