Назад | Перейти на главную страницу

Определение того, какой процесс не очищает семафоры

У меня была обычная проблема, заключающаяся в невозможности перезапустить httpd из-за большого количества заблокированных семафоров. После очистки и перезапуска httpd я также удвоил семафоры.

Однако я полагаю, что в каком-то процессе Apache есть утечка памяти, и он не освобождает их, поэтому я все равно столкнусь с проблемой, но позже.

пример ipcs -s:


------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x00000000 13467648   apache     600        1         
0x00000000 13697025   apache     600        1         
0x00000000 13729794   apache     600        1         
0x00000000 13762563   apache     600        1         
0x00000000 13795332   apache     600        1         
0x00000000 14057477   apache     600        1         
0x00000000 14123014   apache     600        1         
0x00000000 14155783   apache     600        1         
0x00000000 14188552   apache     600        1         
0x00000000 14221321   apache     600        1         
0x00000000 14254090   apache     600        1         

Итак, давайте проследим, какой процесс управлял этими ipcs -s -i 13697025:

Semaphore Array semid=13697025
uid=48   gid=48  cuid=0  cgid=0
mode=0600, access_perms=0600
nsems = 1
otime = Not set                   
ctime = Thu Jul 11 03:41:01 2019  
semnum     value      ncount     zcount     pid       
0          1          0          0          18395

И напоследок что соответствует pid ps --pid 18395:

  PID TTY          TIME CMD

Правильно ли я прочитал: второй семафор в списке принадлежит процессу, который уже умер и не очистился?

Например, выполнение процесса со вторым последним в списке показывает, что он действительно принадлежит запущенному процессу:

  PID TTY          TIME CMD
22331 ?        00:03:42 httpd

Очевидно, что они принадлежат Apache, но как лучше всего устранить причину этого? У нас есть более 50 виртуальных хостов, есть ли способ зарегистрировать фактический запрос сервера и отследить его до порожденного процесса и т. Д.?

У меня есть основания полагать, что это php-sqlsrv.x86_64 расширение или что-то связанное с ним из-за временного соотношения между тем, когда это было настроено, и тем, когда возникла проблема. У меня есть возможность откатиться, но я просто хочу узнать, как углубиться в отладку, возможно, даже отправить исправление для ошибки.