Назад | Перейти на главную страницу

Почему время отклика статической страницы увеличивается с увеличением количества одновременных запросов

Я не понимаю производительность, которую я вижу от apache. Я ожидал, что большее количество одновременных запросов apache будет работать лучше, чем меньшее, до определенного момента, но за пределами 3 одновременных запросов общая производительность остается неизменной. Например, я вижу одни и те же запросы в секунду, если у меня есть 3 или 4 одновременных запроса. С каждым дополнительным параллельным запросом среднее время ответа увеличивается, так что общая скорость обработки запроса остается неизменной.

Чтобы проверить это, я создал новый ubuntu 10.04 vm на slicehost. Это 4-х ядерный vm. Я установил это с

aptitude update
aptitude install apache2 apache2-utils curl
curl localhost/ # verify hello world static page works

Затем я измерил время отклика и запрос / сек.

Редактировать 4: Я тестировал что-то вроде «for x in $ (seq 1 40); do ab -n 10000 -c $ x -q localhost / | grep any; done».

Точные команды и данные находятся на https://docs.google.com/spreadsheet/pub?hl=en_US&hl=en_US&key=0AurdDQB5QBe7dGtiLUc1SWdOeWQ4dGo3VDI5Yk8zbWc&output=html

Во время выполнения тестов загрузка процессора составляла около 25% на каждом ядре.

Изменить 2: использование памяти было 45/245 МБ в соответствии с htop.

Изменить 1: я просто попробовал то же самое на ubuntu 11.04 vm, и общая проблема такая же, но производительность еще хуже: она составляет около 2100 запросов / сек для большинства уровней параллелизма и использует около 50% ЦП на каждое ядро .

Изменить 3: я попробовал его на реальном оборудовании и увидел пиковые запросы в секунду около 4 или 5 одновременных запросов, а затем он немного упал и выровнялся.

Может ли кто-нибудь объяснить, почему это происходит, как я могу выяснить, в чем проблема, или как я могу это исправить? Я поискал и не нашел ответов.

Я не понимаю производительность, которую я вижу от apache. Я ожидал, что большее количество одновременных запросов apache будет работать лучше, чем меньшее, до определенного момента, но за пределами 3 одновременных запросов общая производительность остается неизменной.

Похоже, вы видите именно то, что ожидали. Чем больше одновременных запросов, тем выше производительность Apache, вплоть до определенного момента, а затем производительность остается неизменной. Что вас удивило, так это то, что проблема возникает при небольшом количестве одновременных запросов.

Не знаю, почему вы находите это удивительным. Здесь нет реального дискового ввода-вывода, поскольку страница наверняка находится в ОЗУ. Так что это чисто деятельность, связанная с процессором и сетью. Как только у вас будет достаточно запросов, чтобы вы могли связать все ядра и заполнить сеть одним запросом, будет ли расти другой запрос, нет никаких причин, по которым большее количество ожидающих подключений может улучшить ситуацию.

Так что остается только вопрос о том, что является ограничивающим фактором. Трудно сказать без более подробной информации, но я бы посмотрел на объем использования ЦП системы и пропускную способность сети. Скорее всего, ЦП или сетевой интерфейс перегружены.

Ознакомьтесь с (еще не официальной) документацией по производительности в Apache httpd wiki:

http://wiki.apache.org/httpd/PerformanceScalingUp

Заключительное слово: я не знаю, что означает «виртуальная машина» в вашем случае, но это может быть узким местом в производительности.

Вероятно, вы заметите влияние накладных расходов на сетевой стек. При увеличении параллелизма у вас будет открываться больше одновременных подключений, поэтому системе и apache придется усерднее работать, чтобы открывать и закрывать эти подключения. Обычно это снижает производительность Apache и приводит к увеличению среднего времени выполнения запроса на уровнях параллелизма.

Я также подозреваю, что у вас было больше дочерних процессов Apache, работающих на более высоких уровнях параллелизма. Это требует времени, чтобы раскрутить их вверх и вниз.

Проблемы с сетью могут быть еще более сложными, если вы запускаете тест в той же системе, что и веб-сервер.

Настройка стека TCP / IP, настроек KeepAlive (если включено) и таймаутов может улучшить это.

Однако это давно известная проблема масштабирования apache.

Вот классическая статья по этой теме. PDF: http://www.stdlib.net/~colmmacc/Apachecon-EU2005/scaling-apache-handout.pdf