Всем привет!
Прошу помочь неспецу по линуксу, как впрочем и по Друпалу.
В день на сайте около 500 посещений. Время от времени вырубается апач. Пока не придумал ничего лучшего, как вручную говорить
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' Но зато там он не падал, а просто тормозил по-страшному. Но работал. Из этого делаю вывод, что проблема кроется в системном окружении.
Комментарии
Вполне возможно, что гипервизор под которым работает ваш VPS просто убивает httpd как только он начинает жрать памяти больше, чем выделено под VPS. Если снизить количество потребляемой памяти вы не в состоянии (выключением лишних модулей в Drupal, лишних .so в httpd и т.д.) поставьте в cron скрипт, который каждую минуту будет проверять наличие запущеного httpd и запускать его если он в очередной раз сдох.
Думаю можно ограничить в конфиге количество одновременно работающих процессов apache, тогда выхода за пределы памяти не будет - но тогда некоторые клиенты будут долго ждать соединения.
Также можно пересобрать apache, отключив ненужное.
А ещё лучше статику (картинки и html) через ngnix отдавать.
Не подскажете как это сделать? Или в какую сторону мануалы копать?
А сколько памяти друпал может пожрать в принципе? Я выделил под php 256 мб, а всего по тарифному плану у меня 750 мб.
Спасибо, попробую!
Больно уж много жрёт ваш VPS.
У меня при посещаемости в 4-5 раз большей памяти на всё уходит 250..300MB, но апач, правда, находится за nginx.
А в конфигураторе апача KeepAlive включен?
Возможно с мускулом надо поработать. Покажите my.cnf
Где можно почитать про это? Это вообще сложно сделать?
Нет. А надо?
Так правильно?
MaxKeepAliveRequests 100
KeepAliveTimeout 5
сегодня ковырялся как раз в нем.
было
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
Попробуйте следующее:
.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
в включен ли какой-нить op-code кеш (apc, eaccelerator) если нет, то это первое, с чего стоит начать!
Я конечно попробую, но что-то сильно сомневаюсь, что крон запустится при таком времени...
Да и по поводу памяти у меня раньше постоянно ругался сервер... Включил, денёк погоняю.
этот скрипт выдал мне такое по поводу таблиц
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
Спасибо за совет, включил eAccelerator!
Сегодня при попытке открыть страницу со списком модулей выскочило все-таки
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
Возможно, что установлены цацки (Cpanel, Plesk), отъедающие значительную часть памяти.
Уменьшите max_connections до 8.
Если есть tuning-primer.sh, то смотрите, что он пишет для memory usage.
Странно что никто пока не упомянул такой важный параметр конфигурирования Apache как MaxClients.
Начините-ка оптимизацию именно с него http://2bits.com/articles/tuning-the-apache-maxclients-parameter.html
В httpd.conf вероятно установлено "150".
Это не может являться причиной падений.
это ж сколько модулей нужно накидать, что 128 памяти не хватает...
Думю дело в количестве модулей, а не в железе
Наворочено, конечно, изрядно, но с памятью в 750MB падать он не должен, если только память расходуется по назначению, а не на юзабельные Plesk'и.
С этой памятью в php.ini можно и 256MB прописать.
Этого более чем достаточно чтобы сожрать всю доступную память при пиковой нагрузке. И утверждать при этом что система будет стабильной я бы не стал.
Вы, вероятно, невнимательно прочитали, а, возможно, интерпретировали так, как вам хотелось.
Речь ведь идет о том, что при посещаемости 500 чел в сутки периодически падает апач. О каких пиковых нагрузках можно говорить? И если прописать в httpd.conf
MaxClients 50
вместо умолчальных "150", то результат будет тот же.а что конкретно нужно в скрипте прописать, чтобы проверялось состояние httpd?
Лучше комплексно. Например командой ps с grep'ом проверяете наличие процесса апача. Далее известно что апач сохраняет PID процесса (например в /var/run/httpd.pid), так убедиться что файл такой есть, что в нём лежит PID существующего процесса апача. Далее можно добавить вызов wget с таймаутом скажем в 20 сек на главную страницу сайта и проверкой состояния после вызова. В общем много чего можно наворотить
а еще лучше вообще выкинуть тормозной апач и забыть о нем как о страшном сне. но речь ведь не об этом))
если вам не хватает 128 метров на один запрос, так и говорить не о чем
десяток запростов сожрет гигабайт. не удивительно что ваш апач киляется оом-киллером или сам валится со страху
никакие оптимизации БД и фронтенды с кешами вам не помогут. в любом случае будете вечно в свопе при десятке-другом подключений к динамике
покупайте vps с двумя гигами
Топикстартер, как дела-то? Помошло что-либо из того, что подсказали?
кстати странно что никто не посоветовал такой параметр - MaxRequestsPerChild
я тоже как-то проглядел вчера
когда течет пхп(апач) стоит его изредка перезапускать. к примеру MaxRequestsPerChild 1000 будет перезапускать чайлдлы после 1000 запросов. с такой как у топикстартера нагрузкой можно хоть 100 поставить. по дефолту там стоит 10К
Не вижу особого резона. Если ставить 100 - слишком мало, потому что в расчёт надо брать картинки. Слишком частые убивание и создания процесса приведут к потере производительности. Смысл уменьшать данный параметр есть только в том случае, если код сайта приводит к утечкам памяти и размер серверного процесса быстро и сильно растёт - вряд ли это тот случай.
Azerot да, что-то я ерунду ляпнул. я тот пост писал под конец рабочего дня и по видимому мыслил уже "не так". здесь утечек вроде не наблюдается, а банально не хватает озу...