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

Процесс Apache потребляет слишком много ресурсов процессора

У меня есть сервер ubuntu apache / php, на котором запущен php, выполняющий appx 100 ударов в секунду, и PHP cron, работающий в фоновом режиме.

Иногда у меня возникает высокая загрузка ЦП в одном из процессов Apache, которая остается высокой независимо от трафика или активности cron. Мне кажется, что он застрял в какой-то петле или что-то в этом роде.

Ниже вы найдете информацию о топе и Strace.

Как я могу узнать, где находится плохой код и что его вызывает?

top - 14:45:24 up 3 days,  3:38,  1 user,  load average: 5.10, 5.88, 5.85
Tasks: 163 total,   5 running, 158 sleeping,   0 stopped,   0 zombie
Cpu(s): 47.8%us, 18.5%sy,  0.0%ni, 10.2%id,  0.0%wa,  0.0%hi,  1.8%si, 21.6%st
Mem:   7885012k total,  3858484k used,  4026528k free,   177444k buffers
Swap:        0k total,        0k used,        0k free,  1037868k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10736 www-data  20   0  769m 559m 478m R   69  7.3  29:08.30 apache2
10844 www-data  20   0  824m 601m 492m S   17  7.8   4:37.90 apache2
 1016 root      20   0  242m  25m 4628 S    6  0.3 162:07.93 scalarizr
 9030 www-data  20   0  879m 619m 492m S    4  8.0   5:06.82 apache2
20216 www-data  20   0  747m 228m 170m S    4  3.0   0:01.94 apache2
10807 www-data  20   0  814m 584m 492m S    3  7.6   4:54.10 apache2
10455 www-data  20   0  831m 574m 492m S    3  7.5   4:32.65 apache2
10495 www-data  20   0  849m 592m 492m S    3  7.7   4:41.10 apache2
10884 www-data  20   0  840m 581m 492m S    3  7.6   4:25.06 apache2




^CProcess 10736 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 74.55    0.148052           1    109755           gettimeofday
 25.36    0.050370           0    164634           clock_gettime
  0.09    0.000178           0     54878           poll
------ ----------- ----------- --------- --------- ----------------
100.00    0.198600                329267           total
root@ec2-67-202-54-36:~# ^C

Я бы рекомендовал включить Apache mod_status и включите ExtendedStatus. Slicehost имеет отличная статья о том, как это сделать (я бы использовал пакет «elinks» вместо «lynx», но это личное предпочтение). Когда вы просматриваете URL-адрес состояния сервера Apache, там будут столбцы PID, VHost и Request - они должны иметь большое значение для точного определения вызываемого URI, который вы можете использовать для отслеживания конкретного кода, который выполняется. .

Вот настроенная версия статьи Slicehost для включения mod_status:

sudo apt-get install elinks
sudo /usr/sbin/a2enmod status
sudo sh -c "echo 'ExtendedStatus On' > /etc/apache2/conf.d/extendedstatus"
sudo vi /etc/apache2/sites-available/server-status

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from localhost
</Location>

sudo /usr/sbin/a2ensite server-status
sudo apachectl configtest
sudo service apache2 reload

Затем, чтобы просмотреть статус сервера:

elinks -dump -dump-width 256 http://localhost/server-status

Святой Махони! Ваш Apache использует слишком много памяти. Какого черта он работает? Загружены ли тонны модулей Apache? У вас есть mod_security с не очень дружественными к памяти правилами? На вашем сайте работает что-то чертовски похожее на Magenta? Кроме того, что-то действительно заставляет ваш PHP-скрипт интересоваться текущим временем. : D

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

Для анализа производительности в реальном времени в современных дистрибутивах Linux есть перфоманс команда, это похоже на традиционный верхняя но вы можете перейти к отдельным процессам и, если хотите, увидеть, что происходит на уровне сборки.

Есть несколько вариантов, которые вы можете использовать для устранения проблемы.

Очевидно, вы хотите проверить свои журналы и определить, есть ли какие-либо проблемы, о которых сообщается.

/var/log/access_log 
/var/log/php_error
/var/log/error_log

Нажатие C во время работы top также предоставит вам дополнительные данные о процессах, которые работают с таким высоким ЦП

Как уже упоминалось в dialtOne, вы можете установить mod_status, чтобы получить дополнительную информацию.

Я не уверен, как вы используете php, но установка memcache и APC на машинах обеспечит дополнительную экономию ресурсов. С помощью memcache вам нужно будет настроить свой код так, чтобы он сначала обращался к его кешам для поиска в базе данных. Это может сэкономить массу накладных расходов на сайтах с интенсивным доступом с множеством повторяющихся поисков в базе данных.

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

Он находится в вашем php.ini и в любом файле конфигурации вашей базы данных.

Если вы используете вызовы базы данных, вы можете искать медленные запросы.

Другие параметры расширяют ваши дочерние процессы, и количество процессов на одного ребенка можно настроить в httpd.conf.

Загрузка 5 - не худший вариант, в зависимости от того, сколько у вас процессоров. На некоторых из наших более крупных веб-серверов я видел очень высокие нагрузки и раньше, и сайт по-прежнему работает нормально. Это действительно то, сколько энергии вы хотите потратить на настройку сайта.

Удачи!

Вы должны использовать отладчик например xdebug, чтобы пройтись по вашей программе и найти бесконечный цикл.