Процесс Apache потребляет слишком много ресурсов процессора
У меня есть сервер ubuntu apache/php, на котором работает php, который выполняет appx 100 обращений в секунду, и cron PHP работает в фоновом режиме.
Я иногда получаю высокую нагрузку на процессор в одном из процессов Apache, который остается высоким независимо от трафика или активности cron. Мне кажется, что он застрял в какой-то петле или что-то.
Ниже вы найдете информацию о топе и страусах.
Как я могу найти, где плохой код и чем это вызвано?
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
4 ответа
Я бы рекомендовал включить 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 с не очень дружелюбными по отношению к памяти правилами? Ваш сайт работает что-то из ада, как пурпурный? Кроме того, что-то действительно делает ваш PHP-скрипт действительно любопытным по поводу текущего времени.:D
В любом случае, для профилирования PHP вы можете использовать XDebug и для анализа результатов, например, KCacheGrind, который показывает результаты в графической, удобной для чтения форме.
Для анализа производительности в реальном времени в современных дистрибутивах Linux есть команда perf, это как традиционная вершина, но вы можете перейти к отдельным процессам, и, если хотите, вы сможете увидеть на уровне сборки, что происходит.
Вы должны использовать отладчик, например, xdebug, чтобы пройтись по вашей программе, чтобы найти бесконечный цикл.
Есть несколько вариантов, которые вы можете использовать для изоляции вашей проблемы.
Очевидно, что вы хотите проверить свои журналы и определить, есть ли какие-либо проблемы, о которых сообщается.
/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 не самая плохая, в зависимости от того, сколько у вас процессоров. Некоторые из наших более крупных веб-серверов я видел очень высокие нагрузки раньше, и сайт по-прежнему работает нормально. Это действительно то, сколько энергии вы хотите потратить на настройку сайта.
Удачи!