Отключается httpd на VPS

Главные вкладки

Аватар пользователя est est 13 октября 2009 в 15:29

Всем привет!

Прошу помочь неспецу по линуксу, как впрочем и по Друпалу.
В день на сайте около 500 посещений. Время от времени вырубается апач. Пока не придумал ничего лучшего, как вручную говорить
httpd -k restart

Иногда получаю такой ответ:

root@zyq [~]# httpd -k restart
[Tue Oct 13 15:19:00 2009] [warn] NameVirtualHost *:443 has no VirtualHosts
[Tue Oct 13 15:19:00 2009] [warn] NameVirtualHost *:80 has no VirtualHosts
httpd not running, trying to start

Падение происходит, когда открываю сразу штук десять страниц сайта во вкладках (по ссылкам со страницы трекера), видимо нагрузка слишком большая. До этого хостился на шаред хостинге, но хостер разорвал со мной контракт, т.к. сайт, как он выразился, 'eats tons of memory' Smile Но зато там он не падал, а просто тормозил по-страшному. Но работал. Из этого делаю вывод, что проблема кроется в системном окружении.

Комментарии

Аватар пользователя Azerot Azerot 13 октября 2009 в 15:47

Вполне возможно, что гипервизор под которым работает ваш VPS просто убивает httpd как только он начинает жрать памяти больше, чем выделено под VPS. Если снизить количество потребляемой памяти вы не в состоянии (выключением лишних модулей в Drupal, лишних .so в httpd и т.д.) поставьте в cron скрипт, который каждую минуту будет проверять наличие запущеного httpd и запускать его если он в очередной раз сдох.

Аватар пользователя igor701 igor701 13 октября 2009 в 16:08

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

Также можно пересобрать apache, отключив ненужное.

А ещё лучше статику (картинки и html) через ngnix отдавать.

Аватар пользователя est est 13 октября 2009 в 17:47

"Azerot" wrote:
Если снизить количество потребляемой памяти вы не в состоянии (выключением лишних модулей в Drupal, лишних .so в httpd и т.д.) поставьте в cron скрипт, который каждую минуту будет проверять наличие запущеного httpd и запускать его если он в очередной раз сдох.

Не подскажете как это сделать? Или в какую сторону мануалы копать?
А сколько памяти друпал может пожрать в принципе? Я выделил под php 256 мб, а всего по тарифному плану у меня 750 мб.

"igor701" wrote:
А ещё лучше статику (картинки и html) через ngnix отдавать.

Спасибо, попробую!

Аватар пользователя mensh@drupal.org mensh@drupal.org 13 октября 2009 в 18:06

Больно уж много жрёт ваш VPS.
У меня при посещаемости в 4-5 раз большей памяти на всё уходит 250..300MB, но апач, правда, находится за nginx.
А в конфигураторе апача KeepAlive включен?
Возможно с мускулом надо поработать. Покажите my.cnf

Аватар пользователя est est 13 октября 2009 в 21:49

"<a href="mailto:mensh@drupal.org">mensh@drupal.org</a>" wrote:
Больно уж много жрёт ваш VPS.
У меня при посещаемости в 4-5 раз большей памяти на всё уходит 250..300MB, но апач, правда, находится за nginx.

Где можно почитать про это? Это вообще сложно сделать?

"<a href="mailto:mensh@drupal.org">mensh@drupal.org</a>" wrote:
А в конфигураторе апача KeepAlive включен?

Нет. А надо?
Так правильно?

KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

"<a href="mailto:mensh@drupal.org">mensh@drupal.org</a>" wrote:
Возможно с мускулом надо поработать. Покажите my.cnf

сегодня ковырялся как раз в нем.

было
max_allowed_packet = 300
изменил на 75,

было
max_connect_errors = 10
изменил на 1000

а также добавил
max_user_connections = 75

Вот сам конфиг:

[mysqld]
max_connections = 75
max_user_connections = 75
key_buffer = 16M
myisam_sort_buffer_size = 32M
join_buffer_size = 1M
read_buffer_size = 1M
sort_buffer_size = 2M
table_cache = 1024
thread_cache_size = 286
interactive_timeout = 25
wait_timeout = 1000
connect_timeout = 10
max_allowed_packet = 1M
max_connect_errors = 1000
query_cache_limit = 1M
query_cache_size = 16M
query_cache_type = 1
tmp_table_size = 16M

Аватар пользователя mensh@drupal.org mensh@drupal.org 14 октября 2009 в 14:35

Попробуйте следующее:
.htaccess

....
php_value memory_limit 128M

php.ini

...
max_execution_time = 120
max_input_time = 60
memory_limit = 128M
...

httpd.conf

...
KeepAlive On
...

my.cnf

...
key_buffer = 64M
table_cache = 512
query_cache_size = 128M

max_connections = 65 # Исправил, т.к. указал "650"
sort_buffer_size = 32M
table_cache = 512 # Неужели у вас таблиц в 2 раза больше?
thread_cache_size = 64
...

Для тонкой настройки удобно использовать tuning-primer.sh

Аватар пользователя est est 14 октября 2009 в 4:22

"<a href="mailto:mensh@drupal.org">mensh@drupal.org</a>" wrote:
Попробуйте следующее:
.htaccess
....
php_value memory_limit 128M

php.ini
...
max_execution_time = 120
max_input_time = 60
memory_limit = 128M
...

Я конечно попробую, но что-то сильно сомневаюсь, что крон запустится при таком времени...
Да и по поводу памяти у меня раньше постоянно ругался сервер... Включил, денёк погоняю.

