nginx clobber o tráfego do sftp durante os horários de pico - é a resposta?

5

Esta é provavelmente uma continuação do meu anterior (sem resposta) pergunta porque a causa subjacente é provavelmente a mesma.

Eu tenho um servidor Linux com nginx e sshd rodando nele. Está em um link unmetered de 100mbit / s compartilhado. Durante os "horários de pico" (basicamente, durante o dia nos EUA), o desempenho do sftp se torna muito ruim, às vezes o tempo limite antes que eu possa me conectar. O ssh não é afetado. Eu sei que é nginx porque quando eu paro nginx, o problema com o sftp desaparece instantaneamente. No entanto, o próprio nginx possui essencialmente latência zero durante esses "episódios".

Este é um problema de longa data com o meu servidor, e decidi recentemente resolvê-lo de uma vez por todas. Ontem eu comecei a suspeitar que o grande volume de tráfego HTTP, juntamente com a maior latência induzida pela falta de largura de banda do upstream, estava eliminando o tráfego do meu tráfego. Eu usei tc para adicionar alguma priorização:

/sbin/tc qdisc add dev eth1 root handle 1: prio 
/sbin/tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dport 22 0xffff flowid 1:1
/sbin/tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip sport 22 0xffff flowid 1:1
/sbin/tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip protocol 1 0xff flowid 1:1

Infelizmente, embora eu possa ver os pacotes sftp se acumulando no primeiro prio:

class prio 1:1 parent 1: 
 Sent 257065020 bytes 3548504 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
class prio 1:2 parent 1: 
 Sent 291943287326 bytes 206538185 pkt (dropped 615, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
class prio 1:3 parent 1: 
 Sent 22399809673 bytes 15525292 pkt (dropped 2334, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

... a latência ainda é inaceitável ao se conectar. Aqui estão alguns gráficos bonitos que fiz agora, tentando correlacionar algo com a latência do sftp:

Aquiestáalatênciadosftpdeumlocaldiferente.Eutenhootempolimitedefinidoem25segundos.Qualquercoisamaiordoqueos1-2segundosnormaisnecessáriosparaconectarebaixarumpequenoarquivoéinaceitávelparamim.Vocêpodevercomoficatudobemduranteanoiteedepoisalatênciaentraemaçãonovamenteduranteodia.

Conteúdo de /proc/net/sockstat . Observe a correlação aparente da latência do sftp com o uso da memória TCP. Não faço ideia do que isso significa.

Saídadomódulodestubdonginx.Nadaparaveraqui...

Saída de netstat -tan | awk '{print $6}' | sort | uniq -c . Mais uma vez, parece plana.

Então, por que o tc não funciona para mim? Preciso realmente limitar a largura de banda em vez de apenas priorizar a entrada e a saída da porta 22? Ou é tc a ferramenta errada para o trabalho e eu estou totalmente perdendo a verdadeira causa do mau desempenho do sftp?

Saída de uname -a :

Linux [redacted] 3.2.0-0.bpo.2-amd64 #1 SMP Fri Jun 29 20:42:29 UTC 2012 x86_64 GNU/Linux

Estou executando o nginx 1.2.2 com o módulo de streaming mp4 compilado.

Editar 2012/07/31:

ewwhite perguntou se estou perto ou no limite de largura de banda. Eu verifiquei e parece haver uma correlação (embora não perfeita) entre o limite de 100 mbit e a latência do sftp ruim:

Por que, no entanto, o tráfego sftp (associado à porta 22) não seria priorizado mais do que o tráfego HTTP durante esses episódios?

Editar 2012/07/31 # 2

Na coleta de dados de latência do sftp / scp, notei um padrão, conforme mostrado no gráfico abaixo (as linhas verdes que adicionei):

Doisclusters-subtraindoalatênciade"linha de base", eles estão em ~ 5 e ~ 10 segundos. Você também pode vê-los claramente no gráfico de latência do sftp acima em uma escala de tempo muito maior. De onde vem esse número de 5 segundos?

    
por njahnke 28.07.2012 / 18:15

2 respostas

2

Algumas coisas surgem em mim ...

  • Você não está no limite máximo ou está se aproximando dos limites de largura de banda, está?
  • Você observou os níveis do pool de entropia do sistema durante o período de desempenho lento do sftp (verifique /proc/sys/kernel/random/entropy_avail ) Por exemplo. são suas sessões nginx fazendo muitas solicitações SSL? Isso pode ter um efeito claro em outros serviços que usam criptografia.
  • Existem alguns parâmetros de ajuste sysctl.conf que podem ajudar (tcp tamanho da janela?), mas o sftp não é muito eficiente. A scp é uma opção? Qual o tamanho dos arquivos?
  • DNS? Você está encontrando atrasos de pesquisa inversa? Você tem algum controle sobre quem está se conectando com você? Se for previsível, tente uma entrada de stub para os IPs de origem em /etc/hosts para ver se isso ajuda.
por 31.07.2012 / 02:56
1

Então acontece que eu tive pelo menos três problemas diferentes mascarando um ao outro. Veja o que fiz para resolver os problemas:

  1. Priorize o tráfego ICMP e de entrada / saída na porta 22 (conforme mostrado na minha pergunta acima). Isso aumenta a capacidade de resposta do sftp (por exemplo, ls ) e também a taxa de transferência de transmissão durante os horários de pico.

  2. Resolva a falta de entropia instalando o pacote haveged via backports da Debian. Isso resolve o "aguardar alguns minutos em select() " questão. ewwhite ++

  3. Adicione UseDNS no a /etc/ssh/sshd_config e rehash sshd . Isso resolve o atraso do sftp em intervalos de 5 segundos durante os horários de pico. Sergey Vlasov ++

Mistérios remanescentes:

  • Meu host configurou inicialmente /etc/resolv.conf para mim, adicionando dois dos seus servidores de nomes como primários. É compreensível que um ou mais desses servidores de nomes estejam sobrecarregados durante os horários de pico (ou seja, durante o dia nos EUA), resultando nos atrasos de intervalo de 5 segundos que notei nos gráficos de latência do sftp. No entanto, por que sftp executa uma pesquisa de DNS reversa toda vez que eu transfiro um arquivo ? Foram estes casos simplesmente quando a pesquisa inversa atingiu o tempo limite na conexão inicial e, em seguida, na primeira transferência, o subsistema sftp tentou novamente e novamente não conseguiu reverter o meu IP? O sistema não tenta os servidores de nomes secundários neste caso? De qualquer forma, adicionei agora alguns servidores de nomes públicos conhecidos como primários sobre os sobrecarregados do meu provedor de serviços de Internet, para que outros possíveis aplicativos executados nesse mesmo servidor não tenham problemas com o DNS durante os horários de pico.

  • O que está consumindo a entropia no meu servidor? Não consegui encontrar nenhuma evidência de que o estoque nginx (servindo arquivos estáticos) chama rand() , e ainda assim parece ser exatamente o que está acontecendo. É o sistema de arquivos (ext3 / 4) ou é outra parte do kernel envolvida de alguma forma?

De qualquer forma, isso é bom o suficiente por enquanto. Graças a essa comunidade, consegui resolver um dos problemas mais irritantes e persistentes que encontrei em mais de dez anos de administração de servidores web unix.

    
por 01.08.2012 / 21:31