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

TCP-соединения PHP-FPM не завершаются вовремя

Я обслуживаю страницы Wordpress через nginx / PHP5-FPM с использованием кеширования APC (через плагин W3 Total Cache). Nginx взаимодействует с PHP-FPM через сокеты TCP на порту 9000. Я настроил максимальное количество подключений через sysctl на 1024. Я установил max_execution_time (в php.ini) и request_terminate_timeout (в файле conf FPM) на 30. секунд.

Время от времени (скажем, каждые 8-10 часов, а не линейно) количество открытых TCP-соединений на порту 9000 растет почти до 1000 (в основном в состоянии CLOSE_WAIT, некоторые FIN_WAIT, FIN_WAIT_2), иногда превышая 1000, и мой веб-сервер запускается возвращает 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

Похоже, у вас много TCP соединения, которые не завершаются правильно. В основном CLOSE_WAIT Connections означает, что сервер получил пакет FIN и теперь ожидает либо максимального срока жизни сегмента, либо сервера, чтобы сообщить сетевому стеку о закрытии сокета. В FIN_WAIT сообщения связаны с тем, что "сервер" отправил FIN клиенту, но клиент еще не отправил (или, скорее, сервер не получил) FIN-ACK чтобы подтвердить, что соединение закрыто.