Taxa de transferência HTTP lenta com o NGinx

1

Eu tive um problema no outro dia e vocês foram muito prestativos. Eu estive quebrando meu cérebro por mais de uma semana. Basicamente, eu tenho vários servidores nginx invertendo o proxy de um aplicativo python rodando no uwsgi que está servindo respostas HTTP muito lentas quando a latência é (um pouco) alta. Cada servidor tem uma conexão de internet de 2Gb e estou conectado a mais de 200Mb. Estou a 50ms do servidor.

Quando executo o apachebench no servidor no mesmo datacenter, estes são os resultados:

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)  

Qual é o que eu esperaria.

No entanto, quando executo o apachebench no meu computador, é isso que recebo:

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

Isso é cerca de três vezes o tempo de processamento e cerca de um terço da taxa de transferência rápida. A única diferença é a latência. Por que a latência causaria uma queda tão grande na velocidade de transferência? Isso causa atrasos visíveis em nosso site. Parece que o nginx não envia toda a carga útil de uma vez, em vez disso, espera por pacotes ACK antes de enviar mais carga útil, fazendo com que a latência diminua a taxa de transferência. Eu olhei através do tcpdump e parece que o nginx está apenas enviando 4k de dados por pacote também.

Algum de vocês tem alguma recomendação sobre como eu acelero essa conexão para que ela utilize a largura de banda total disponível? Obrigada!

    
por George Sibble 11.01.2016 / 22:05

1 resposta

0

Quando fiz um teste de carga em um site que estou desenvolvendo, obtive 250 transações por segundo em uma conexão rápida com um computador rápido, de um servidor no mesmo data center obtive 2500 transações por segundo.

A latência é a resposta, como você disse. Apenas acrescenta tempo antes que o trabalho possa ser feito, portanto, o tempo de espera. A carga também será menor.

Você usou apenas uma conexão e fez dez solicitações (a simultaneidade é uma). Se sua latência for de 250 ms, você terá 2,5 segundos de tempo de espera testando a partir de uma conexão remota - talvez o dobro disso, pois os dados são bidirecionais. Se você tivesse apenas 5ms de latência, isso seria reduzido para 50ms, o que é imperceptível.

Se você quiser usar sua conexão completa para carregar o teste do seu sistema, precisará executar muitos testes em paralelo - 20, 50, talvez 1000. Isso está aumentando a simultaneidade. Em Siege, isso é feito como modo "benchmark" ou "teste de carga" - esqueço o nome exato.

    
por 11.01.2016 / 22:34