С нами с 18.11.99
Сообщения: 14226
|
Добавлено: 13/04/05 в 18:33 |
Есть PHP скрипт, выполняющий простейшую операцию (генерация примитивной страницы, без обращения к базе). Решили мы замерять скорость его выполнения: в конце страницы пишется время генерации. Нас удивило, что при незагруженном сервере, у некоторых пользователей, время генерации страницы отличается от нормы в сотни раз.
99.9% обращений обрабатывается за 0.1 секунды, а оставшиеся 0.01% за гораздо большее время (до 40 секунд).
Мы уже начали думать, что скрипт не считается выполненным, пока он не отдался из буфера на компьютер пользователю. А поскольку канал может быть очень медленным, формальное время выполнения может растягиваться?
Есть какие-то обьяснения этой загадке природы?
Web-сервер: Apache 1.3
Server LA: ~0.3
Последний раз редактировалось: kit (15/04/05 в 23:48), всего редактировалось 1 раз
|
|
|
|
www.awm-tools.com
С нами с 28.01.04
Сообщения: 2941
Рейтинг: 3056
|
Добавлено: 13/04/05 в 18:41 |
Сидит юзер на модеме 2400.
Зашел на страничку, скрипт стартанул и работает.
Пока пользователь потихоньку кушает из буфера результат работы скрипта, апач не разрешает php модулю завершить работу.
Это сугубо мое ИМХО.
Можно попробовать установить php как cgi и посмотреть, как в таком случае он будет себя вести.
PS: А каким способом вычисляешь время работы скрипта и как собираешь статистику? Может в этом причина?
PSS: МОжет быть еще такое - пользователь не дождался окончания выполнения скрипта и ушел со странички, а сессия апача подвисла вместе с php - вот тебе и 40 секунд. Какое там ограничение по времени на выполнение php скрипта стоит?
|
|
|
|
no sign
С нами с 25.07.03
Сообщения: 3623
Рейтинг: 1403
|
Добавлено: 13/04/05 в 18:48 |
кит, а как ты статсу собираешь?
|
|
|
|
С нами с 18.11.99
Сообщения: 14226
|
Добавлено: 13/04/05 в 18:53 |
Способ сбора статистики:
В конце кода, пишется что-то типа
Код: | echo($current_time-$start_time); |
|
|
|
|
www.awm-tools.com
С нами с 28.01.04
Сообщения: 2941
Рейтинг: 3056
|
Добавлено: 13/04/05 в 19:29 |
kit писал: | Способ сбора статистики:
В конце кода, пишется что-то типа
Код: | echo($current_time-$start_time); | |
А как ты это время выполнения в статистику собираешь? Куда все складываешь? Откуда узнал, что 99,99% - нормально, а 0,01% - долго? На глаз?
|
|
|
|
БешаныйСуслег
С нами с 16.06.04
Сообщения: 1322
Рейтинг: 1338
|
Добавлено: 13/04/05 в 20:05 |
Не уверен, но проблемы подобного рода решаются установкой прокси перед апачем.
Это происходит оттого, что пользователь не может принять пока передаваемые данные.
|
|
|
|
С нами с 18.11.99
Сообщения: 14226
|
Добавлено: 13/04/05 в 21:53 |
То, что скрит должен отрабатывать очень быстро, мы уверены, так как он фактически ничего не делает, кроме как берёт файл с диска, и отдает его на выход.
|
|
|
|
www.awm-tools.com
С нами с 28.01.04
Сообщения: 2941
Рейтинг: 3056
|
Добавлено: 13/04/05 в 22:59 |
По своему опыту скажу, что вполне может быть из-за чтения файла с диска.
|
|
|
|
С нами с 18.11.99
Сообщения: 14226
|
Добавлено: 13/04/05 в 23:10 |
Можешь подробно рассказать?
У нас raid0 на двух очень бысттрых SCSI дисках. Количество запросов не велико, где-то 3 запроса в секунду.
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 14/04/05 в 02:13 |
kit выложи кусок кода и все станет ясно , а то это гадание на кофейной гуще , если это возможно.
|
|
|
|
пенсионер
С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166
|
Добавлено: 14/04/05 в 02:42 |
Kit, правильно мыслишь.
пока юзер не получил все данные - скрипт пашет.
по идее можно скорость увеличить воткнув все в одну единственную команду...
т.е. если у тебя там в цикле или просто несколько раз подряд идет
echo ...
echo ...
echo @@@
оставляешь только одну команду.
но я особо над этим не эксперементировал.
|
|
|
|
С нами с 24.02.05
Сообщения: 75
Рейтинг: 123
|
Добавлено: 14/04/05 в 07:31 |
bog - по идее для того же проще ob_start в начале/ob_flush в конце
|
|
|
|
С нами с 15.04.04
Сообщения: 60
Рейтинг: 25
|
Добавлено: 14/04/05 в 09:13 |
кусок скрипта выглядит примерно так:
Код: |
$start=get_time(); // время старта скрипта
$dir=...;
$file=...;
$out=@file_get_contents("$dir/$file");
$out=str_replace('одна фигня','другая фигня',$out);
echo $out;
save_time($start); // запоминаем время выполнения скрипта
exit();
|
|
|
|
|
www.awm-tools.com
С нами с 28.01.04
Сообщения: 2941
Рейтинг: 3056
|
Добавлено: 14/04/05 в 09:34 |
RasWeller писал: | кусок скрипта выглядит примерно так:
Код: |
$start=get_time(); // время старта скрипта
$dir=...;
$file=...;
$out=@file_get_contents("$dir/$file");
$out=str_replace('одна фигня','другая фигня',$out);
echo $out;
save_time($start); // запоминаем время выполнения скрипта
exit();
| |
Это мое ИМХО:
1. Как говорили выше, пользователь сидит на медленной линии. Пока содержимое до конца не докачает, апач скрипт не отпустит.
2. Возможно дело в $out=@file_get_contents("$dir/$file"); Согласен, что на рейде все должно летать, но бывают все-таки исключения? Так вот эти 0,01% вполне попадают в исключения.
3. Как говорили выше, пользователь послал запрос серверу, затем у пользователя начинает глючить интернет секунд 20-30, а потом он забирает ответ.
4. Возможно проблема кроется в save_time($start). Куда сейвим-то? в БД или в файл?
|
|
|
|
С нами с 15.04.04
Сообщения: 60
Рейтинг: 25
|
Добавлено: 14/04/05 в 09:35 |
В файл ессно. Нафига БД трогать ради такой мелочи
|
|
|
|
www.awm-tools.com
С нами с 28.01.04
Сообщения: 2941
Рейтинг: 3056
|
Добавлено: 14/04/05 в 09:36 |
kit писал: | Можешь подробно рассказать?
У нас raid0 на двух очень бысттрых SCSI дисках. Количество запросов не велико, где-то 3 запроса в секунду. |
Ну 3 запроса в секунду - это усредненное значение. Бывают же пики загрузки и спады. Может быть в один из таких пиков было сразу штук 50 запросов, среди которых и был один нами обсуждаемый, поскольку остальные 49 занимались чтением.
|
|
|
|
С нами с 15.04.04
Сообщения: 60
Рейтинг: 25
|
Добавлено: 14/04/05 в 09:45 |
A d u l t писал: | Ну 3 запроса в секунду - это усредненное значение. Бывают же пики загрузки и спады. Может быть в один из таких пиков было сразу штук 50 запросов, среди которых и был один нами обсуждаемый, поскольку остальные 49 занимались чтением. |
Это не объясняет почему время отдачи некоторых файлов поднимается со средних 0.3 сек до .... 232 сек!!! Что он делает 4 минуты????
|
|
|
|
www.awm-tools.com
С нами с 28.01.04
Сообщения: 2941
Рейтинг: 3056
|
Добавлено: 14/04/05 в 10:01 |
RasWeller писал: | Это не объясняет почему время отдачи некоторых файлов поднимается со средних 0.3 сек до .... 232 сек!!! Что он делает 4 минуты???? |
Значит причина в другом.
|
|
|
|
пенсионер
С нами с 07.11.02
Сообщения: 2612
Рейтинг: 1166
|
Добавлено: 14/04/05 в 11:45 |
так летать должно
$start=get_time(); // время старта скрипта
$dir=...;
$file=...;
$out=@file_get_contents("$dir/$file");
$out=str_replace('одна фигня','другая фигня',$out);
save_time($start); // запоминаем время выполнения скрипта
echo $out;
|
|
|
|
С нами с 15.04.04
Сообщения: 60
Рейтинг: 25
|
Добавлено: 14/04/05 в 12:02 |
Угу, а так:
$start=get_time(); // время старта скрипта
save_time($start); // запоминаем время выполнения скрипта
$dir=...;
$file=...;
$out=@file_get_contents("$dir/$file");
$out=str_replace('одна фигня','другая фигня',$out);
echo $out;
ваще не скрипт, а аццкий сотона!
|
|
|
|
no sign
С нами с 25.07.03
Сообщения: 3623
Рейтинг: 1403
|
Добавлено: 14/04/05 в 14:00 |
A d u l t писал: | 1. Как говорили выше, пользователь сидит на медленной линии. Пока содержимое до конца не докачает, апач скрипт не отпустит. |
нифига. вот точно не соглашусь. сначала процессится PHP - потом это все отдается юзеру.
|
|
|
|
С нами с 24.02.05
Сообщения: 75
Рейтинг: 123
|
Добавлено: 14/04/05 в 16:22 |
arachnO - нет, смотри работу PHP с буфером вывода
Чтобы исключить влияние доступа на чтение к диску можно временно загнать файл в виртуальный диск в памяти. Если тормоза останутся - дело таки в HTTP соединении. До кучи можно сохранять в логи загрузку сервера (CPU(s)/MEM) в моменты когда время выполнения выше N.
ps
$start=get_time(); // время старта скрипта
save_time($start); // запоминаем время выполнения скрипта
$dir=...;
$file=...;
$out=@file_get_contents("$dir/$file");
$out=str_replace('одна фигня','другая фигня',$out);
$mid=get_time();
save_time($mid); //время самого процессинга
print($out);
$end=get_time();
save_time($end); //время окончания вывода
pps каково значение параметров set_time_limit и ignore_user_abort?
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 14/04/05 в 18:10 |
file_get_contents ?
|
|
|
|
Гражданин планеты Земля
С нами с 30.03.03
Сообщения: 7217
Рейтинг: 2185
|
Добавлено: 14/04/05 в 19:04 |
mr.GOD писал: | file_get_contents ? |
и в чем суть вопроса?
|
|
|
|
С нами с 19.11.03
Сообщения: 3973
Рейтинг: 2362
|
Добавлено: 14/04/05 в 20:45 |
wMaster писал: | и в чем суть вопроса? |
в этом и вопрос , нужно ли и есть ли оно там ...
|
|
|
|