У меня есть веб-сайт, который работает на VPS с прошлой недели. С понедельника по субботу все идет гладко. У веб-сайта около 4500 уникальных посетителей в день, средняя загрузка и время ответа в порядке.
В воскресенье сайт посещают около 11.000 уникальных посетителей, потому что в этот день мы предлагаем уникальный и эксклюзивный контент. Контент хранится в базе данных MySQL, которая работает на другом VPS-сервере и использует движок InnoDB. Здесь дела идут не так. Из-за увеличения количества посетителей средняя нагрузка вырастет до предела, пока веб-сайт не станет недоступен.
Вот верхний результат:
This is an automated message notifying you that the 5 minute load average on your system is 238.37.
This has exceeded the 10 threshold.
One Minute - 237.31
Five Minutes - 238.37
Fifteen Minutes - 231.1
top - 16:41:12 up 5 days, 18:51, 1 user, load average: 238.68, 238.62, 231.25
Tasks: 517 total, 246 running, 271 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.8%us, 0.3%sy, 0.0%ni, 97.6%id, 0.0%wa, 0.0%hi, 0.1%si, 0.2%st
Mem: 3922920k total, 3542968k used, 379952k free, 2736k buffers
Swap: 1048564k total, 105316k used, 943248k free, 142772k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
14395 apache 20 0 313m 13m 4044 R 2.8 0.4 0:09.81 /usr/sbin/httpd -k start -DSSL
13405 apache 20 0 314m 15m 4432 R 2.3 0.4 0:17.87 /usr/sbin/httpd -k start -DSSL
15865 apache 20 0 312m 13m 4176 R 2.3 0.4 0:01.28 /usr/sbin/httpd -k start -DSSL
15930 apache 20 0 310m 11m 4060 R 2.3 0.3 0:00.88 /usr/sbin/httpd -k start -DSSL
15978 apache 20 0 310m 11m 4048 R 2.3 0.3 0:01.08 /usr/sbin/httpd -k start -DSSL
16041 apache 20 0 309m 10m 4052 R 2.1 0.3 0:00.58 /usr/sbin/httpd -k start -DSSL
16082 apache 20 0 211m 4192 2276 R 1.9 0.1 0:00.09 /usr/sbin/httpd -k start -DSSL
14298 apache 20 0 310m 11m 4044 R 0.6 0.3 0:09.56 /usr/sbin/httpd -k start -DSSL
14457 apache 20 0 311m 11m 4068 R 0.6 0.3 0:10.18 /usr/sbin/httpd -k start -DSSL
14486 apache 20 0 310m 11m 4464 R 0.6 0.3 0:06.13 /usr/sbin/httpd -k start -DSSL
15287 apache 20 0 313m 14m 4048 R 0.6 0.4 0:05.21 /usr/sbin/httpd -k start -DSSL
15363 apache 20 0 310m 11m 4064 R 0.6 0.3 0:04.13 /usr/sbin/httpd -k start -DSSL
15400 apache 20 0 313m 13m 4048 R 0.6 0.4 0:04.09 /usr/sbin/httpd -k start -DSSL
15404 apache 20 0 310m 11m 4056 R 0.6 0.3 0:04.22 /usr/sbin/httpd -k start -DSSL
15649 apache 20 0 313m 14m 4432 R 0.6 0.4 0:02.88 /usr/sbin/httpd -k start -DSSL
15675 apache 20 0 310m 10m 4044 S 0.6 0.3 0:02.22 /usr/sbin/httpd -k start -DSSL
15692 apache 20 0 310m 11m 4084 R 0.6 0.3 0:01.46 /usr/sbin/httpd -k start -DSSL
15702 apache 20 0 311m 12m 4044 R 0.6 0.3 0:01.85 /usr/sbin/httpd -k start -DSSL
15719 apache 20 0 310m 10m 4048 R 0.6 0.3 0:02.32 /usr/sbin/httpd -k start -DSSL
15781 apache 20 0 318m 18m 4044 R 0.6 0.5 0:01.91 /usr/sbin/httpd -k start -DSSL
15788 apache 20 0 312m 13m 4048 R 0.6 0.4 0:02.13 /usr/sbin/httpd -k start -DSSL
15823 apache 20 0 310m 11m 4060 R 0.6 0.3 0:02.04 /usr/sbin/httpd -k start -DSSL
15837 apache 20 0 311m 12m 4052 R 0.6 0.3 0:01.64 /usr/sbin/httpd -k start -DSSL
В воскресенье веб-сайт должен выполнить довольно большой запрос с парой левых объединений в разных таблицах.
Веб-сайт работает на VPS, содержащем 2 процессора 2,4 ГГц и 4 ГБ оперативной памяти. База данных работает на SSD VPS, содержащем 2 процессора 2,4 ГГц и оперативную память 2 ГБ.
В конкретное воскресенье я также получил это сообщение в ErrorLog сервера:
Sun Nov 24 15:03:34 2013] [error] server reached MaxClients setting, consider raising the MaxClients setting
Сайт создан с использованием фреймворка PHP Codeigniter и нормально работал первые 8 недель на общем хостинге (с тем же кодом). После этих недель проблема началась, поэтому я решил перейти на VPS-сервер. Но проблема, похоже, не исчезла.
Я понятия не имею, где что-то идет не так, поэтому он будет очень признателен за любую помощь.
MaxClients - это директива сервера Apache. Есть несколько связанных директив, но все они по-разному связаны с установкой ограничения на обработку запросов Apache.
Причина в том, чтобы не позволить Apache потреблять столько ресурсов, чтобы это могло угрожать общей стабильности системы. Поэтому, если вы увеличиваете MaxClients и другие подобные директивы, необходимо следить за системными ресурсами, такими как RAM.
Подробнее здесь: Директива MaxClients
Но для начала неясно, в чем именно заключается проблема, даже если вы заметили какие-то симптомы (очевидно, иначе вы бы не публиковали). Возможно, Apache показывает вам проблему, которая кроется в другом месте.
Но в выводе вы сосредотачиваетесь на Apache, поскольку эта часть довольно проста, поэтому давайте начнем с нее.
Как вы читаете по ссылке, MaxClients определяют максимальное количество запросов, которые обслуживает httpd. Когда он заполняется, запросы ставятся в очередь в ListenBackLog. Когда он заполнен, клиенты отклоняются.
Либо maxclients переполнились из-за большого количества одновременных запросов. Затем вам нужно предусмотреть то, что относительно легко. Увеличивайте и / или уменьшайте масштаб на уровне Apache, пока вы не будете в безопасности, или пока уровень db не достигнет максимума.
Или maxclients заполнились, потому что их нельзя было обслужить достаточно быстро из-за нижележащих слоев. Поэтому запросы накапливались в Apache до тех пор, пока больше не принимались. Это не так-то просто решить, так как прежде всего возникает множество вопросов. Вы мгновенно сосредотачиваетесь на уровне базы данных, вероятно, не зря, даже если вы еще не сделали это полностью (пока).
Также в ваших интересах узнать, были ли отклонены клиенты, сколько и т. Д. Если вы загрузите коды состояния страниц в свои журналы, вы можете проанализировать ... 503 Я, кажется, припоминаю, но вы должны проверить меня в Google по этому поводу. Это просто для того, чтобы узнать о доставке и установить базовый уровень для сравнения в следующий раз, когда это произойдет.
Вот несколько вопросов, которые приходят в голову. Я понимаю, что могу найти ответы. легче сказать, чем сделать, если у вас нет инструментов, которые дадут вам высшую проницательность. Мы используем Dynatrace (ориентированный на java), который очень дорог, но может дать ответ на такие вопросы за считанные минуты и вплоть до уровня компонентов кода, даже для системного администратора. Это ускоряет процедуру выявления причинно-следственной связи в коде, инфраструктуре или в сочетании. Я знаю, что на рынке есть другие инструменты и, возможно, альтернативы с открытым исходным кодом, которые делают это. У меня просто нет опыта работы с ними. Я думаю, что можно кодировать отладку и журнал приложений тоже самое, просто на это уходит намного больше рабочего времени.
Потребовалось ли больше времени для обслуживания запросов во время нарастания описанной вами ошибки? Мои Apachelogs показывают мне, сколько времени потребовалось для обслуживания каждого запроса. Я не могу вспомнить, по умолчанию это или нет, но могу опубликовать такую директиву в начале недели, если у вас ее нет.
Если они занимали больше времени, то это было из-за разных шаблонов запросов или просто из-за большего количества?
Что касается загрузки сервера Apache, вы обслуживаете много статического контента или он в основном динамический? Вы как-то определили статическое или просто динамическое? Вопрос актуален, поскольку статический контент может быть разделен как на разные серверы доставки, так и на кеш RAM (Varnish упоминался в другом ответе). В некоторых случаях экономия может быть значительной, в других - нет.
Есть ли много запросов на (по существу) один и тот же динамический контент, или он пересчитывается однозначно для каждого запроса? Другими словами, можно ли внедрить ранний уровень кэширования, чтобы поймать определенный динамический контент?
Если заглянуть глубже, тяжело ли обрабатывается код? Можно ли определить это, используя запросы, которые в основном запускают логику, но относительно мало обращаются к базе данных? Может быть, это код, который нужно оптимизировать или увеличить / уменьшить?
Оптимизированы или расточительны обращения к базе данных как по количеству, так и по формулировке запросов? Какое время отклика было на каждый звонок во время большой нагрузки? Увеличилось ли время ответа? Достигло ли количество звонков большого количества звонков?
Вы видите, куда он движется все ближе и ближе к базе данных, на каждом уровне, глядя на возможности для оптимизации, кэширования, распределения (масштабирование), чистой мощности (масштабирование).
Может быть, у вас уже есть все эти ответы, и вы совершенно правы, сосредоточившись на innodb, я не мог сказать с предоставленной информацией! Все, что я могу предоставить, это методические вопросы, которые могут быть актуальными или нет, и которые могут вызывать у вас звонки или нет :-)
Но быстро исключить Apache из этого уравнения кажется хорошей идеей (поскольку он может просто понести сопутствующий ущерб). Если вы действительно можете убедиться, что Apache не является основной причиной, сосредоточьтесь на приложении, а затем на том, как оно использует базу данных.
Базовая статистика, такая как сетевой io, потребление оперативной памяти, потребление ЦП, дисковое io, сбои страниц и т. Д. Для задействованных машин, также может быть полезна для изучения.
ответ на ваш вопрос - максимально увеличить кэширование памяти. то есть memcache, varnish и т.д ....... а затем используйте nginx, который вы можете масштабировать по горизонтали, а за ним - пул php-fpm, размер которого соответствует вашей нагрузке, полностью связанный с блоками upsream nginx.
как только вы достигнете определенного уровня трафика, проблема будет связана не столько с использованием оборудования, сколько с использованием кеширования и наличия отдельных уровней, которые можно обновлять / обновлять индивидуально.
у вас не может быть сайта сверхвысокой доступности на одном vps, если только его статический html, да еще и лак, не идеален.
получите пару балансировщиков нагрузки внешнего интерфейса haproxy, распределяя их по varnish, извлекая из nginx / php / memcache / redis / mysql (postgres) ..... вот и все в двух словах: P