Назад | Перейти на главную страницу

Средняя загрузка системы чрезвычайно высока

У меня есть веб-сайт, который работает на 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