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

Почему 20 запросов выполняются параллельно медленнее, чем 10x2?

Этот вопрос беспокоит меня, и я не думаю, что сам найду ответ, поэтому решил, что лучше всего будет обратиться за помощью.

Когда я делаю:

root@server1:~$ ab -n 20 -c 20 http://www.testserver.com/

Продолжительность 4 секунды.

Когда я это сделаю (одновременно):

root@server1:~$ ab -n 10 -c 10 http://www.testserver.com/
root@server2:~$ ab -n 10 -c 10 http://www.testserver.com/

Общая продолжительность составляет 2,5 секунды.

Я должен думать, что тестовый сервер не беспокоит место, откуда приходят запросы, и я предполагаю, что тестовый сервер, а также server1 и server2 не достигают предела пропускной способности (страница не такая уж тяжелая).

Чем это вызвано? Ответ, вероятно, будет действительно глупым, но я все равно буду счастлив.

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

Вам необходимо изучить нагрузку на сервер и найти узкое место.

Также 10 запросов - это слишком мало, чтобы делать какие-либо выводы. Правильное тестирование требует, чтобы вы контролировали процесс работы системы и определяли период прогрева системы, когда факторы нагрузки стабилизируются. После разминки вы можете запускать реальные тесты и статистически исследовать их результаты, чтобы убедиться, что они действительны.

Когда вы запускаете 1 процесс, весь процессор просто работает для этого одного процесса. (ок, и немного для ядра). Когда вы запускаете 2 процесса, ядро ​​должно переключаться между ними, и при каждом переключении оно должно сохранять некоторые данные для оперативной памяти, а затем извлекать их, что вызывает некоторые накладные расходы, поэтому - больше процессов - больше накладных расходов.

Кроме того, это зависит от того, сколько рабочих apache запущено в данный момент. Если запущено 10, им просто нужно серверить страницу. Если вы запускаете 20 параллельных подключений, нужно запустить еще 10 работ, которые используют ресурсы (или запросы должны ждать).