Python SocketServer中的奇怪行为
我使用从Python SocketServer中的奇怪行为,python,sockets,Python,Sockets,我使用从SocketServer.BaseRequestHandler继承的类创建了一个python套接字服务器,覆盖了setup和handle方法。当然,SocketServer.BaseRequestHandler.setup在我自己的setup的末尾被调用 这是我的服务器类 class MyServer(SocketServer.ForkingMixIn, SocketServer.TCPServer): timeout = 30 典型的分叉套接字服务器 下面是我如何运行我的服务
SocketServer.BaseRequestHandler
继承的类创建了一个python套接字服务器,覆盖了setup
和handle
方法。当然,SocketServer.BaseRequestHandler.setup
在我自己的setup
的末尾被调用
这是我的服务器类
class MyServer(SocketServer.ForkingMixIn, SocketServer.TCPServer):
timeout = 30
典型的分叉套接字服务器
下面是我如何运行我的服务器
while True:
try:
server = MyServer((host, port), MyRequestHandler)
print('Server listening on', (host, port))
server.timeout = 300 # seconds
server.serve_forever()
except:
print('Error with server, retrying in 5 seconds...')
print(sys.exc_info())
sleep(5)
主机
和端口
是预定义的,没有问题
服务器工作正常,但客户端数达到40时除外。在此号码之后,将不接受任何新连接,所有连接都将被拒绝。我用自己系统中的客户端测试python脚本检查了这一点。只有40岁
为什么40?我已经检查了SocketServer的源代码,没有发现任何与此相关的内容。我目前对这个问题没有任何线索。任何,我是认真的,任何帮助都是感激的:))
提前谢谢
OS:CentOS 6.5这可能与Python无关。调整Linux内核,在测试阶段执行以下操作:
- 关闭syncookies
- 增加可供用户使用的文件句柄(打开的每个套接字都会使用一个文件句柄-可能您已经用完了?)
- 看看这样的东西:
- 以及:
- 检查是否安装了fail2ban之类的东西()
- 检查
是否应用了速率限制(在测试阶段,您可以在确保默认链策略为iptables
后执行接受
)iptables-F
- 最后但并非最不重要的是,检查
,dmesg
,/var/log/messages
,等等/var/log/syslog
,所以\u REUSEADDR
:
检查是否已将其设置为插座
更新:
我刚刚意识到,由于套接字服务器的最大连接数为40个,实际上非常低,最简单的选择可能是通过
systrace
运行套接字服务器,只需使用-f
标志来跟踪分叉进程。例如,您可以启动套接字服务器,同时打开35个连接,然后将systrace
连接到正在运行的进程,再设置5个连接,然后查看systrace
报告的内容。在这种情况下,系统调用通常会失败,并出现在systrace中可见的错误,从而可以相对容易地查明根本原因。我现在真的知道我是如何在源代码中遗漏了这一点
class ForkingMixIn:
"""Mix-in class to handle each request in a new process."""
timeout = 300
active_children = None
max_children = 40
是的,现在我看到了max_children
属性
感谢大家
CentOS 6.5 x86_64
,以及uname-a
输出:Linux CDSX001 2.6.32-220.4.2.el6.x86_64#1 SMP Tue Feb 14 04:00:16 GMT 2012 x86_64 x86_64 GNU/Linux
您是指同时连接的客户端数量达到40时吗?或者总共进行了40次连接(不是同时进行所有连接)?“ulimit-Hn”和“ulimit-Sn”的输出是什么?我指的是40个同时连接。之后,任何请求都被拒绝。硬限制和软限制都是1024,远远超过我看到的限制。AFAIK,每个进程的文件描述符限制是1024,所以这不应该是我的问题。在每个fork中,我连接到一个MongoDB服务器和一个日志文件,因此每个fork大约使用3个FD。另一件事是,我使用原始套接字和多处理模块测试了同一个套接字服务器,其中一个可以同时接受大约500个客户端。完全不同。但是无论如何,谢谢你,我会仔细研究你的每一个建议。我发现在xxxx端口上有很多潜在的SYN泛滥。发送cookies。在dmesg
中,以及/var/log/messages
中。似乎是个问题。我怎么能再挖这个?我读了这个http://www.cyberciti.biz/faq/enable-tcp-syn-cookie-protection/
和禁用(0-ed)同步ookies,但这似乎是一个安全问题。非常感谢您的一点指导:-)好的,请看我自己的答案。顺便问一下,我应该如何处理SYN泛洪警告?我只是暂时忽略它们,然后再次启用保护。