Проблема:
Через 30-40 минут после направления DNS с нашего старого сервера на наш новый сервер вся доступная память израсходована, и наши (3) экземпляры EC2 с балансировкой нагрузки выходят из строя .
Что еще хуже, не похоже, что Elastic Beanstalk завершает экземпляры, которые вышли из строя. Я думаю, это потому, что мы можем выбрать только один триггер автоматического масштабирования, а использование памяти не является одним из доступных триггеров.
Согласно Chartbeat, наш веб-сайт, похоже, получает 200-400 одновременных пользователей (отчеты Google Analytics в реальном времени показывают 60-80 пользователей).
Я также должен отметить, что я «решил» проблему, но установил Varnish на экземплярах EC2. С Varnish серверы не падают, а интерфейс работает очень-очень быстро. Однако я хотел знать, было ли это нормальным поведением для 200 пользователей на 3 серверах с балансировкой нагрузки. Меня беспокоит, что что-то не так или что-то, что можно исправить.
Обзор спецификаций:
На AWS мы используем
Конфиги для PHP и FPM приведены ниже:
Что я обнаружил
Я переключаю DNS около 22:00 EST, когда трафик низкий (200 пользователей согласно Chartbeat и 60 согласно GA) для тестирования и сбора информации.
Примерно через 30-40 минут вся память будет израсходована. К сожалению, я не наблюдал достаточно внимательно, чтобы заметить, постоянно ли увеличивается использование памяти или просто увеличивается. Вы можете видеть на изображении, что время задержки также резко возросло.
На этом этапе я проверил журналы и увидел, что сервер достиг своего значения 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 с балансировкой нагрузки не могут?
Следующие шаги
И это безумие для меня. Как можно старый сервак (плюс лак cache) с более низкими характеристиками и более низкими настройками fpm справляются со всем этим трафик, но мои 3–6 серверов EC2 с балансировкой нагрузки не могут?
Попадание в кэш происходит очень быстро, возможно, в 100 раз быстрее, чем создание динамического содержимого. Хиты удаляют ненужную дублирующую работу из серверной части.
Чтобы сравнить провайдеров хостинга, вам необходимо сравнить похожие проекты. Один с кешем, а другой без кэша будет иметь очень разные характеристики производительности.
На снимке экрана монитора работоспособности показано относительно низкое использование ЦП и очередь выполнения (средняя нагрузка), но высокая задержка запроса. Посмотрите на / proc / meminfo
, чтобы убедиться, что он испытывает нехватку памяти. Если ограничивающим фактором является память, большее количество рабочих процессов повредит, а не поможет.
Что касается триггеров масштабирования, используйте что-то кроме памяти, чтобы ограничить количество подключений на экземпляр. Возможно, сетевой трафик или количество запросов.