Как стать автором
Обновить

Анализируем php-fpm.slow.log

Итак, настал тот день когда Вы или Ваш коллега, наконец-то, запустили серьёзный проект, будь то портал/социальная сеть/игра для социалок. Но, как всегда внезапно, проект начинает тормозить. В чём же дело? Ведь и база настроена как надо, и кеш используется, даже nginx с акселератором PHP кода трудятся в поте лица.

Дабы не покрывать весь код каким-то Benchmark'ом для выявления узких мест можно воспользоваться замечательной возможностью логирования php-fpm, который будет дампить скрипты, выполнявшиеся больше N секунд. Включается это чудо в php-fpm.conf.

Что же делать?

В первую очередь, следует найти и исправить код в тех местах, где проблема возникает чаще всего. В этом нам поможет нижеследующий пример.

//чтобы отсечь лишнее, подбирается под конкретные задачи анализа лога, список функций легко определить на глаз при открытии файла лога
$functions=array(
"mysql_query",
"session_start",
);

//функция очищения пути к файлу
function clear_path($path)
{
return str_replace("/home/","",$path);
}

//открываем и парсим лог
$f=fopen("/path/to/php-fpm.log.slow.1","r");
if ($f)
while (($row=fgets($f,4096))!==false)
{
foreach ($functions as $function)
if (strpos($row,$function)!==false)
{
$path=explode(" ",$row);
$path=array_pop($path);
$path=explode(":",$path);
$result[clear_path($path[0])][trim($path[1])]++;
}
}
print_r($result);


На выходе мы получаем массив, ключами которого является путь до проблемного файла, а значениями — второй массив, ключами которого является строка в файле, значением — количество выполнений более N секунд.

Array
(
[/path/to/script1.php] => Array
(
[7] => 9
)

[/path/to/script2.php] => Array
(
[64] => 5
)

[/path/to/script3.php] => Array
(
[375] => 1
[468] => 39
[358] => 1
[391] => 5
[249] => 1
[154] => 2
)
)

Далее каждый уже для себя может настроить вывод в более приятной для глаза форме.

Что ещё следует знать

В новом формате php-fpm.slow.log так же присутствует возможность просмотра параметров, переданных скрипту, приводится само время выполнения.
script_filename = /data/www/forum.php mod=rss&fid=3378&auth=0 (0.550162 sec)
Произведя несложную модификацию примера, а именно — добавив обработку строки с script_filename, можно получить немного больше информации для отладки.

Заключение

После решения проблем, выявленных при помощи этого анализа, вероятнее всего, Ваш сервер снова будет радовать своих посетителей безупречной работой, а Вам останется лишь иногда поглядывать в slow.log для собственного спокойствия.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.