我将Python (2.7) SocketServer与ForkingMixIn结合使用。效果很好。
然而,有时在大量使用(大量快速连接/断开客户端)时,“服务器”卡住了,消耗掉了所有空闲的CPU (顶部显示的是100%的CPU )。如果我在这个过程中使用来自CLI的strace,它就会显示它做了无穷无尽的等待use () syscall序列。根据命令"ps“,此时没有子进程。
在这个问题发生后,我的服务器实现无法使用,只有它的重新启动才有帮助:(客户机可以连接,但没有anwser,我猜只在OS端使用了"backlog“队列,但是python代码从不接受连接。
它可以很容易地被复制,例如与一些优先的HTTP实现,和一个浏览器(我使用铬)与CTRL(重新加载)按住大约10秒。当然,如果没有这种“残酷”的“尝试”以及“对正常使用的尝试”,这个问题就会被触发,甚至很难想到什么是问题。我用SocketServer ()和套接字函数编写了我自己的实现,它没有这个问题,但是我更喜欢一些“已经准备好”和“标准”的解决方案。
问题是:这不是一件好事,因为我的脚本实现服务器可以很容易地这样做。
我注意到:我为SIGCHLD安装了一个信号处理程序。如果我删除它,我就不能重现这个问题,但是我可以看到僵尸进程(我猜因为它们不是wait()'ed)。即使我用signal.SIG_IGN安装信号处理程序,我也会遇到这个问题。
有人能帮上忙吗?我怎么能解决这个问题?无论如何,我都想使用singal处理程序,因为留下许多僵尸进程也不太好,特别是在长期运行之后。
谢谢你的任何想法。
发布于 2012-10-11 07:33:53
可能是相关的:WAIT on the server side?
有可能所有的最大连接都处于time_wait状态。
sysctl net.core.somaxconn是否有最大连接。sysctl net.ipv4以获得其他配置细节(例如tw )ulimit -n是否有最大的打开文件描述符(包括套接字)sysctl net.ipv4.tcp_tw_reuse=1来快速重用这些套接字(除非您知道自己在做什么,否则不要继续启用它)。不是那么愚蠢的问题:您的SocketServer实现与标准的one + ForkingMixIn有何不同?
但是,很容易滥用ForkingMixIn (叉弹),您可能需要使用绿色线程,例如eventlet库( http://eventlet.net/doc/index.html )。
这可能是你的问题。
SIGCHLD处理程序,除非您采取一些额外措施(在处理程序中使用signal.siginterrupt(signal.SIGCHLD, False),或者在select()调用中使用唤醒fd )。https://stackoverflow.com/questions/12833645
复制相似问题