У меня есть сервер 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, чтобы пройтись по вашей программе и найти бесконечный цикл.