Сервер Ubuntu 10.04 задерживается когда POST к MySQL

У меня есть Сервер Ubuntu 10.04, и по некоторым причинам это всегда, кажется, показывает неустойчивую задержку, выполняя операции CRUD на базе данных MySQL. Большинство команд Сообщения выполняется в нормальной сумме миллисекунд, но когда существует задержка, которая это всегда, кажется, в течение приблизительно 4,5 секунд. Это не занятый, общедоступный сервер, таким образом, это не должен быть вопрос загрузки сервера, являющейся проблемой. Лучший способ для Вас для понимания, что я пытаюсь объяснить, состоит в том, чтобы я показал Вам. Так без дальнейшего промедления бросьте беглый взгляд на эти несколько коротких видео:

видео 1
видео 2

Кто-либо может дать мне какие-либо идеи, почему это происходит и что попытаться разрешить его?

0
задан 13 February 2013 в 23:57

1 ответ

Как я упоминал в комментариях, я не вижу причин полагать, что MySQL является узким местом, но я думаю, что конфигурация веб-сервера может вызвать это.

Установка обычной установки LAMP, выполненной, например, с помощью apt-get install lamp-server^, установит PHP в качестве модуля Apache и извлечет prefork MPM. По умолчанию это начинается только с ограниченного числа рабочих (вилок) для обработки входящих соединений. Любые новые соединения просто не будут обработаны (хотя и не отклонены). Итак, я думаю, что вы просто видите, что «пул» работников слишком мал, чтобы обрабатывать все соединения.

Ошибка, подобная этой, вероятно, будет где-то в ваших журналах ошибок Apache при достижении этого предела:

[error] server reached MaxClients setting, consider raising the MaxClients setting

Чтобы сконфигурировать MPF prefork в Apache, вы можете увидеть текущие значения в /etc/apache2/apache2.conf :

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

Чтобы изменить это, я бы рекомендовал создать новый файл в /etc/apache2/conf.d, например prefork-mpm-tuning.conf и просто «перегрузите» настройки из их значений по умолчанию (и перезапустите Apache):

<IfModule mpm_prefork_module>
    StartServers          20      # |-- important to increase
    MinSpareServers       20      # |
    MaxSpareServers       50
    MaxClients           70       # too high will get you out-of-memory here
    MaxRequestsPerChild   0
</IfModule>

Здесь важно отметить, что Apache только увеличивает масштаб в секунду, начиная только с одного (жестко запрограммировано, не настраивается) и никогда не сокращается, если вы явно не настроили его. Как объяснено в документации Apache по настройке производительности :

Если машина занята порождением детей, она не может обслуживать запросы. Но это так сильно влияет на воспринимаемую производительность Apache, что его пришлось заменить. Начиная с Apache 1.3, код ослабляет правило «одна за секунду». Он будет порождать один, ждать секунду, затем порождать два, ждать секунду, затем порождать четыре, и это будет продолжаться в геометрической прогрессии, пока он не порождает 32 ребенка в секунду. Он останавливается всякий раз, когда удовлетворяет настройке MinSpareServers.

Это кажется достаточно отзывчивым, так что почти нет необходимости вертеть ручки MinSpareServers, MaxSpareServers и StartServers. Когда в секунду появляется более 4 дочерних элементов, в ErrorLog будет отправлено сообщение. Если вы видите много этих ошибок, подумайте о настройке этих параметров. Используйте вывод mod_status в качестве руководства.

Хотя последний абзац может относиться к общим случаям, я нахожу очень запутанным при тестировании, что Apache кажется не отвечающим после перезапуска. По этой причине моя рекомендация - , чтобы повысить настройку StartServers.

Итак, подведем итог:

  • Вы, вероятно, хотите увеличить StartServers, чтобы принимать все последующие соединения, которые вы запускаете от клиентов. Prefork MPM в Apache не очень динамичный работник - для того, чтобы он работал хорошо при большом количестве одновременных подключений, вам просто нужно много запустить.
  • Разрешить ему выделять достаточно памяти (примерно 20 МБ на разветвление на практике). Да, вам понадобится куча всего этого, чтобы обслужить 100 одновременных посетителей в этом дизайне. (посмотрите на PHP-FPM, если вам нужна большая производительность с меньшим объемом памяти)
  • Ограничьте MaxClients, чтобы Apache не требовал использовать всю память сервера и вылетал. Занимайтесь здесь математикой и тестированием.
  • Установка StartServers слишком низкой для экономии памяти при сохранении большего MaxClients - это плохо: ваш сайт будет работать медленно по одной причине в секунду, а использование памяти в любом случае будет расти позже. Это произойдет тогда.

Ссылки:

0
ответ дан 13 February 2013 в 23:57

Другие вопросы по тегам:

Похожие вопросы: