Диагностика медленной страницы «Время ожидания» между двумя веб-серверами

Мы только что установили/настроили новый веб-сервер взамен устаревшего. Назовем старый сервер «сервер1» + новый сервер «сервер2». На обоих работает один и тот же веб-сайт с одним и тем же кодом, но старый сервер по-прежнему обслуживает веб-страницы гораздо быстрее, чем новый. Во-первых, вот более подробная информация о спецификациях сервера:

Конфигурация сервера 1:

Linux server1 2.6.32-25-generic-pae #45-Ubuntu SMP Сб 16 октября 21:01:33 UTC 2010 i686 GNU/Linux

Общий объем памяти: 6180036 КБ

8-ядерный ЦП Intel(R) Xeon(R) E5620 @ 2,40 ГГц

Версия сервера: Apache/2.2.14 (Ubuntu)

Конфигурация сервера 2:

Linux server2 3.2.0-23-generic #36-Ubuntu SMP Вт, 10 апреля, 20:39:51 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Общий объем памяти: 24682544 КБ

16-ядерный процессор Intel(R) Xeon(R) E5620 с тактовой частотой 2,40 ГГц

Версия сервера: Apache/2.2.22 (Ubuntu)

Основные отличия заключаются в том, что server2 имеет 64-битную архитектуру ОС, а также имеет гораздо больше оперативной памяти и мощности процессора.

Не знаю, как вы, но я ожидаю, что server2 взорвёт носки server1. Однако это не тот случай, когда речь идет об обслуживании веб-страниц.

Вывод инструментов разработчика для загрузки страниц обоих серверов:

Server1Время ожидания: 314 мс

Server2Время ожидания: 5,45 с.

Как видите, с обеих машин выполняются одни и те же запросы к файлам, но сервер 1 по-прежнему доминирует.

Я попытался изучить несколько факторов, которые могут влиять на «время ожидания», но мне очень трудно определить, на что тратится время. Я изучил конфигурацию Apache2, на обеих машинах применяются одни и те же директивы и расширения модулей... сравнил код и убедился, что он идентичен... Время сети/пинга/nslookup практически одинаково.

Может ли кто-нибудь объяснить, как именно рассчитывается «Время ожидания», и какие методы можно использовать для решения проблемы?

Большое спасибо, ns


person nonshatter    schedule 31.05.2012    source источник


Ответы (1)


Да, в конце концов я докопался до сути. Хотя решение вашей проблемы, скорее всего, будет сильно отличаться от моего. «Время ожидания» — довольно широкий термин, который может относиться ко всему, что выполняется на стороне сервера.

В моем случае мне пришлось вручную отлаживать код довольно болезненным способом, печатая множество операторов microtime() вокруг кода, чтобы выяснить, где теряется время.

Оказалось, что был какой-то устаревший код, который имел от exec до /sbin/route.

В исходных 32-битных системах это выполнялось мгновенно, но на 64-битной машине это занимало более 5 секунд:

$ time /sbin/route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.10.10.1       0.0.0.0         UG    100    0        0 eth0

real    0m5.007s
user    0m0.000s
sys     0m0.004s

Не уверен, что /sbin/route обычно выполняется медленнее на 64-битной машине (если да, было бы неплохо узнать почему), или виновата была только более новая версия ОС.

person nonshatter    schedule 09.07.2012
comment
Вы знаете, что в PHP-стране вы можете использовать кэширование или какой-либо другой профилировщик, чтобы найти узкое место (узкие места). Нет необходимости в микровремени. - person Kai Sellgren; 01.04.2013