Как узнать, какой файл ожидает Apache, когда WCHAN = flock_lock_file_wait

У нас есть проблема с нашими веб-серверами, в которой все больше и больше процессов Apache застревают в ожидании блокировки файла (вызванной PHP flock()), чтобы как-то разрешить, но никогда этого не происходит. В конце концов сайт становится все медленнее и медленнее и, наконец, полностью останавливается, пока Apache не будет перезапущен.

Я работаю над теорией, что за этим стоит какой-то плохой код, возможно, в нашем доморощенном механизме дискового кэша. Но я не могу это отследить. (Мы работаем на Ubuntu.)

Мой вопрос в том, как я могу определить, в каком файле или файлах он застревает? Если бы я мог видеть, где зависание, мне было бы намного легче выяснить, где находится плохой код. Когда я делаю эту команду:

ps -o pid,tt,user,fname,wchan -C apache2 

Я получаю это:

  730 ?        www-data apache2  flock_lock_file_wait  
 3085 ?        www-data apache2  flock_lock_file_wait  
 5393 ?        www-data apache2  flock_lock_file_wait  
 5397 ?        www-data apache2  flock_lock_file_wait  
11181 ?        www-data apache2  flock_lock_file_wait  
30280 ?        www-data apache2  flock_lock_file_wait   

Есть ли способ перейти от этого к тому, чтобы увидеть, какой именно файл Apache заблокирован / ждет?


person dvanhook    schedule 22.08.2011    source источник


Ответы (1)


Вам придется использовать утилиту lsof:

apt-get install lsof

lsof означает список открытых файлов. С ним можно многое сделать, например, lsof -ni перечислит открытые сетевые соединения. Для ваших процессов apache вам придется использовать параметр -p (PID):

lsof -p 730

И вы получите все открытые файлы и библиотеки (все это файлы в Linux), поэтому, очевидно, вы получите свой файл блокировки.

person regilero    schedule 23.08.2011
comment
Вау, большое спасибо за это. Хорошо, что утилита lsof уже была установлена. К сожалению, список вещей, которые я получаю для одного из этих процессов, довольно длинный, включая около полудюжины различных файлов журналов, один из которых (я почти уверен) является моим заблокированным файлом. Я не думаю, что есть какой-то способ определить, посмотрев на вывод lsof, какой из этих файлов может быть в «зависшем» или «заблокированном» положении? - person dvanhook; 25.08.2011
comment
netadmintools.com/html/lsof.man.html перейдите к ВЫВОДУ, затем посмотрите в FD для значений NnRrWwUuXx разные типы замков - person regilero; 25.08.2011
comment
если вы считаете ответ полезным, проголосуйте за него, и, поскольку вы задаете вопрос, проверьте зеленую разметку, чтобы принять его. - person regilero; 25.08.2011
comment
regilero - большое спасибо (еще раз), я пытался проголосовать за вас, но он говорит мне, что у меня недостаточно очков репутации для этого. Тем не менее, я думаю, что вы очень подробно ответили на этот вопрос, поэтому я отмечу это как ответ! Еще раз спасибо. - person dvanhook; 26.08.2011