Почему WordPress на 3 серверах EC2 с балансировкой нагрузки исчерпывает память / дочерние процессы fpm и дает сбой?

Проблема:

Через 30-40 минут после направления DNS с нашего старого сервера на наш новый сервер вся доступная память израсходована, и наши (3) экземпляры EC2 с балансировкой нагрузки выходят из строя .

Что еще хуже, не похоже, что Elastic Beanstalk завершает экземпляры, которые вышли из строя. Я думаю, это потому, что мы можем выбрать только один триггер автоматического масштабирования, а использование памяти не является одним из доступных триггеров.

Согласно Chartbeat, наш веб-сайт, похоже, получает 200-400 одновременных пользователей (отчеты Google Analytics в реальном времени показывают 60-80 пользователей).

Я также должен отметить, что я «решил» проблему, но установил Varnish на экземплярах EC2. С Varnish серверы не падают, а интерфейс работает очень-очень быстро. Однако я хотел знать, было ли это нормальным поведением для 200 пользователей на 3 серверах с балансировкой нагрузки. Меня беспокоит, что что-то не так или что-то, что можно исправить.

Обзор спецификаций:

На AWS мы используем

  • 3–6 серверов EC2 с автоматическим масштабированием и балансировкой нагрузки t2.large (2 виртуальных ЦП и 8 гигабайт памяти)
  • под управлением Elastic Beanstalk (для интеграции с Github)
  • классический балансировщик нагрузки
  • Cloudflare используется для завершения DNS и SSL.
  • Apache 2.4
  • PHP 5.6
  • PHP FPM
  • 64-битный Amazon Linux / 2.7. 1 AMI

Конфиги для PHP и FPM приведены ниже:

Что я обнаружил

Я переключаю DNS около 22:00 EST, когда трафик низкий (200 пользователей согласно Chartbeat и 60 согласно GA) для тестирования и сбора информации.

Примерно через 30-40 минут вся память будет израсходована. К сожалению, я не наблюдал достаточно внимательно, чтобы заметить, постоянно ли увеличивается использование памяти или просто увеличивается. Вы можете видеть на изображении, что время задержки также резко возросло.

enter image description here

На этом этапе я проверил журналы и увидел, что сервер достиг своего значения max_children:

[19-Sep-2018 22:50:40] NOTICE: fpm is running, pid 6842
[19-Sep-2018 22:50:40] NOTICE: ready to handle connections
[19-Sep-2018 23:03:21] NOTICE: Reloading in progress ...
[19-Sep-2018 23:03:21] NOTICE: reloading: execvp("php-fpm-5.6", {"php-fpm-5.6"})
[19-Sep-2018 23:03:21] NOTICE: using inherited socket fd=9, "/var/run/php-fpm/php5-fpm.sock"
[19-Sep-2018 23:03:21] NOTICE: using inherited socket fd=9, "/var/run/php-fpm/php5-fpm.sock"
[19-Sep-2018 23:03:21] NOTICE: fpm is running, pid 8293
[19-Sep-2018 23:03:21] NOTICE: ready to handle connections
[19-Sep-2018 23:33:01] WARNING: [pool www] server reached max_children setting (200), consider raising it

Мне, вероятно, следует увеличить max_children до 420 с 200. Но Думаю, я не понимал, что делает max_children (он правильно обрабатывает каждый запрос? И каждый просмотр страницы может запрашивать несколько изображений, css, файл php, JS вызывает ect ect?).

Но я надеялся, что 3 сервера EC2 смогут справиться с этой нагрузкой. Особенно с учетом того, что текущая, более старая инфраструктура (Rackspace) в основном состоит из 2 серверов: 1 кеш-памяти и 1 сервер, обслуживающий интерфейс сайта. Ни один из этих серверов не кажется мощнее, чем новые серверы AWS, у них всего 4 гигабайта памяти. Конфиги PHPFPM также намного ниже на этом сервере:

pm = dynamic
pm.max_children      = 20
pm.start_servers     = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 10

И это для меня безумие. Как старый сервер (плюс лаковый кеш) с более низкими характеристиками и меньшими настройками fpm может обрабатывать весь этот трафик, но мои 3–6 серверов EC2 с балансировкой нагрузки не могут?

Следующие шаги

  1. Может быть, серверы EC2 просто отстой по сравнению с старый сервер Rackspace, и мне нужно выбрать более крупные экземпляры?
  2. База данных RDS - большое узкое место, и, пока я не настрою ее настройки, не будет разрешать более 40 подключений. Может быть, мне нужно использовать сервер EC2 с mysql? (У меня есть еще один, отдельный, но связанный с этим вопрос по этому поводу)
  3. Memcache или Redis с помощью elasticache могут помочь, если я могу гарантировать, что это не мешает работе раздела администратора.
  4. Opcache включен по умолчанию в php5.6, но есть ли что-нибудь еще, что мне нужно сделать использовать it?
  5. Добавить мониторинг памяти и дополнительные триггеры автомасштабирования в эластичный beanstalk
0
задан 21 September 2018 в 17:34
1 ответ

И это безумие для меня. Как можно старый сервак (плюс лак cache) с более низкими характеристиками и более низкими настройками fpm справляются со всем этим трафик, но мои 3–6 серверов EC2 с балансировкой нагрузки не могут?

Попадание в кэш происходит очень быстро, возможно, в 100 раз быстрее, чем создание динамического содержимого. Хиты удаляют ненужную дублирующую работу из серверной части.

Чтобы сравнить провайдеров хостинга, вам необходимо сравнить похожие проекты. Один с кешем, а другой без кэша будет иметь очень разные характеристики производительности.


На снимке экрана монитора работоспособности показано относительно низкое использование ЦП и очередь выполнения (средняя нагрузка), но высокая задержка запроса. Посмотрите на / proc / meminfo , чтобы убедиться, что он испытывает нехватку памяти. Если ограничивающим фактором является память, большее количество рабочих процессов повредит, а не поможет.

Что касается триггеров масштабирования, используйте что-то кроме памяти, чтобы ограничить количество подключений на экземпляр. Возможно, сетевой трафик или количество запросов.

0
ответ дан 5 December 2019 в 05:16

Теги

Похожие вопросы