Средняя загрузка системы чрезвычайно высока
У меня есть сайт, который работает на VPS с прошлой недели. С понедельника до субботы все идет гладко. Веб-сайт посещает около 4.500 уникальных посетителей в день, а средняя нагрузка и время ответа в порядке.
В воскресенье на сайте около 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 x 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-сервер. Но проблема, кажется, продолжается.
Я понятия не имею, где все идет не так, поэтому любую помощь он высоко оценил бы.
2 ответа
MaxClients - это директива сервера Apache. Есть несколько связанных директив, но все они по-разному касаются установки ограничения на обработку запросов Apache.
Мотивом для этого является то, что Apache не потребляет так много ресурсов, чтобы поставить под угрозу общую стабильность системы. Поэтому, если вы увеличиваете MaxClients и другие подобные директивы, необходимо следить за системными ресурсами, такими как ОЗУ.
Узнайте больше здесь: Директива MaxClients
Но для начала, неясно, где именно проблема, даже если вы заметили некоторые симптомы (очевидно, или вы не будете публиковать). Возможно, Apache показывает вам проблему, которая лежит в другом месте.
Но в выводе вы сосредоточены на Apache, поскольку эта часть довольно проста, поэтому давайте начнем с нее.
Как вы прочитали в ссылке, MaxClients определяют максимальное количество запросов, которые выполняет httpd. Когда это заполняется, запросы помещаются в очередь в ListenBackLog. Когда это заполнено, клиенты отклоняются.
Либо maxclients заполнен, потому что количество одновременных запросов было так много. Тогда вам нужно обеспечить то, что относительно легко. Увеличивайте и / или уменьшайте в слое Apache, пока не окажетесь на безопасной стороне, или пока уровень db не достигнет максимума.
Или maxclients заполнены, потому что они не могут быть поданы достаточно быстро из-за нижележащих слоев. Поэтому запросы накапливались в Apache, пока больше не были приняты. Это не так легко решить, поскольку в первую очередь возникает множество вопросов. Вы мгновенно сосредотачиваетесь на слое базы данных, вероятно, по уважительной причине, даже если вы еще не сделали это полностью ясно (пока).
Также было бы интересно узнать, были ли отклонены клиенты, сколько и т. Д. Если вы добавляете коды статуса страницы в свои журналы, вы можете проанализировать...503 Я помню, но вам следует проверить это на Google. Это просто для того, чтобы узнать о вашей доставке и установить базовый уровень для сравнения со следующим случаем.
Вот несколько вопросов, которые приходят на ум. Я понимаю, найти ответы. легче сказать, чем сделать, если у вас нет инструментов, которые дают вам высшее понимание. Мы используем Dynatrace (Java-ориентированный), который очень дорогой, но может дать ответы на такие вопросы в считанные минуты и вплоть до уровня компонентов в коде, даже для системного администратора. Это делает процедуру быстрой определения причинно-следственной связи в коде, инфраструктуре или в комбинации. Я знаю, что на рынке есть другие инструменты и, возможно, альтернативы с открытым исходным кодом, которые делают это. У меня просто нет опыта работы с ними. Я полагаю, что можно отлаживать и отладку кода, и приложения, тоже самое, просто дело в том, что это отнимает гораздо больше рабочего времени.
Потребовалось ли больше времени на обработку запросов при обработке к описанной вами ошибке? Мои Apachelogs показывают мне, сколько времени потребовалось для обслуживания каждого запроса. Я не могу вспомнить, по умолчанию это или нет, но могу опубликовать такую директиву в начале недели, если у вас ее нет.
Если они заняли больше времени, было ли это из-за разных шаблонов запросов или просто из-за больших чисел?
С точки зрения нагрузки на сервер Apache, вы обслуживаете много статического контента или он в основном динамический? Вы как-то описали только статические и просто динамические? Этот вопрос актуален, поскольку статический контент может быть разделен как на разные серверы доставки, так и на кэш-память RAM (Varnish упоминался в другом ответе). В некоторых случаях экономия может быть значительной, в других - нет.
Много ли запросов для (по существу) одного и того же динамического содержимого или он уникально пересчитывается для каждого запроса? Другими словами, возможно ли внедрить ранний уровень кэширования для захвата определенного динамического содержимого?
Если посмотреть глубже, то тяжел ли код при его обработке? Можно ли исходить из того, что используются запросы, которые в основном вызывают логику, но относительно мало обращений к базе данных? Возможно, это код, который нужно оптимизировать или увеличить / уменьшить?
Оптимизированы или бесполезны вызовы базы данных как по количеству, так и по тому, как формулируются запросы? Каково было время ответа на каждый звонок во время большой нагрузки? Время отклика увеличилось? Количество звонков достигло больших объемов?
Вы видите, куда она направляется все ближе и ближе к базе данных, на каждом слое, рассматривая возможности оптимизации, кэширования, распределения (масштабирования), сырой мощности (масштабирования).
Может быть, у вас уже есть все эти ответы, и вы абсолютно правы в том, чтобы сосредоточиться на innodb, я не могу сказать с предоставленной информацией! Все, что я могу предоставить, это методические вопросы, которые могут быть актуальны или нет, и которые могут звонить в колокола или нет:-)
Но вывести Apache из уравнения быстро кажется хорошей идеей (поскольку он может просто понести сопутствующий ущерб). Если вы действительно можете убедиться, что Apache не является основной причиной, сфокусируйтесь на приложении и на том, как оно использует базу данных.
Основные статистические данные, такие как сетевой ввод, потребление оперативной памяти, потребление ресурсов процессора, дисковый ввод-вывод, сбои страниц и т. Д. Для участвующих машин также могут быть полезны для изучения.
Ответом на ваш вопрос является кэширование памяти рычага в максимально возможной степени. то есть memcache, varnish и т. д., а затем используйте nginx, который можно масштабировать по горизонтали, а за ним пул php-fpm, соответствующий размеру вашей нагрузки, полностью объединенный с блоками upsream nginx.
как только вы достигаете определенного уровня трафика, это не столько бросает аппаратное обеспечение в проблему, сколько использует кеширование и имеет отдельные уровни, которые можно обновлять / обновлять по отдельности.
у вас не может быть сайта с очень высокой доступностью на одном VPS, если только его статический HTML, и даже тогда лак не идеален.
получите пару балансировщиков нагрузки внешнего интерфейса haproxy, распределяя их по лакам, вытягивая из nginx / php / memcache / redis / mysql (postgres)..... вот в двух словах:P