select () trava devido ao esgotamento de recursos - mas qual recurso?

3

Conectar-se ao meu servidor via sftp às vezes resulta em um problema:

if (select(max+1, rset, wset, NULL, NULL) < 0) {

que é a linha 1428 do sftp-server.c do openssh 5.2p1 (loop principal do sftp_server_main ()).

O mesmo travamento ocorre ao abrir uma conexão de dados sobre, por exemplo, baunilha FTP. Às vezes sou capaz de passar depois de alguns segundos ou minutos, mas às vezes a conexão expira no lado do cliente antes que o servidor seja capaz de responder. Quando o servidor responde e Estou conectado, então se eu emitir, por exemplo 'ls' vai ficar novamente no select () por algum tempo.

ssh está OK; pode se conectar sem atrasos e emitir comandos, etc.

Eu não acho que seja a morte da tomada:

root@dl:~# cat /proc/net/sockstat
sockets: used 304
TCP: inuse 444 orphan 302 tw 152 alloc 451 mem 5280
UDP: inuse 4
RAW: inuse 0
FRAG: inuse 0 memory 0

root@dl:~# netstat -tan | awk '{print $6}' | sort | uniq -c
    2 CLOSE_WAIT
  121 CLOSING
    1 established)
  109 ESTABLISHED
    17 FIN_WAIT1
    9 FIN_WAIT2
    1 Foreign
  300 LAST_ACK
    20 LISTEN
    2 SYN_RECV
  433 TIME_WAIT

Também não parece estar fora dos descritores de arquivo, mas eu não estou 100% certeza disso. E mesmo se fosse, isso não produziria um erro, não pendurar?

Parece estar um pouco relacionado ao número de conexões O nginx está sendo veiculado. Eu posso desligar o nginx e o problema vai longe. Dito isto, o nginx e o apache são capazes de coexistir este estado sem nenhum problema (o apache nunca trava). As pessoas também podem conectar-se a um servidor de IRC na mesma máquina sem problemas durante esses "episódios". Então, talvez seja limitado a selecionar ()?

Qual recurso é nginx usando que não é soquetes / descritores de arquivo que está causando select () para travar? Estou puxando meu cabelo por isso.

Eu tentei todas as coisas usuais de ajuste de rede (as várias configurações através de sysctl, reduzindo os tempos limite), tudo sem efeito. A máquina não está sem RAM e a CPU e a E / S estão bem.

Linux dl 2.6.26-2-486 #1 Sat Jun 11 14:47:34 UTC 2011 i686 GNU/Linux

Está executando o Debian Lenny.

O que pode fazer com que select () pendure na verificação de alguns soquetes?

    
por njahnke 10.04.2012 / 01:36

2 respostas

0

Agora resolvi esse problema; consulte minha pergunta mais recente para os detalhes. Basicamente, o servidor sofria de uma falta de entropia (verificada usando cat /proc/sys/kernel/random/entropy_avail ). Instalando o pacote haveged via backports da Debian resolveu o problema muito longo ao usar sftp , que presumivelmente se conecta ao que David Schwartz disse ("Nenhuma informação foi recebida ainda") ... porque não pôde ser criptografada. Não está claro para mim neste momento porque ssh não foi afetado (ou não foi afetado tanto).

    
por 01.08.2012 / 21:50
1

Duas coisas:

  1. Um bug no código chamando 'select'.

  2. Nenhuma informação foi recebida ainda.

por 10.04.2012 / 01:42