При запуске большого приложения mod_perl на EC2 мы заметили, что загрузка ЦП на экземпляре постепенно увеличивается между перезапусками или плавными перезапусками.
Текущая настройка: CentOS 5.4, экземпляры m2.4xlarge, apache 1.3 с mod_perl.
Мы впервые заметили это при отслеживании скорости запросов memcached от приложения. По мере того, как каждый дочерний процесс apache становится старше, требуется больше времени для чтения / записи в экземпляр memcached, работающий на том же хосте. Мы обнаружили, что выполнение apachectl изящно каждый час может предотвратить это за счет скачка нагрузки каждый раз.
То, что вызывает это замедление, также заметно при мониторинге ганглиев. Мы использовали один сервер без ежечасных перезапусков, и хотя его скорость обслуживания запросов такая же, как и у других серверов, загрузка ЦП всегда выше. Показатели «загрузки» примерно такие же, но показатель ЦП системы выше.
Я ломаю голову, чтобы понять, что здесь происходит, так как перезапуск дочерних элементов apache каждый час означает, что мы упускаем преимущества внутрипроцессного кэширования.
Кто-нибудь видел нечто подобное? Похоже, что это не влияет на наше приложение, когда оно выполняется на реальном оборудовании в одном из наших центров обработки данных, хотя там мы используем SUSE.
ОБНОВЛЕНИЕ 1: Спасибо voretaq7. Мы выбрали тип экземпляра m2.4xlarge с 68 ГБ оперативной памяти. Наша текущая настройка apache (160 детей, работающих постоянно) заставляет нас использовать только половину этого количества, поэтому свопинг отключен. Нет ожидающего ЦП или украденного ЦП, поскольку размер экземпляра означает, что мы не разделяем неактивный хост с кем-либо еще. Мы видим пользовательский и системный ЦП с большим количеством ЦП, чем на коробках, где мы выполняем плавный перезапуск каждый час.
ОБНОВЛЕНИЕ 2: Сейчас я запускаю еще одну пробную версию с тремя серверами. Один запускает изящный apachectl каждый час, один установлен с MaxRequestsPerChild = 512, а третий с MaxRequestsPerChild = 64. Это сделано для того, чтобы попытаться разобраться, исправляет ли этот родительский элемент каким-то образом изящный перезапуск или дети просто не в себе не бегаю так долго. Я пробегу с этой настройкой 12 часов и сравню статистику.
ОБНОВЛЕНИЕ 3: Запуск потомков с меньшим значением MaxRequestsPerChild заметно улучшил ситуацию. Однако хост, выполняющий плавный перезапуск, по-прежнему работал лучше.
ОБНОВЛЕНИЕ 4: На каждом хосте работает три экземпляра apache (всего 160 дочерних) и три кэша памяти. Имея только ядра процессора, я размышлял о стоимости переключения контекста. Я запустил пробную версию, в которой на одном хосте все кэши памяти были прикреплены к CPU0, а apache - к CPU1-7. Это заметно улучшило производительность. Я до сих пор не знаю точно, что вызывает снижение использования ЦП между перезапусками apache, но похоже, что комбинация привязки ЦП, периодических плавных перезапусков и более короткого времени жизни ребенка может ускорить процесс.
# Start the three memcacheds as follows
/bin/taskset --cpu-list 0 /usr/local/bin/memcached -d -p 12345
# Start apache as follows
/bin/taskset --cpu-list 1-7 apachectl start
Любая привязка к процессору, примененная к родительскому процессу apache, будет применяться ко всем дочерним процессам, которые он порождает.
Похоже, переключение контекста является основным фактором медлительности apache. Прикрепление memcached к одному процессору и apache ко всем остальным значительно ускорило работу. Увидеть ОБНОВЛЕНИЕ 4: в вопросе для подробностей.