Apache httpd обрабатывает и PHP не хватает памяти
У меня есть VPS, работающий с apache-php-mysql на centos, и один установленный сайт drupal. VPS имеет 256 МБ оперативной памяти (может быть основной причиной всех моих проблем... может быть, мне просто нужно больше). Всякий раз, когда я пытаюсь открыть свой веб-сайт сразу из нескольких вкладок браузера (около 8... а не 800), происходит сбой apache! У меня есть это в журнале:
[Ср 24 окт. 11:26:31 2012] [ошибка] [клиент xxx] Неустранимая ошибка PHP: Недостаточно памяти (выделено 28049408) (попытка выделить 201335 байт) в xxx в строке 2139, реферер: xxx
Я прочитал много много постов здесь, но я думаю, что есть кое-что фундаментальное, что я упускаю - если я правильно понимаю, некоторый php-скрипт пытался выделить 200 КБ после выделения 28 МБ, и не может это сделать.
Первый вопрос: должно ли это привести к краху apache???
Затем я попытался посмотреть на команду "top", пока я выполняю свой маленький тест. Действительно, я вижу 7 httpd процессов, каждый из которых резервирует около 30 МБ - что объясняет, почему у меня заканчивается ОЗУ.
Как я могу предотвратить создание новых процессов в Apache до тех пор, пока в нем не останется памяти?
Я попытался настроить /etc/httpd/conf/httpd.conf следующим образом:
<IfModule prefork.c>
StartServers 1
MinSpareServers 1
MaxSpareServers 1
ServerLimit 1
MaxClients 1
MaxRequestsPerChild 100
</IfModule>
Но получил точно такой же результат!
Что мне не хватает?
Большое спасибо!
Обновить:
Мой PHP memory_limit равен 128M (подтверждается страницами администрирования drupal...) Вывод free -m:
total used free shared buffers cached
Mem: 256 226 29 0 0 0
-/+ buffers/cache: 226 29
Swap: 0 0 0
Что я могу сделать, чтобы apache занимал меньше памяти? Не могу ли я сохранить память за счет более медленных ответов?
1 ответ
В зависимости от вашей версии Drupal: ядро Drupal 6 требует, чтобы PHP memory_limit был не менее 16 МБ. Ядро Drupal 7 требует 32 МБ.
Исходя из ошибки и вашего сообщения, вы выделили 28 МБ, пожалуйста, подтвердите в файле php.ini, что memory_limit установлен правильно. Обязательно перезапустите Apache, чтобы применить любые изменения в php.ini.
Еще один аспект, который следует учитывать, - это другие службы, работающие на вашем сервере, Apache, MySQL и т. Д. Они также занимают 256 МБ.
To get an idea on the current memory usage you can type:
free -m
The -m flag outputs the data in MB. The -b switch displays the amount of memory in bytes; the -k switch (set by default) displays it in kilobytes.
Вы получите вывод как:
total used free shared buffers cached
Mem: 24031 22512 1518 0 1614 8082
-/+ buffers/cache: 12815 11215
Swap: 31999 485 31514
В зависимости от доступной памяти вы можете начать сужать проблему либо до PHP, либо, если вы переросли / увеличили VPS.
РЕДАКТИРОВАТЬ
@Ofri,
Конфигурации Apache нет точных данных. Все сводится к знанию спецификаций машины и в основном проб и ошибок. Мониторинг производительности сервера во время текущих проб и периодов ошибок важен, чтобы вы могли видеть положительное / отрицательное влияние.
Я бы остановил Apache, отредактировал httpd.conf в соответствии со значениями ниже и посмотрел, как ведет себя сервер:
- MaxKeepAliveRequests 100
- KeepAliveTimeout 15
- MinSpareServers 5
- MaxSpareServers 10
- StartServers 5
- MaxClients 150
- MaxRequestsPerChild 300
Имейте в виду, что Drupal - системная проблема, и в конечном итоге вы можете в конечном итоге обновить VPS до 512 МБ.
-Brendan