Итак, настал тот день когда Вы или Ваш коллега, наконец-то, запустили серьёзный проект, будь то портал/социальная сеть/игра для социалок. Но, как всегда внезапно, проект начинает тормозить. В чём же дело? Ведь и база настроена как надо, и кеш используется, даже nginx с акселератором PHP кода трудятся в поте лица.
Дабы не покрывать весь код каким-то Benchmark'ом для выявления узких мест можно воспользоваться замечательной возможностью логирования php-fpm, который будет дампить скрипты, выполнявшиеся больше N секунд. Включается это чудо в php-fpm.conf.
В первую очередь, следует найти и исправить код в тех местах, где проблема возникает чаще всего. В этом нам поможет нижеследующий пример.
На выходе мы получаем массив, ключами которого является путь до проблемного файла, а значениями — второй массив, ключами которого является строка в файле, значением — количество выполнений более N секунд.
Далее каждый уже для себя может настроить вывод в более приятной для глаза форме.
В новом формате php-fpm.slow.log так же присутствует возможность просмотра параметров, переданных скрипту, приводится само время выполнения.
Произведя несложную модификацию примера, а именно — добавив обработку строки с script_filename, можно получить немного больше информации для отладки.
После решения проблем, выявленных при помощи этого анализа, вероятнее всего, Ваш сервер снова будет радовать своих посетителей безупречной работой, а Вам останется лишь иногда поглядывать в slow.log для собственного спокойствия.
Дабы не покрывать весь код каким-то 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 для собственного спокойствия.