por que tenho tantos manipuladores de soquete abertos e entradas DGRM do netstat?

3

Eu corro em um RPi (Raspbian 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l GNU/Linux ) um daemon no Python 2.7.8 que consulta várias APIs via requests e fornece uma API para outro aplicativo que faz uso dele (ambos rodam na mesma máquina) . Eu descobri recentemente nos logs (depois que o daemon foi executado por algum tempo) que eu corri para fora de manipuladores de arquivos abertos através de um requests exceção:

('Connection aborted.', error(23, 'Too many open files in system'))

Como não abro explicitamente nenhum arquivo, suspeitei que minhas chamadas http permanecessem abertas.

Eu faço uma chamada a cada 10 segundos (chamadas para o host local em sua maior parte) e depois de executar o daemon por uma ou duas horas lsof relatórios 32k + abrir sock conexões:

python2     804             pi  982u     unix 0xce3565a0        0t0     116809 socket
python2     804             pi  983u     unix 0xcb5553c0        0t0     116875 socket
python2     804             pi  984u     unix 0xcb555780        0t0     116899 socket
python2     804             pi  985u     unix 0xd74dd1e0        0t0     117010 socket
python2     804             pi  986u     unix 0xcb555d20        0t0     116918 socket

Esse número aumenta mais ou menos de acordo com a taxa das chamadas, todos os aplicativos juntos.

Eu queria forçar o fechamento dessas conexões definindo explicitamente 'Connection': 'close' no meu código, mas infelizmente isso não ajuda, lsof ainda mostra a miríade de manipuladores sock abertos.

netstat mostra uma enorme quantidade de DGRAM conexões (cerca de 12k +):

(...)
unix  2      [ ]         DGRAM                    74315
unix  2      [ ]         DGRAM                    68340
unix  2      [ ]         DGRAM                    67749
unix  2      [ ]         DGRAM                    58836
unix  2      [ ]         DGRAM                    58087
(...)

O que me preocupa ainda mais é que parece que a sequência tcp parece fechar corretamente, em um nível de rede:

Então eu estou completamente perdido aqui. O número crescente de descritores abertos é provavelmente devido às chamadas http, mas eu tenho dificuldade em entender por que eles deixam para trás os manipuladores abertos?

Observação: inicialmente eu fiz essa pergunta no SO (apontando para o meu código), mas acho que é mais orientado pelo sistema.

    
por WoJ 14.03.2015 / 19:13

0 respostas