
Я программирую веб-страницу на PHP и начал замечать странное поведение своего компьютера. В какой-то момент Apache / PHP слишком долго отображает веб-страницу в браузере (8 секунд). Сначала я подумал, что это ошибка в моем приложении, поэтому создал функцию отладки, чтобы отслеживать время, необходимое для завершения моего скрипта. Но когда я начал перезагружать страницу несколько раз (нажимая F5), я заметил, что это не мой скрипт, а какой-то другой процесс останавливает Apache (или PHP, или MySQL), а затем отпускает его. Несколько нажатий F5 показывают, что иногда скрипт завершается быстро, а иногда — долго:
[time_start] => Array
(
[0] => 1446841239.1471
[1] => 0.0581
[2] => 0.0589
[3] => 0.0564
[4] => 8.0531
[5] => 0.0574
[6] => 0.0621
[7] => 8.0582
[8] => 0.0548
[9] => 8.0457
[10] => 0.0755
[11] => 8.0555
[12] => 0.0512
[13] => 8.0447
[14] => 0.062
[15] => 8.0905
[16] => 0.0602
[17] => 8.0556
[18] => 0.0582
[19] => 8.0492
[20] => 0.0551
)
Каждый шаг — это один и тот же скрипт, который запускается после нажатия F5, и он должен всегда занимать одно и то же время, но иногда для его завершения требуется 8 секунд, и это меня раздражает, потому что когда он останавливается, он ВСЕГДА занимает около 8 секунд.
Итак, вопрос в том, есть ли у меня идеи, как найти процесс, который тормозит мой скрипт?
P.S. У меня много приложений запущено на переднем плане, так как это мой персональный компьютер, но даже когда я использую только браузер без запущенных других приложений, он все равно зависает, так что это должно быть что-то работающее в фоновом режиме. Как мне это найти?
решение1
Постоянные 8 секунд означают, что для какой-то потенциально длительной процедуры установлен тайм-аут. Не зная, что делает код PHP, я предполагаю, что у вас есть время DNS. Если PHP выполняет сетевой ввод-вывод или что-то в этом роде, он, вероятно, запускает поиск DNS. Время от времени вы видите, что запрос DNS истекает, и PHP продолжает делать то, что он делает в этом случае.
Единственное место, где я вижу, что установлены тайм-ауты DNS, это в /etc/resolv.conf
, или, может быть, когда resolver(3)
код в GNU libc компилируется. К сожалению, страница руководства resolv.conf
утверждает, что 5-секундный тайм-аут — это скомпилированное значение по умолчанию, поэтому я могу только предположить.