Apache не хватает памяти на
У меня VPS с 768 МБ ОЗУ и процессором 1,13 ГГц. Я использую сайт знакомств php/mysql, и у него отличная производительность, а нагрузка на сервер, как правило, очень низкая.
Иногда я размещаю рекламу на Facebook, и в часы пик я могу получить 100-150 кликов в течение нескольких секунд - это приводит к нехватке памяти на сервере:
Невозможно выделить память: не удалось создать дочерний процесс: /opt/suphp/sbin/suphp ....
И все пользователи получают ошибку 500 страниц.
Мне просто интересно, если это звучит разумно или нет - для меня 100-150, кажется, не число, которое должно вызвать Apache исчерпать память.
Любые советы / рекомендации по диагностике проблемы высоко ценятся.
4 ответа
Оптимизация занимаемой памяти обычно осуществляется путем уменьшения (и ограничения) этих факторов:
- количество одновременных процессов Apache (я бы порекомендовал перейти на prefork MPM, который более управляем в средах с ограниченным объемом памяти)
- переходя от mod_php или php_cgi к fastcgi, mod_cfgid работает отлично. Сокращение числа разрешенных порожденных php-процессов с помощью FcgidMaxProcesses и удаление длительных тайм-аутов (см. http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html).
- "многопоточность" сервера, особенно за счет сокращения неоправданно длинных тайм-аутов ((дис) тайм-аутов подключения, keepalive, ...)
Если нагрузка становится действительно большой, вам также следует обратить внимание на скорость обработки запросов (более быстрая загрузка улучшает общий размер * время памяти, необходимое для одного запроса)
- Оптимизация кода вашего сайта (улучшение кода PHP для более быстрого и / или более эффективного использования памяти)
- оптимизация выполнения PHP (xcache может ускорить процесс в несколько раз)
- Кэширование целых запросов также делает чудеса, см. mod_cache
Возможно, если ваша сеть вообще не сильно нагружает процессор, и вам нужен какой-то экстремальный Req/S, попробуйте какой-нибудь другой веб-сервер (например, nginx или lighttpd), который ведет себя лучше в таких ситуациях.
Первое, что нужно сделать, это привести в порядок вашу текущую систему. Из коробки apache обычно настраивается с большим количеством расширений, которые вам, вероятно, не нужны (в частности, для аутентификации и прокси-сервера, также если вы используете SSL, но очень редко, тогда рассмотрите возможность удаления mod_ssl и запуска stunnel вместо этого). Включите mod_deflate. Посмотрите на все остальное, что работает в вашей системе - отключите (и отключите) все ненужные вам службы.
Далее, запуск suphp на выделенной машине через CGI - это обычно очень глупая идея - используйте mod_php или fastCGI.
Ускоряя работу вашей системы, вы не только обеспечите лучшее обслуживание своих клиентов, но и сократите объем используемой памяти. Так....
Установите кэш кода операции PHP, если у вас его еще нет.
Начните копаться в производительности вашей системы - измените конфигурацию httpd, чтобы начать регистрировать%D, и посмотрите на продукт частоты URL-адресов и%D, чтобы определить, какие URL-адреса вызывают наибольшее количество проблем.
Понизьте пороговое значение в журнале медленных запросов в MySQL - используйте этот анализатор или аналогичный для анализа данных (обратите внимание, что вам снова следует расставить приоритеты на основе произведения частоты и времени выполнения).
Добавьте автоматическое добавление, чтобы включить сжатие буфера вывода gz.
Начните записывать количество запущенных процессов httpd и сравните его с доступным меньшим количеством кэша / буферов из 'free' - сопоставьте данные и составьте график их, чтобы выяснить, сколько процессов httpd вы можете разумно запустить - затем измените ваш httpd.conf, чтобы применить это предел. Обратите внимание, что дисковый ввод / вывод является феноменально медленным - поэтому вам необходим здоровый объем памяти, доступный для кэширования.
Начните выяснять, предоставляет ли ваш сервер хорошую информацию о кешировании контента, или же клиенты и прокси-серверы должны возвращаться за вещами, которые не изменились (mod_expires, mod_headers)
Но иногда вам просто нужно больше оборудования. Я бы порекомендовал рассмотреть второй сервер, а не просто обновить тот, который у вас есть - добавление циклического DNS является тривиальным - и вы получите дополнительное преимущество лучшей доступности (как только вы научитесь управлять репликацией базы данных),
Обращаться с колючим трафиком сложно. Альтернативы включают в себя: более легкий HTTP-сервер (lighttpd, nginx и др.); больше физической оперативной памяти; балансировщик нагрузки и дополнительные узлы, что обеспечивает дополнительную доступность; разгрузка кода вашего приложения в систему, отдельную от вашего HTTP-сервера, обычно посредством FastCGI; динамическое выделение вычислительных ресурсов для удовлетворения нагрузки через облачный сервис, такой как EC2; или тонны других идей, которые я забыл или не думал. Есть некоторые большие ресурсы на эту штуку там; блог http://highscalability.com/, например, охватывает большую часть этой территории. Надеюсь это поможет!
Требование к памяти для каждого экземпляра для Apache составляет около 10 МБ, хотя точный объем зависит от вашей конфигурации. Таким образом, если вы хотите обслуживать 100 одновременных соединений с Apache, вам потребуется как минимум 1 ГБ ОЗУ плюс все, что нужно системе, MySQL и всему, что вы используете.
Если вы хотите остановить условия "из-за ошибки", вы можете отрегулировать MaxClients
Параметр конфигурации Apache до соответствующего уровня. Чтобы получить оценку памяти на экземпляр Apache, посмотрите на top
выведите и вычтите столбцы RES и SHR всех команд httpd. Удостоверьтесь, что вычли всю память, необходимую MySQL и остальной части системы. Обратите внимание, что у вас может быть относительно небольшое число для MaxClients на этом компьютере (30-50).
Другие ответы дали хорошее резюме того, что вы можете сделать, чтобы улучшить количество одновременных запросов, которые вы можете обработать. Имейте в виду, что в такой бюджетной системе может быть сложно, хотя и не обязательно невозможно, установить Apache/PHP/MySQL плюс lighttpd/nginx/memcached/caching. Насколько легко или сложно будет зависеть от вашего приложения и вашей целевой производительности. Подумайте об обновлении до более крупного сервера... вы обнаружите, что все, что подходит для 2 ГБ или 4 ГБ, намного проще.