
나는 다양한 API를 쿼리하고 이를 사용하는 다른 응용 프로그램에서 사용할 API를 제공하는 RPi(Raspbian ) 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l GNU/Linux
에서 Python 2.7.8의 데몬을 실행하고 있습니다 requests
(둘 다 동일한 컴퓨터에서 실행 중입니다). 나는 최근 로그에서(데몬이 한동안 실행된 후) 예외를 통해 열린 파일 핸들러가 부족하다는 사실을 발견했습니다 requests
.
('Connection aborted.', error(23, 'Too many open files in system'))
명시적으로 파일을 열지 않았기 때문에 내 http
통화가 열려 있는 것으로 의심됩니다.
나는 약 10초마다(주로 localhost로) 호출하고 한두 시간 동안 데몬을 실행한 후 lsof
32,000개가 넘는 열린 연결을 보고합니다 sock
.
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
이 숫자는 모든 애플리케이션의 호출 속도에 따라 다소 증가합니다.
'Connection': 'close'
코드에서 명시적으로 설정하여 이러한 연결을 강제로 닫고 싶었지만 불행히도 이것이 도움이 되지 않았습니다. lsof
셀 수 없이 많은 열린 sock
핸들러가 여전히 표시되었습니다.
netstat
많은 수 DGRAM
의 연결 표시(약 12,000개 이상):
(...)
unix 2 [ ] DGRAM 74315
unix 2 [ ] DGRAM 68340
unix 2 [ ] DGRAM 67749
unix 2 [ ] DGRAM 58836
unix 2 [ ] DGRAM 58087
(...)
더 걱정되는 점은 tcp 시퀀스가 네트워크 수준에서 올바르게 닫히는 것 같다는 것입니다.
그래서 나는 여기서 길을 잃었습니다. 열린 설명자 수의 증가는 http 호출로 인한 것일 수 있지만 왜 그들이 열린 핸들러를 남겨두는지 이해하는 데 어려움이 있습니까?
참고: 원래 이 질문은 SO(내 코드를 가리키며)에 대해 질문했지만 시스템 지향적이라고 생각합니다.