У меня есть Сервер Ubuntu 10.04, и по некоторым причинам это всегда, кажется, показывает неустойчивую задержку, выполняя операции CRUD на базе данных MySQL. Большинство команд Сообщения выполняется в нормальной сумме миллисекунд, но когда существует задержка, которая это всегда, кажется, в течение приблизительно 4,5 секунд. Это не занятый, общедоступный сервер, таким образом, это не должен быть вопрос загрузки сервера, являющейся проблемой. Лучший способ для Вас для понимания, что я пытаюсь объяснить, состоит в том, чтобы я показал Вам. Так без дальнейшего промедления бросьте беглый взгляд на эти несколько коротких видео:
Кто-либо может дать мне какие-либо идеи, почему это происходит и что попытаться разрешить его?
Как я упоминал в комментариях, я не вижу причин полагать, что 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 не очень динамичный работник - для того, чтобы он работал хорошо при большом количестве одновременных подключений, вам просто нужно много запустить. MaxClients
, чтобы Apache не требовал использовать всю память сервера и вылетал. Занимайтесь здесь математикой и тестированием. StartServers
слишком низкой для экономии памяти при сохранении большего MaxClients
- это плохо: ваш сайт будет работать медленно по одной причине в секунду, а использование памяти в любом случае будет расти позже. Это произойдет тогда. Ссылки: