Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Настройки apache prefork MPM

Настройки apache prefork MPM

Евгений Неверов, 19 апреля 2018 года

Avatar for Evgeny E. Neverov

Evgeny E. Neverov

July 23, 2018
Tweet

More Decks by Evgeny E. Neverov

Other Decks in Programming

Transcript

  1. Multi-Processing Module • Fork — системный вызов в *nix системах,

    который делает почти полную копию оригинального процесса • Форк — относительно долгая и дорогая операция • Pre-Fork — предварительный форк
  2. Основные настройки /etc/httpd/bx/conf/prefork.conf • StartServers = 4 • MixSpareServers =

    1 • MaxSpareServers = 2 • MaxRequestWorkers = 6 • MaxConnectionsPerChild = 5000
  3. StartServers Число дочерних процессов-обработчиков, которые будут созданы сразу при запуске

    apache. В общем случае = [число ядер процессора] # cat /proc/cpuinfo | grep processor Много сделаешь — не хватит памяти и будет долго загружаться.
  4. StartServers = 12 httpd httpd httpd httpd core 0 core

    1 core 2 core 3 Чо толку? httpd httpd httpd httpd httpd httpd httpd httpd
  5. Min/MaxSpareServers Число ожидающих процессов, которые создаются при запуске apache. Они

    не обрабатывают запросы. Они приступают к обработке, если один из основных процессов умер (из-за ошибки) или был убит из-за превышения числа выполненных запросов. Много делать бессмысленно — они просто висят и жрут память. MinSpareServers = 1
 MaxSpareServers = 2
  6. MaxConnectionsPerChild Максимальное число обработанных соединений, после которого рабочий процесс обязательно

    уничтожается. На его место сразу приходит Spare-процесс (становится рабочим). Если число ожидающих процессов становится меньше MinSpareServers, они досоздаются.
  7. MaxRequestWorkers Раньше назывался MaxClients. Максимальное число дочерних процессов, которые могут

    обрабатывать запросы. В общем случае = [число ядер процессора] ServerLimit — точно такое же значение.
  8. MaxRequestWorkers Нет никакого смысла ставить его большим: 1. Не хватит

    памяти — начнёт жрать swap. 2. У вас всё равно нет столько ядер процессора.
  9. MaxRequestWorkers = 4 httpd httpd httpd httpd core 0 core

    1 core 2 core 3 idle httpd idle httpd query query query query Остальные запросы держит nginx в своей очереди
  10. MaxRequestWorkers = 12 httpd httpd httpd httpd core 0 core

    1 core 2 core 3 idle httpd idle httpd query query query query query query query query query query query query Ну и хули толку?
  11. Важный нюанс Всё-таки делать MaxRequestWorkers слишком низким тоже опасно: если

    у вас запустится несколько долгих процессов (скажем, обменов с 1С или других выгрузок), то вы можете израсходовать все доступные воркеры — тогда сайт перестанет отвечать на пользовательские запросы.
  12. И это надо не забывать, что на самом деле очередь

    к процессорным ядрам выглядит вот так: httpd httpd httpd httpd core 0 core 1 core 2 core 3 nginx nginx nginx nginx mysqld crond auditd sshd rsyslogd xinetd agetty memcached
  13. Но оно ж зависает! Если апач не отвечает, значит все

    его StartServers-ы обрабатывают долгие запросы. Долгие запросы: 1. Из-за тормозов БД: сложные запросы, блокировки таблиц, etc:
 SHOW FULL PROCESSLIST; 2. Из-за тормозов ПХП: ожидание внешних источников, формирование сложных страниц, долгие агенты, обмен с 1С, etc:
 Смотри xhprof
  14. А увеличил — и отвисло! Потому что ты, блядь, перезагрузил

    сервер и убил все тормозившие его запросы. И если проблема не в том, что сайт в целом тормозит, то следующий проблемный запрос может прийти нескоро.