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.
Tags networking netstat http tcp