1

我正在 websocket 服务器上运行压力测试,以测量它可以同时服务的客户端数量以及取决于该数量的因素。

我使用的服务器实现是 pywebsocket,它是 apache 服务器的扩展。显然,这会为每个新客户创建一个新线程。

问题是我最多只能去378 个客户,总是相同的数量(而且非常低),并且对于下一个客户,我收到以下跟踪:

[2013-08-22 07:47:09,454] [ERROR] __main__.WebSocketServer: Exception in processing request from: ('::ffff:10.36.154.147', 41509, 0, 0)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 284, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 594, in process_request
    t.start()
  File "/usr/lib/python2.7/threading.py", line 495, in start
    _start_new_thread(self.__bootstrap, ())
**error: can't start new thread**

我真的不知道这个限制可能来自哪里,似乎是进程的最大线程数,我刚刚设置为无限制,或者用户的最大进程数,现在也设置为无限制.

我还检查了 apache2 配置文件,这就是我在 apache2.conf 中的内容,应该足够了:

MaxKeepAliveRequests 0
KeepAliveTimeout 5


<IfModule mpm_prefork_module>
    StartServers          50
    ServerLimit      2000
    MinSpareServers       50
    MaxSpareServers      2000
    MaxClients           2000
    MaxRequestsPerChild   2000
</IfModule>

<IfModule mpm_worker_module>
    StartServers          50
    ServerLimit      2000
    MinSpareThreads      50
    MaxSpareThreads      2000 
    ThreadLimit          0
    ThreadsPerChild      2000
    MaxClients           2000
    MaxRequestsPerChild  2000
</IfModule>

<IfModule mpm_event_module>
    StartServers          50
    ServerLimit      2000
    MinSpareThreads      50
    MaxSpareThreads      2000 
    ThreadLimit          0
    ThreadsPerChild      2000
    MaxClients           2000
    MaxRequestsPerChild  2000
</IfModule>

服务器是带有 ubuntu 的 Amazon EC2 t1.micro 实例。

还有什么可能导致此限制?

4

1 回答 1

0

对于任何会创建许多线程的代码,尝试将 ulimit -s 降低到比无限制/默认值低得多的值,并确保 /proc/sys/kernel/threads-max 不低于六位数。

于 2013-08-30T22:19:01.947 回答