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
    ,等等
从理论上讲,可能与Python相关的一件事是
,所以\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泛洪警告?我只是暂时忽略它们,然后再次启用保护。