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

Apache использует слишком много ресурсов процессора

Я пытаюсь управлять сервером на Amazon для сети сайтов, которая получает около 100 миллионов просмотров страниц в месяц. К сожалению, никто из моей команды из 5 разработчиков не имеет большого опыта администрирования серверов.

Сейчас у нас установлено MaxClients на 1400. В настоящее время наш трафик примерно средний, и у нас работает 1150 процессов Apache, каждый из которых использует около 2% ЦП! Из этих 1150 800 в настоящее время спят, но все еще используют процессор. Я уверен, что есть способы оптимизировать это. У меня есть несколько мыслей:

  1. Похоже, Apache создает новый процесс для каждого подключения. Это нормально?
  2. Есть ли способ быстрее убить спящие процессы?
  3. Стоит ли включать KeepAlive? Каждая страница загружает около 15-20 изображений среднего размера и много javascript / css.

Итак, вот наша установка Apache. Мы действительно планируем как можно скорее нанять администратора сервера, но я буду очень признателен за совет, пока мы не найдем кого-нибудь.

Timeout 25
KeepAlive Off
MaxKeepAliveRequests 200
KeepAliveTimeout 5

<IfModule prefork.c>
StartServers         100
MinSpareServers      20
MaxSpareServers      50
ServerLimit          1400
MaxClients           1400
MaxRequestsPerChild  5000
</IfModule>

<IfModule worker.c>
StartServers         4
MaxClients           400
MinSpareThreads      25
MaxSpareThreads      75
ThreadsPerChild      25
MaxRequestsPerChild  0
</IfModule>

Полная максимальная мощность:

top - 23:44:36 up 1 day,  6:43,  4 users,  load average: 379.14, 379.17, 377.22
Tasks: 1153 total, 379 running, 774 sleeping,   0 stopped,   0 zombie
Cpu(s): 71.9%us, 26.2%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  1.9%si,  0.0%st
Mem:  70343000k total, 23768448k used, 46574552k free,   527376k buffers
Swap:        0k total,        0k used,        0k free, 10054596k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1756 mysql     20   0 10.2g 1.8g 5256 S 19.8  2.7 904:41.13 mysqld
21515 apache    20   0  396m  18m 4512 R  2.1  0.0   0:34.42 httpd
21524 apache    20   0  396m  18m 4032 R  2.1  0.0   0:32.63 httpd
21544 apache    20   0  394m  16m 4084 R  2.1  0.0   0:36.38 httpd
21643 apache    20   0  396m  18m 4360 R  2.1  0.0   0:34.20 httpd
21817 apache    20   0  396m  17m 4064 R  2.1  0.0   0:38.22 httpd
22134 apache    20   0  395m  17m 4584 R  2.1  0.0   0:35.62 httpd
22211 apache    20   0  397m  18m 4104 R  2.1  0.0   0:29.91 httpd
22267 apache    20   0  396m  18m 4636 R  2.1  0.0   0:35.29 httpd
22334 apache    20   0  397m  18m 4096 R  2.1  0.0   0:34.86 httpd
22549 apache    20   0  395m  17m 4056 R  2.1  0.0   0:31.01 httpd
22612 apache    20   0  397m  19m 4152 R  2.1  0.0   0:34.34 httpd
22721 apache    20   0  396m  18m 4060 R  2.1  0.0   0:32.76 httpd
22932 apache    20   0  396m  17m 4020 R  2.1  0.0   0:37.34 httpd
22933 apache    20   0  396m  18m 4060 R  2.1  0.0   0:34.77 httpd
22949 apache    20   0  396m  18m 4060 R  2.1  0.0   0:34.61 httpd
22956 apache    20   0  402m  24m 4072 R  2.1  0.0   0:41.45 httpd

На эту тему написаны целые книги, но для простоты:

Запустить базу данных на отдельном уровне

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

Изолировать статический и динамический контент

Рассмотрите возможность использования более быстрого веб-сервера, такого как nginx, для статического контента и полного отказа от apache. Если можете, запускайте nginx везде.

KeepAlive обязательно поможет

Многие ваши ресурсы сжигаются за счет разрыва и разрыва соединений.

PageTest

Для получения дополнительных полезных советов я настоятельно рекомендую: http://www.webpagetest.org/ . Это покажет вам, почему сайт долго загружается, и даст ряд практических советов по исправлению производительности: включение сжатия gzip, минимизация javascript и css и т. Д. Прочтите это.

Мне кажется, вы используете предварительную вилку mpm. Большая часть этого ответа предполагает то же самое.

Похоже, Apache создает новый процесс для каждого подключения. Это нормально?

Для префорка? Да.

Есть ли способ быстрее убить спящие процессы?

Вы уверены, что эти процессы ничего не делают? С настройкой MaxSpareSevers у вас должно быть не более 50 незанятых процессов. Включите mod_status и установите ExtendedStatus, чтобы вы могли просматривать табло Apache и видеть, что происходит.

Стоит ли включать KeepAlive? Каждая страница загружает около 15-20 изображений среднего размера и много javascript / css.

Включение KeepAlive - хорошая идея. Это позволит клиентам направлять запросы в конвейер и позволит вам более эффективно повторно использовать процессы Apache.

Как и в большинстве случаев тюнинга. Сначала измерьте, чтобы создать базовую линию, затем измените что-то одно, а затем повторно измерьте, чтобы попытаться определить, какой эффект могло иметь ваше изменение. Для этого удобно использовать (и строить графики) mod_status.

Возможно, вы сможете использовать рабочий mpm, который, как правило, способствует повышению производительности. Однако некоторые библиотеки (особенно некоторые библиотеки PHP) плохо работают с рабочим mpm. YMMV

Чтобы определить, какой mpm вы используете, выполните: apache2 -V (или httpd -V в зависимости от дистрибутива)