На днях у меня возникла проблема, и вы, ребята, мне очень помогли. Я ломал голову над этим уже больше недели. В принципе, у меня есть несколько серверов nginx, выполняющих обратное проксирование приложения python, работающего на uwsgi, которые обслуживают очень медленные HTTP-ответы, когда задержка (несколько) высока. Каждый сервер имеет подключение к Интернету 2 ГБ, и я сам подключился на более чем 200 МБ. Я нахожусь в 50 мс от сервера.
Когда я запускаю apachebench на сервере в том же центре обработки данных, я получаю следующие результаты:
Document Length: 68093 bytes
Concurrency Level: 1
Time taken for tests: 0.912 seconds
Complete requests: 10
Failed requests: 0
Total transferred: 685380 bytes
HTML transferred: 680930 bytes
Requests per second: 10.96 [#/sec] (mean)
Time per request: 91.217 [ms] (mean)
Time per request: 91.217 [ms] (mean, across all concurrent requests)
Transfer rate: 733.76 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 89 91 1.9 91 95
Waiting: 81 84 1.9 83 87
Total: 89 91 1.9 91 95
Percentage of the requests served within a certain time (ms)
50% 91
66% 91
75% 93
80% 93
90% 95
95% 95
98% 95
99% 95
100% 95 (longest request)
Это примерно то, что я ожидал.
Однако когда я запускаю apachebench со своего компьютера, я получаю следующее:
Document Length: 68093 bytes
Concurrency Level: 1
Time taken for tests: 2.827 seconds
Complete requests: 10
Failed requests: 0
Total transferred: 685380 bytes
HTML transferred: 680930 bytes
Requests per second: 3.54 [#/sec] (mean)
Time per request: 282.739 [ms] (mean)
Time per request: 282.739 [ms] (mean, across all concurrent requests)
Transfer rate: 236.73 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 47 48 1.6 48 51
Processing: 223 234 15.7 230 278
Waiting: 130 138 13.9 134 177
Total: 272 283 16.7 277 328
Это примерно в три раза больше времени обработки и примерно в три раза меньше скорости передачи. Единственное отличие - задержка. Почему задержка может вызвать такое резкое падение скорости передачи? Это вызывает заметные задержки на нашем веб-сайте. Похоже, что nginx не отправляет всю полезную нагрузку сразу, вместо этого ожидая пакетов ACK перед отправкой дополнительной полезной нагрузки, что приводит к снижению пропускной способности задержки. Я просмотрел tcpdump, и оказалось, что nginx также отправляет только 4 КБ данных на пакет.
Есть ли у кого-нибудь рекомендации, как мне ускорить это соединение, чтобы оно использовало всю доступную пропускную способность? Спасибо!
Когда я проводил нагрузочный тест на разрабатываемом веб-сайте, я получил 250 транзакций в секунду при быстром подключении к быстрому компьютеру, с сервера в том же центре обработки данных я получил 2500 транзакций в секунду.
Как вы сказали, ответ - это задержка. Это просто добавляет время, прежде чем можно будет сделать работу, так что время ожидания. Нагрузка тоже будет ниже.
Вы использовали только одно соединение и выполнили десять запросов (параллелизм - один). Если ваша задержка составляет 250 мс, тогда у вас есть 2,5 секунды тестирования времени ожидания от удаленного соединения - возможно, вдвое больше, поскольку данные идут в обе стороны. Если у вас была задержка всего 5 мс, она уменьшается до 50 мс, что незаметно.
Если вы хотите использовать полное соединение для нагрузочного тестирования вашей системы, вам необходимо запустить несколько тестов параллельно - 20, 50, может быть, 1000. Это увеличивает параллелизм. В Siege это делается как «тестовый режим» или «нагрузочный тест» - я забыл точное название.