我们的SOAP Web服务器在CentOS上的Apache上运行,并大量使用MySQL。 服务器需求很大 – 大多数请求都很小,只涉及两到三个MySQL查询,但是其中有很多需求 – 在高峰时间可能达到每秒几百个。 每个请求的数据stream量通常小于1Kb,通常只有几个字节。
这个硬件运行的是相当不错的,有32个内核的18个核心,而且它的处理能力非常好。 CPU使用率从来没有超过30%,物理内存消耗从未超过50%。 然而,每隔一段时间,服务器似乎就会停顿,Apache窒息而起。 这可以持续大约一分钟,然后再松开,正常的服务恢复。
我已经深入分析了这个问题,看看摊位里发生了什么。 Apache在连接上已经超越了,几乎所有这些都处于“阅读”状态。 CPU使用率下降到几乎没有什么,内存使用不会改变,networking和磁盘IO都直线下降,所以看起来像系统是完全空闲的。
在做了大量的Googlesearch之后,我被引导认为这可能是因为某些时候出现了设置 – networking连接没有被快速释放,Apache耗尽。 这就解释了为什么Apache会在一段时间后恢复正常运行,等待它们全部超时,然后进行。 做一个'netstat -an'会支持这个,因为我在TIME_WAIT中看到很多连接。 但是,我已经减less了Apacheconfiguration中的各种超时设置,并且还在sysctl.conf中使用了各种networking设置,但是没有任何东西可以解决问题。
Apache的错误日志中没有任何东西。 我试过使用'ab'来强调testingApache – 这似乎会导致间歇性失速稍微发生一些,但是这些都是我真正能够衡量的。 Apache和MySQL的最大连接数都设置为高值 – 实际的并发连接永远不会closures,除非在Apache连接超时失速的情况下。
我真的不知道还有什么可以尝试的。 任何想法或指针我可能会在这里失踪?
– 编辑 –
一些额外的观察。 当停顿发生时,我注意到ESTABLISHED状态中的连接数量大大增加,然后CLOSE_WAIT中的数字在几秒钟之后。
而且,当发生停顿时,“套接字侦听队列溢出次数”和“忽略同步到套接字套接字”的次数增加相当快。 在摊位之间,这些数字根本不会改变。
我不确定这些数字是否是摊位的原因或结果。 任何进一步的帮助将不胜感激。
我已经解决了这个问题,所以我发布了解决scheme,以防其他人遇到同样的问题。
我忽略了提到我们所有的networkingstream量都是通过HTTPS,这似乎是原因。 在一个摊位,我使用strace和pstack来查看闲置的Apache进程在做什么。 它坚持等待SSL会话caching的互斥体。
看着Apache的configuration我注意到我们有5分钟的超时启用SSLSessionCache。 禁用这个是修复。
我的猜测是会话caching已经填满了,然后Apache正在等待较旧的会话在继续之前超时。
根据Apache手册
KeepAliveTimeout指令
说明:服务器等待持续连接的后续请求的时间量语法:KeepAliveTimeout秒默认值:KeepAliveTimeout 5上下文:服务器configuration,虚拟主机状态:核心模块:核心Apache在closures前等待后续请求的秒数连接。 一旦收到请求,Timeout指令指定的超时值将被应用。 将KeepAliveTimeout设置为较高值可能会导致服务器负载过重时出现性能问题。 超时时间越长,服务器进程将被占用的空间越多。 在基于名称的虚拟主机上下文中,将使用一组NameVirtualHost中第一个定义的虚拟主机(默认主机)的值。 其他值将被忽略。
因此,在第一个(默认)主机上,我将设置我的KeepAliveTimeout 3,删除configuration中任何地方的指令的任何进一步的引用,并重新运行压力testing,以确保它是一个最大并发连接的问题。