Monit часто перезапускает apache2, основываясь на тесте totalmem> 200m в моем разделе apache2. Я не уверен, что у меня действительно есть проблема, или мне следует увеличить тест totalmem в моей конфигурации monit.
Эта конфигурация была прекрасна, пока мы не добавили второй сайт wordpress, когда apache2 начал запускать условие monit totalmem> 200m. Прежде чем я начну рассматривать конструкцию второго сайта WordPress, я хотел бы понять, не следует ли мне просто увеличить предел totalmem в тесте monit и двигаться дальше.
Моя статья monit для сервера apache2 была скопирована из руководства по установке monit. Я счел это разумным значением для начала и решил, что определю конкретное значение для моего конкретного сервера, если столкнусь с проблемами памяти apache. Что ж, теперь я затронул проблему, и выяснить, каким должно быть это значение, оказалось сложнее, чем я ожидал. Я не нашел ничего, что подсказывало бы мне, каким должно быть это значение для конкретной конфигурации сервера.
Хост - это VPS, на котором запущен сервер Ubuntu 10.04LTS. Apache2 запускает приложение для опроса (mod_php5), две отдельные установки WordPress (mod_php5) и форк Redmine (mod_passenger). Мы начали настраивать webdav для обмена файлами внутри компании, но фактически не используем его. [ПРИМЕЧАНИЕ: (сейчас) я знаю, что могу сэкономить память, переключившись на REE вместо использования ruby1.8.]
Сервер получает чрезвычайно низкий трафик - ~ 20 просмотров страниц в час для всех приложений, за исключением ботов и случайного хакерского обнюхивания, и в обозримом будущем вряд ли превысит 1000 просмотров страниц в час. Вот подробности:
$ free -m total used free shared buffers cached Mem: 496 354 142 0 39 100 -/+ buffers/cache: 214 282 Swap: 1023 6 1017
top - 17:36:27 up 34 days, 2:23, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 69 total, 1 running, 68 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 508272k total, 362944k used, 145328k free, 40448k buffers Swap: 1048572k total, 6284k used, 1042288k free, 103028k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 15257 www-data 20 0 228m 37m 4472 S 0 7.5 0:01.20 apache2 15258 www-data 20 0 225m 34m 4580 S 0 6.9 0:00.76 apache2 14680 www-data 20 0 224m 33m 4560 S 0 6.7 0:00.79 apache2 19146 www-data 20 0 222m 33m 3900 S 0 6.7 0:00.75 apache2 15255 www-data 20 0 222m 32m 3780 S 2 6.6 0:00.60 apache2 19733 mysql 20 0 160m 31m 6396 S 0 6.4 0:00.34 mysqld 9379 root 20 0 199m 12m 7368 S 0 2.6 0:43.30 apache2 10289 root 20 0 46500 9680 1516 S 0 1.9 7:23.87 ruby1.8 10292 nobody 20 0 72376 3656 2888 S 0 0.7 0:00.66 PassengerLoggin 19385 root 20 0 81348 3552 2680 S 0 0.7 0:00.04 sshd 19401 hostexsa 20 0 19556 2256 1592 S 0 0.4 0:00.10 bash 10287 root 20 0 97808 2164 1896 S 0 0.4 0:02.19 PassengerHelper 10282 root 20 0 23512 1908 1648 S 0 0.4 0:00.01 PassengerWatchd 25370 root 20 0 105m 1876 1260 S 0 0.4 3:58.88 monit 19400 hostexsa 20 0 81348 1784 912 S 0 0.4 0:00.25 sshd 3616 root 20 0 245m 1700 1152 S 0 0.3 0:00.21 console-kit-dae 19926 hostexsa 20 0 19248 1220 932 R 0 0.2 0:00.05 top
:/etc/monit/conf.d $ cat apache2.conf check process apache2 with pidfile /var/run/apache2.pid start program = "/etc/init.d/apache2 start" with timeout 20 seconds stop program = "/etc/init.d/apache2 stop" if cpu is greater than 60% for 2 cycles then restart if cpu > 80% for 5 cycles then restart if totalmem > 200.0 MB for 5 cycles then restart if children > 250 then restart if loadavg(5min) greater than 10 for 8 cycles then stop if 3 restarts within 5 cycles then timeout if failed host sub.example.net port 80 protocol http and request "/monit/token" then restart group server
$ /usr/sbin/apache2 -v Server version: Apache/2.2.14 (Ubuntu) Server built: Nov 18 2010 21:19:09 /etc/apache2/mods-enabled$ ls alias.conf autoindex.load env.load reqtimeout.conf alias.load cgi.load mime.conf reqtimeout.load auth_basic.load dav_fs.conf mime.load rewrite.load authn_file.load dav_fs.load negotiation.conf setenvif.conf authz_default.load dav.load negotiation.load setenvif.load authz_groupfile.load deflate.conf passenger.conf status.conf authz_host.load deflate.load passenger.load status.load authz_user.load dir.conf php5.conf autoindex.conf dir.load php5.load
Из моего apache2.conf:
KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 10 StartServers 1 MinSpareServers 1 MaxSpareServers 5 MaxClients 50 MaxRequestsPerChild 5000
:/etc/mysql/conf.d$ cat mysqld_small_footprint.cnf allowed_packet = 1M thread_stack = 64K table_cache = 4 sort_buffer = 64K net_buffer_length = 2K skip-innodb
ОБНОВИТЬ
Только что нашел следующее руководство в этой статье о базовой настройке сервера Apache Он предлагает именно то руководство, которое я искал. Например:
Для достижения оптимальной производительности вам нужно настроить параметр Apache MaxClients таким образом, чтобы Apache мог использовать не более 70% доступной физической памяти. Чем выше, тем выше риск того, что приставка начнет сильно погружаться в пространство подкачки, что резко увеличит время ожидания ввода-вывода и процессора и может легко привести к падению сервера на колени.
Само по себе использование более 200 МБ ОЗУ не обязательно является проблемой для вашего сервера apache. Но я думаю, что нужно просто разобраться, что приемлемо для ваш настроить.
Если на этом VPS больше ничего нет, я думаю, можно безопасно разрешить apache более 200M в качестве верхнего предела.
Если у вас есть время и ноу-хау, вы, безусловно, можете найти способы снизить это число, но для вас может быть более эффективным просто поднять порог мониторинга и не допускать его повторного запуска. Насколько вам известно, он может стабилизироваться при использовании 201 МБ, верно (маловероятно, но вы понимаете мою точку зрения).
Если бы я был на вашем месте, я бы не считал приемлемым перезапускать apache время от времени ... стабильность желательна ... больше, чем произвольный объем свободной оперативной памяти, доступной на сервере.