首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python上的SocketServer

python上的SocketServer
EN

Stack Overflow用户
提问于 2012-10-11 06:41:40
回答 1查看 736关注 0票数 1

我将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处理程序,因为留下许多僵尸进程也不太好,特别是在长期运行之后。

谢谢你的任何想法。

EN

回答 1

Stack Overflow用户

发布于 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 )。

这可能是你的问题。

  • 这个:http://bugs.python.org/issue7978

  • 这个:http://mail.python.org/pipermail/python-bugs-list/2010-April/095492.html

  • 这个:http://twistedmatrix.com/trac/ticket/733 您将看到不鼓励SIGCHLD处理程序,除非您采取一些额外措施(在处理程序中使用signal.siginterrupt(signal.SIGCHLD, False),或者在select()调用中使用唤醒fd )。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12833645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档