Diagnosticando aplicativo da web lento / com tempo limite

1

Estou vendo tempos médios de carregamento de load average: 12.41, 11.94, 11.59 em uma máquina baseada em Linux que atende a um aplicativo da web. Ele tem 16 núcleos, então a média de carga não é alta demais.

No entanto, este aplicativo da web está esgotando o tempo limite quando tento conectar-se a ele no momento. O que poderia estar causando isso? Isso é um pouco de bola curva.

O uso da CPU está em torno de ~ 50% para todas as CPUs (de acordo com top ). Os valores para wa estão entre 0.0 e 3.0 . Nenhuma memória swap está sendo usada, e há uma tonelada de mems livres disponíveis.

iostat mostra um valor %iowait de 0.51 . Outras estatísticas são:

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               4.88         1.02      2136.25   12365497 25895371840
sdb               0.00         0.00         0.00       9456          0
sdc               0.95         0.00       452.44       4781 5484405440

As gravações / segundo são altas - esse é um aplicativo de gravação / pesado. iotop mostra gravações vindas do pgbouncer process (um pool de conexões postgresql), de filas de tarefas assíncronas e de processos de trabalho nginx (provavelmente gravando no log de acesso). Não vejo nada acima de 6% na coluna IO> - e a maioria das linhas tem 0,00%. SWAPIN é 0.00% em todo o texto.

Em suma, a utilização da CPU não é muito importante, a utilização de memória não é o problema e não há sinais de excesso de espera relacionada a E / S acontecendo. Por que o aplicativo da Web seria infinitamente carregado / esgotado quando eu tentar acessá-lo? Poderia ser problemas em sysctl.conf ou com meu servidor da web? Precisa de uma opinião de especialista aqui.

O servidor em questão é o Ubuntu 14.04 LTS. Nginx é o servidor web, usado como um proxy reverso com Gunicorn (aplicativo web baseado em Django). O back-end é o Postgresql 9.3 e o Redis também está em jogo. O DB reside em uma VM separada.

    
por Hassan Baig 22.09.2017 / 19:29

1 resposta

0

Se você estiver trabalhando com um grande volume de conexões TCP e estiver passando por um proxy reverso como o nginx, talvez esteja encontrando Exaustão de Porta TCP . Em suma, existem teoricamente 65535 portas TCP. Se você tem um proxy reverso vindo do IP 192.168.1.1 se conectando ao seu servidor web na porta 80 em 192.168.1.2:80, você pode, portanto, fazer um número teórico máximo de conexões simultâneas através do seu proxy reverso do 65535 para a porta 80 em seu web. servidor. Depois disso, você fica sem portas de origem (conhecidas como portas efêmeras) para usar.

Mas é um pouco mais complicado do que isso: Linux por padrão é ajustado para usar somente cerca de 30000 (menor para kernels / distros antigos - tão baixo quanto 1024) dessas portas e mesmo assim ele usa um algoritmo que tentará aleatoriamente para encontrar uma porta de origem livre para uso. Quanto mais perto você chegar a essa marca de 30000, mais tentativas o kernel fará para selecionar aleatoriamente uma porta livre e quanto mais demorará para encontrar uma. Tente usar netstat, grep e wc para contar o número de conexões você tem e se você está se aproximando 30.000 esta é provavelmente a causa de seus tempos de espera. Você pode revisar as sugestões da NGINX para resolver este problema, se for o caso.

    
por 23.09.2017 / 07:20