"<a href="mailto:mensh@drupal.org">mensh@drupal.org</a>" wrote:
my.cnf
...
key_buffer = 64M
table_cache = 512
query_cache_size = 128M
max_connections = 650
sort_buffer_size = 32M
table_cache = 512 #Неужели у вас таблиц в 2 раза больше?
thread_cache_size = 64
...

Для тонкой настройки удобно использовать tuning-primer.sh


этот скрипт выдал мне такое по поводу таблиц

TABLE CACHE
Current table_cache value = 1024 tables
You have a total of 708 tables
You have 749 open tables.
The table_cache value seems to be fine

поэтому этот параметр оставил 1024

Аватар пользователя est est 14 октября 2009 в 12:19

"<a href="mailto:andypost@drupal.org">andypost@drupal.org</a>" wrote:
в включен ли какой-нить op-code кеш (apc, eaccelerator) если нет, то это первое, с чего стоит начать!

Спасибо за совет, включил eAccelerator!

Аватар пользователя est est 15 октября 2009 в 11:55

Сегодня при попытке открыть страницу со списком модулей выскочило все-таки Sad

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 12053087 bytes) in /home/est/public_html/includes/bootstrap.inc on line 741

Аватар пользователя mensh@drupal.org mensh@drupal.org 15 октября 2009 в 15:29

Возможно, что установлены цацки (Cpanel, Plesk), отъедающие значительную часть памяти.
Уменьшите max_connections до 8.
Если есть tuning-primer.sh, то смотрите, что он пишет для memory usage.

Аватар пользователя mensh@drupal.org mensh@drupal.org 15 октября 2009 в 21:46

"<a href="mailto:andypost@drupal.org">andypost@drupal.org</a>" wrote:
это ж сколько модулей нужно накидать, что 128 памяти не хватает...

"est" wrote:
You have 749 open tables.

Наворочено, конечно, изрядно, но с памятью в 750MB падать он не должен, если только память расходуется по назначению, а не на юзабельные Plesk'и.
С этой памятью в php.ini можно и 256MB прописать.

Аватар пользователя Krotty@drupal.org Krotty@drupal.org 15 октября 2009 в 22:37

"<a href="mailto:mensh@drupal.org">mensh@drupal.org</a>" wrote:
В httpd.conf вероятно установлено "150".
Это не может являться причиной падений.

Этого более чем достаточно чтобы сожрать всю доступную память при пиковой нагрузке. И утверждать при этом что система будет стабильной я бы не стал.

Аватар пользователя mensh@drupal.org mensh@drupal.org 16 октября 2009 в 11:49

"<a href="mailto:Krotty@drupal.org">Krotty@drupal.org</a>" wrote:
"mensh@drupal.org" написал(а):

В httpd.conf вероятно установлено "150".
Это не может являться причиной падений.

Этого более чем достаточно чтобы сожрать всю доступную память при пиковой нагрузке. И утверждать при этом что система будет стабильной я бы не стал.

Вы, вероятно, невнимательно прочитали, а, возможно, интерпретировали так, как вам хотелось.

Речь ведь идет о том, что при посещаемости 500 чел в сутки периодически падает апач. О каких пиковых нагрузках можно говорить? И если прописать в httpd.conf MaxClients 50 вместо умолчальных "150", то результат будет тот же.

Аватар пользователя leninsneg leninsneg 8 января 2010 в 12:52

"Azerot" wrote:
поставьте в cron скрипт, который каждую минуту будет проверять наличие запущеного httpd и запускать его если он в очередной раз сдох.

а что конкретно нужно в скрипте прописать, чтобы проверялось состояние httpd?

Аватар пользователя Azerot Azerot 9 января 2010 в 18:19

Лучше комплексно. Например командой ps с grep'ом проверяете наличие процесса апача. Далее известно что апач сохраняет PID процесса (например в /var/run/httpd.pid), так убедиться что файл такой есть, что в нём лежит PID существующего процесса апача. Далее можно добавить вызов wget с таймаутом скажем в 20 сек на главную страницу сайта и проверкой состояния после вызова. В общем много чего можно наворотить

Аватар пользователя anon anon 30 января 2010 в 2:04

"igor701" wrote:
А ещё лучше статику (картинки и html) через ngnix отдавать.

а еще лучше вообще выкинуть тормозной апач и забыть о нем как о страшном сне. но речь ведь не об этом))

"est" wrote:
Сегодня при попытке открыть страницу со списком модулей выскочило все-таки Sad

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 12053087 bytes) in /home/est/public_html/includes/bootstrap.inc on line 741

если вам не хватает 128 метров на один запрос, так и говорить не о чем
десяток запростов сожрет гигабайт. не удивительно что ваш апач киляется оом-киллером или сам валится со страху
никакие оптимизации БД и фронтенды с кешами вам не помогут. в любом случае будете вечно в свопе при десятке-другом подключений к динамике
покупайте vps с двумя гигами

Аватар пользователя anon anon 30 января 2010 в 22:16

кстати странно что никто не посоветовал такой параметр - MaxRequestsPerChild
я тоже как-то проглядел вчера
когда течет пхп(апач) стоит его изредка перезапускать. к примеру MaxRequestsPerChild 1000 будет перезапускать чайлдлы после 1000 запросов. с такой как у топикстартера нагрузкой можно хоть 100 поставить. по дефолту там стоит 10К

Аватар пользователя Azerot Azerot 30 января 2010 в 23:47

Не вижу особого резона. Если ставить 100 - слишком мало, потому что в расчёт надо брать картинки. Слишком частые убивание и создания процесса приведут к потере производительности. Смысл уменьшать данный параметр есть только в том случае, если код сайта приводит к утечкам памяти и размер серверного процесса быстро и сильно растёт - вряд ли это тот случай.

Аватар пользователя anon anon 2 февраля 2010 в 5:06

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