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

Низкая пропускная способность HTTP с NGinx

На днях у меня возникла проблема, и вы, ребята, мне очень помогли. Я ломал голову над этим уже больше недели. В принципе, у меня есть несколько серверов 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 это делается как «тестовый режим» или «нагрузочный тест» - я забыл точное название.