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