我使用 APC 缓存(通过 W3 Total Cache 插件)通过 nginx/PHP5-FPM 提供 Wordpress 页面。Nginx 通过端口 9000 上的 TCP 套接字与 PHP-FPM 通信。我已通过 sysctl 将最大连接数调整为 1024。我已将 max_execution_time(在 php.ini 中)和 request_terminate_timeout(在 FPM conf 文件中)都设置为 30 秒。
时不时地(比如说每 8-10 小时,不是线性的)端口 9000 上打开的 TCP 连接数会增长到接近 1000(大部分处于 CLOSE_WAIT 状态,一些处于 FIN_WAIT、FIN_WAIT_2 状态),有时会超过 1000,我的 Web 服务器开始返回 504 错误。一旦我终止该端口上的所有 TCP 连接并重新启动 FPM,它就会再次正常工作。
我启用了慢速日志来查看发生了什么,如果我读得正确的话,它挂在 apc_store() 调用上。
这是 APC 配置错误还是我需要调整 FPM 设置?即使脚本没有发送最终终止信号,有没有办法强制终止这些 TCP 连接?
FPM 慢日志跟踪示例:
[22-Jan-2015 09:42:49] [pool www] pid 20327
script_filename = /var/www/index.php
[0x00007fdc527ec908] apc_store() /var/www/wp-content/plugins/w3-total-cache/lib/W3/Cache/Apc.php:55
[0x00007fdc527ec768] set() /var/www/wp-content/plugins/w3-total-cache/lib/W3/ObjectCache.php:254
[0x00007fdc527ec5e0] set() /var/www/wp-content/plugins/w3-total-cache/lib/W3/ObjectCache.php:300
[0x00007fdc527ec488] add() /var/www/wp-content/plugins/w3-total-cache/lib/W3/ObjectCacheBridge.php:73
[0x00007fdc527ec330] add() /var/www/wp-content/object-cache.php:94
[0x00007fdc527ec200] wp_cache_add() /var/www/wp-includes/option.php:176
[0x00007fdc527ec078] wp_load_alloptions() /var/www/wp-includes/functions.php:1272
[0x00007fdc527ebf40] is_blog_installed() /var/www/wp-includes/load.php:474
[0x00007fdc527ebdb0] wp_not_installed() /var/www/wp-settings.php:109
[0x00007fdc527ebc88] +++ dump failed
答案1
看起来您有很多TCP
连接未正确终止。基本上,这些CLOSE_WAIT
连接意味着服务器已收到 FIN 数据包,现在正在等待最大段寿命或服务器通知网络堆栈关闭套接字。这些FIN_WAIT
消息是由于“服务器”FIN
向客户端发送了 ,但客户端尚未发送(或者说,服务器尚未收到) 来FIN-ACK
确认连接已关闭。