2008-10-21 4 views
3

웹 서버로 cherrypy를 사용하고 있습니다. 그것은 내 응용 프로그램에 대한 좋은 성능을 제공하지만 거기에 아주 큰 문제가 있습니다. 거기로 소켓을 만들 수 없다는 시간의 몇 후 cherrypy 충돌이 너무 많은 파일을 엽니 다cherrypy 소켓을 닫지 마십시오

[21/Oct/2008:12:44:25] ENGINE HTTP Server 
cherrypy._cpwsgi_server.CPWSGIServer(('0.0.0.0', 8080)) shut down  
[21/Oct/2008:12:44:25] ENGINE Stopped thread '_TimeoutMonitor'.  
[21/Oct/2008:12:44:25] ENGINE Stopped thread 'Autoreloader'.  
[21/Oct/2008:12:44:25] ENGINE Bus STOPPED  
[21/Oct/2008:12:44:25] ENGINE Bus EXITING  
[21/Oct/2008:12:44:25] ENGINE Bus EXITED  
Exception in thread HTTPServer Thread-3:  
Traceback (most recent call last):  
    File "/usr/lib/python2.3/threading.py", line 436, in __bootstrap  
    self.run()  
    File "/usr/lib/python2.3/threading.py", line 416, in run 
    self.__target(*self.__args, **self.__kwargs)  
    File "/usr/lib/python2.3/site-packages/cherrypy/process/servers.py", line 73, in 
_start_http_thread  
    self.httpserver.start()  
    File "/usr/lib/python2.3/site-packages/cherrypy/wsgiserver/__init__.py", line 1388, in start 
    self.tick()  
    File "/usr/lib/python2.3/site-packages/cherrypy/wsgiserver/__init__.py", line 1417, in tick  
    s, addr = self.socket.accept()  
    File "/usr/lib/python2.3/socket.py", line 167, in accept  
    sock, addr = self._sock.accept()  
error: (24, 'Too many open files')  
[21/Oct/2008:12:44:25] ENGINE Waiting for child threads to terminate.. 

내가 무슨 일이 일어 났는지 알아 내기 위해 노력했다. 내 응용 프로그램은 파일이나 소켓 등을 열지 않습니다. 내 파일은 berkeley dbs 몇 개만 열립니다. 나는이 문제를 더 깊이 조사했다. 처음에/etc/4536/fd/ 에 새로운 cherrypy 프로세스에서 사용 된 파일 디스크립터를 보았습니다. 처음에는 새 소켓이 생성되고 올바르게 정리되었지만 한 시간 후에 청소되지 않은 소켓이 약 509 개가 발견되었습니다. 모든 소켓은 CLOSE_WAIT 상태였습니다. 다음 명령을 사용하여이 정보를 얻었습니다 :

netstat -ap | grep "4536" | grep CLOSE_WAIT | wc -l 

CLOSE_WAIT 상태는 원격 클라이언트가 연결을 종료했음을 의미합니다. 왜 cherrypy가 소켓을 닫지 않고 파일 디스크립터를 해제하지 않는가? 문제를 해결하려면 어떻게해야합니까?

나는 다음과 같이 재생하려고 :

cherrypy.config.update({'server.socketQueueSize': '10'}) 

내가이 10 언제든지 열려있는 소켓의 수를 제한하는 것이지만, 전혀 효과가 없다라고 생각했습니다. 이 설정은 내가 설정 한 유일한 설정이므로 나머지 configs는 기본값을 유지합니다.

누군가가 빛을 발할 수 있습니까? 체리 피의 버그라고 생각하니? 어떻게 해결할 수 있습니까? 이 소켓을 직접 닫을 수있는 방법이 있습니까?

다음은 내 시스템 정보입니다 :

CherryPy-3.1.0

파이썬 2.3.4

레드햇 사전에 4 (Nahant 업데이트 7)

감사 엔터프라이즈 리눅스 ES 릴리스 !

+1

최소한의 재생기를 제작하고 게시 할 수 있다면 유용 할 것입니다. 우리가 우리 자신의 환경에서 재생산 할 수 없다면 어떤 제안도 추측 일뿐입니다. –

답변

4

소켓에 대한 참조가있는 일부 데이터를 (메모리에) 저장하고 있다고 생각합니다. 예를 들어 요청 객체를 어디에서나 저장하면 가능성이 높습니다.

소켓을 가릴 수있는 마지막 기회는 가비지 수집 될 때입니다. 가비지 콜렉션이 그들에게 도달하는 것을 막을 수있는 일을한다면 문제가 있습니다. CherryPy로 작성된 Hello World 프로그램을 사용하여 재현하려고 시도하는 것이 좋습니다. 거기에서 재현 할 수 없다면 코드에 있음을 알 수 있습니다. 소켓을 (직접 또는 다른 방식으로) 참조 할 수있는 정보를 유지하는 장소를 찾습니다.

+0

아니요, 어떤 정보도 계속 제공하지 않습니다. 사실 내 서버는 읽기 전용 서버입니다. 소켓을 제외하고는 쓰기 작업이 없습니다. 소켓은 처음에 충분히 잘 수집됩니다. 시간이 갈수록이 문제가 발생합니다. – NeoAnderson

+0

다시 - 안녕하세요와 함께 재현 할 수 있습니까? –

+0

BTW, "모든 정보 유지"는 디스크 또는 데이터베이스 저장 장치가 아니라 메모리 내를 의미합니다. –

관련 문제