编程语言
首页 > 编程语言> > python-cherrypy不关闭套接字

python-cherrypy不关闭套接字

作者:互联网

我正在使用cherrypy作为Web服务器.它为我的应用程序提供了良好的性能,但是存在很大的问题.几个小时后,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数据库.我进一步调查了这个问题.我在/ proc / 4536 / fd /中看到了ID为4536的cherrypy进程使用的文件描述符
最初,创建并正确清理了新的套接字,但是一个小时后,我发现它有大约509个未清理的套接字.所有套接字均处于CLOSE_WAIT状态.我使用以下命令获得了此信息:

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

CLOSE_WAIT状态表示远程客户端已关闭连接.为什么为什么Cherrypy然后不关闭套接字并释放文件描述符?我该怎么办才能解决问题?

我尝试玩以下游戏:

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

我以为这会限制随时打开的套接字数为10,但这根本没有效果.这是我设置的唯一配置,因此,其余配置保留其默认值.

有人可以对此解释一下吗?您是否认为这是Cherrypy的错误?我该如何解决?我有办法自己关闭这些插座吗?

以下是我的系统信息:

CherryPy-3.1.0

python 2.3.4

红帽企业Linux ES版本4(Nahant Update 7)

提前致谢!

解决方法:

我想您正在(内存中)存储一些对套接字有引用的数据;例如,如果您将请求对象存储在任何地方,则可能会这样做.

关闭套接字的最后机会是当它们被垃圾回收时.如果您在做任何阻止垃圾收集到达的事情,那就是您的问题.我建议您尝试使用用CherryPy编写的Hello World程序进行复制.如果您无法在此处重现,则知道它在您的代码中-查找您要保留可(直接或以其他方式)引用套接字的信息的位置.

标签:sockets,cherrypy,python
来源: https://codeday.me/bug/20191108/2004886.html