确定哪个进程没有清理信号量

确定哪个进程没有清理信号量

我遇到了一个常见问题,即由于锁定的信号量过多而无法重新启动 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扩展或与之相关的内容,因为配置扩展和问题开始发生之间存在时间关系。我有能力回滚,但只是想学习如何深入调试,甚至可能为错误提交补丁。

相关内容