我使用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。我进一步研究了这个问题。我在/ proc / 4536 / fd /中看到了我的cherrypy进程使用的文件描述符,id为4536 最初有新的插座创建并正确清理,但一小时后我发现它有大约509个未清洁的插座。所有套接字都处于CLOSE_WAIT状态。我使用以下命令获取此信息:
netstat -ap | grep "4536" | grep CLOSE_WAIT | wc -l
CLOSE_WAIT状态表示远程客户端已关闭连接。为什么cherrypy然后关闭套接字并释放文件描述符?我该怎么做才能解决问题?
我尝试使用以下内容:
cherrypy.config.update({'server.socketQueueSize': '10'})
我认为这会将随时打开的套接字数量限制为10,但根本没有效果。这是我设置的唯一配置,因此,其余的配置保持默认值。
有人会对此有所了解吗?你认为这是一个樱桃的错误吗?我该如何解决?我有办法自己关闭这些插座吗?
以下是我的系统信息:
的CherryPy-3.1.0
python 2.3.4
Red Hat Enterprise Linux ES第4版(Nahant Update 7)
提前致谢!
答案 0 :(得分:4)
我想你正在存储(内存中)一些数据,这些数据引用了套接字;例如,如果您将请求对象存储在任何地方,则可能会这样做。
关闭套接字的最后机会是它们被垃圾收集的时候;如果您正在做任何可以防止垃圾收集到达它们的事情,那就是您的问题。我建议您尝试使用CherryPy编写的Hello World程序重现;如果你不能在那里重现,你知道它在你的代码中 - 寻找你可以(直接或以其他方式)引用套接字的信息的地方。