Обычно я не системный администратор, но у меня есть производственный сервер с большой нагрузкой (обслуживающий некоторые базовые страницы php и некоторые файлы перенаправления php с некоторыми запросами sql и без изображений), который продолжает давать сбой. В частности, нагрузка увеличивается примерно до 20, а время ожидания запросов истекает. В журнале доступа apache или журнале ошибок нет ничего, указывающего на необычную активность, но диаграмма ввода-вывода диска показывает сильные всплески чтения / записи, которые коррелируют с нашим временем простоя.
Я знаю, что это комбинация этих страниц и нескольких сотен тысяч обращений в час, но я в тупике и не знаю, какие инструменты использовать. Мне нужно увидеть A) Сколько просмотров в секунду / минуту / час получают эти страницы и B) Сколько времени требуется для обслуживания каждой страницы. Что доступно для профилирования работающего сервера под нагрузкой? Что лучше?
Сервер - apache2, php5, ubuntu hardy. Мы очень ценим любые советы.
РЕДАКТИРОВАТЬ:
Спасибо за идеи. Я мог бы редактировать PHP, но это страницы, которые дизайнеры часто меняют, им нравится копировать / вставлять / удалять вещи, и я надеялся найти для этого что-то получше, чем клейкая лента, потому что это повторяющаяся проблема на многих наших серверах.
Неужели на рабочих серверах нет программных пакетов для мониторинга нагрузки на каждый файл? Придется ли мне прибегать к средствам отладки и профилированию сегментов кода? Если мой сервер уже задыхается от попаданий, не стал бы добавлять XDebug по-королевски F *! # - up my S @ ^ &?
Самым простым первым делом было бы определить наиболее «популярные» запрашиваемые файлы PHP.
Вы можете сделать это, просмотрев файл (ы) access.log Apache или используя что-то вроде Apachetop в реальном времени (хотя он также полагается на файлы журналов).
Вы можете проверить статус сервера Apache, используя mod_status - он также покажет вам, что именно использует циклы ЦП Apache. Существует много информации об использовании его для определения запросов, интенсивно использующих ЦП.
После того, как у вас есть список «кандидатов на оптимизацию», вы действительно можете использовать XDebug индивидуально для каждого из них.
В качестве более простого варианта вы можете установить xcache или APC или любое другое программное обеспечение для кэширования PHP. Это значительно ускоряет выполнение скриптов PHP.
Вы можете попробовать модуль Apache Modlogslow для получения показателей периода времени, используемого для обработки каждого запроса текущим процессом.
Вам следует попробовать Xdebug функция профилирования. Вы можете установить его как модуль, а затем включить профилирование, чтобы создать файл профиля. После сбора данных вы можете использовать WinCacheGrind или какой-то другой Валгринд обработка, чтобы увидеть, где вы проводите время. Есть и другие варианты Профилирование PHP также.
Относительно «А) Сколько посещений в секунду / минуту / час получают эти страницы» - эта информация будет в журналах, и практически любой парсер журналов и / или пакет статистики веб-анализа рассмотрит это за вас. Перечислены общие бесплатные / OSS Вот.
Для «Б) Сколько времени требуется для обслуживания каждой страницы». - это также можно включить в журналы, если вы используете настраиваемый формат журнала, хотя вам придется проверить документацию для выбранного вами инструмента анализа журналов, чтобы узнать, поддерживает ли он эту дополнительную информацию. Будьте осторожны при использовании этого рисунка для вывода вещей без других фактов, подтверждающих вывод, так как время, очевидно, будет зависеть от другой нагрузки на систему, а также от нагрузки, накладываемой ею.
Одним из наиболее вероятных источников проблем в описываемых вами обстоятельствах является база данных. Вы не указываете, какой сервер базы данных вы используете, поэтому мы не можем быть здесь более конкретными, но вы обнаружите, что большинство баз данных позволяют регистрировать длительные запросы, которые вы можете использовать, как поле журнала Apache "затраченное время", чтобы сделать вывод места для поиска возможностей оптимизации. В частности, ищите запросы, которые выполняют сканирование таблиц над большими наборами данных.
Другая основная возможность - это просто избыток активности, с которой ваша машина недостаточно высока, чтобы справиться с ней - вы должны увидеть это, если это так, используя анализатор журналов Apache. Если у вас внезапный переизбыток трафика, это может привести к запуску дополнительных процессов Apache и множеству дополнительных запросов к базе данных. В любом случае это может привести к большому количеству операций ввода-вывода либо из-за доступа к базе данных, либо из-за подкачки, если дополнительные процессы выталкивают машину за пределы того, что может поместиться в ОЗУ. Стоит посмотреть на использование памяти и активность подкачки во время одного из загруженных мест, или, если вы не можете поймать его в момент, когда это происходит, оставьте запись на месте, чтобы вы могли просмотреть, что произошло, постфактум. я использую собирать для такого мониторинга (есть и другие варианты с аналогичными функциями, если collectd вам не нравится), а также для параметров системы мониторинга, таких как использование ЦП, ввод-вывод и использование памяти + своп, он также имеет модули для регистрации конкретных Apache и mySQL / postgres, которые могут оказаться полезными. Вы заявляете, что у вас уже есть диаграмма ввода-вывода, которая подразумевает, что подобное решение уже установлено - вы можете проверить, какие другие параметры ведения журнала свойств, в частности, могут ли они различать ввод-вывод для разделов, из которых находятся ваши данные Ввод-вывод, вызванный обменом данными.
Если проблема заключается в переизбытке активности, вы можете обнаружить, что вам нужно либо больше ОЗУ, либо более совершенная подсистема ввода-вывода, либо и то, и другое, чтобы обслуживать пиковую нагрузку сайта - хотя в вашем коде или проекте базы данных могут быть места, где оптимизация тоже поможет, особенно обратите внимание на улучшение индексации ваших данных в базе данных, если выполняется полное сканирование таблицы там, где в этом нет необходимости), и вы могли бы рассмотреть определенные методы кэширования, чтобы уменьшить количество раз, когда динамический контент реконструируется из царапина.
Существует простой способ автоматически добавлять скрипты ко всем файлам php: http://www.electrictoolbox.com/php-automatically-append-prepend/
Просто запустите таймер в добавленном файле, остановите его и запишите время работы в добавленном.
Используя эту технику, вам не придется беспокоиться о том, что другие разработчики / дизайнеры перезапишут ваш код.