Советы по оптимизации Apache2 для большого объема легких соединений - PullRequest
3 голосов
/ 11 ноября 2011

У нас есть очень легкий скрипт отслеживания, написанный на PHP, работающий на Apache / 2.2.14 (Ubuntu). Сценарий получит большое количество одновременных подключений, но каждое подключение будет быстрым. В настоящее время мы используем prefork, настроенный следующим образом:

StartServers          5
MinSpareServers       5
MaxSpareServers      10
ServerLimit         600
MaxClients          600
MaxRequestsPerChild   0

У нас также есть KeepAlive Off

Я немного поигрался с этими настройками и тестировал с апачем. Каждый раз, когда я поднимаю параллельные соединения с помощью ab, я получаю «apr_socket_recv: сброс соединения по peer (104)». Я также увеличил максимальное количество файловых дескрипторов.

Мне интересно, может ли кто-нибудь из Apache-гуру указать мне правильное направление для этого типа установки (большое количество легких соединений). Каковы оптимальные значения для StartServers, Min / MaxSpareServers и т. Д.? Стоит ли изучать MPM рабочего? Любые мысли приветствуются.

1 Ответ

4 голосов
/ 11 ноября 2011

Я могу дать вам несколько советов:

  • попробуйте использовать Apache в рабочем режиме вместо prefork. Чтобы сделать это, либо переведите PHP в режим fastcgi (php-fpm), либо рискуйте сохранить его в mod_php внутри многопоточного рабочего сервера Apache (риск состоит в том, что внешние библиотеки siome могут конфликтовать, например, настройки локали, но если ваш код отслеживания PHp маленький, вы можете контролировать, что все, что есть многопоточность включена - PHP5 без какой-либо внешней библиотеки включен многопоточность)
  • Если у вас MaxClient 600, то укажите 600 в StartServers, MinSpareServers и MaxSpareServers. иначе Apache создает новый форк на очень низкой скорости :

родительский процесс создает новых потомков с максимальной скоростью 1 в секунду.

если вы считаете, что ваш сервер может обрабатывать 600 вилок, то возьмите ОЗУ, создайте 600 вилок и, возможно, измените настройку MaxRequestsPerChild на что-то вроде 3000, чтобы иногда старые вилки удалялись и создавались заново (избегая утечки памяти). Вы не потеряете время на создание веток, и Apache не потеряет время на управление созданием и удалением дочерних элементов.

  • Отключение KeepAlive - хорошая вещь в вашем случае, как вы это сделали
  • Чтобы узнать, каково правильное значение для MaxLients, либо в режиме prefork, либо в рабочем режиме, просто протестируйте его, отследите память, используемую одним форком, и разделите количество доступной оперативной памяти на это число. Будьте осторожны, php также будет использовать некоторое ОЗУ, с mod_php это ОЗУ будет использоваться памятью Apache Fork, в php-fpm это будет происходить в процессах php-fpm, проверьте параметр memory_limit в PHP на максимальный размер одного PHP-процесса.
  • Сократите использование оперативной памяти PHP, чтобы вы могли параллельно запускать больше сценариев PHP. Не создавайте больших массивов, сохраняйте свет сессии и т. Д. Использование кода операции APC может уменьшить объем используемой памяти (а также и другие полезные вещи), используя PHP 5.3 вместо 5.2.
...