Python优化 - 服务器响应时间很糟糕

时间:2013-08-15 08:25:48

标签: python performance

我有一个通过PyPy运行的Python服务器应用程序,它使用select.epoll监视客户端的传入数据。

当数据准备就绪时,我遍历客户端,重新获取所有数据,将其分成行(如有必要)和处理。

如果该行是“〜”,我只需调用sock.send(“〜\ n”),客户端将其解释为ping响应。

根据我的个人经验,问题是ping奇怪地非常高且奇怪地变化很大,从90ms到大约3000ms,平均值为300-1000ms。 Pinging不断产生遍布整个地方的结果。 (我对服务器的“真实”ping约为85ms。)

我使用cProfile来检查是否有什么东西放慢速度,这是我得到的结果:

Thu Aug 15 04:05:56 2013    profile.out

     17401043 function calls (17399987 primitive calls) in 815.728 seconds

Ordered by: cumulative time
List reduced from 960 to 25 due to restriction <25>

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000  815.728  815.728 <string>:1(<module>)
    1    0.000    0.000  815.728  815.728 /root/app/src/serv/appserver/main.py:28(main)
    1    0.302    0.302  814.608  814.608 /root/app/src/serv/appserver/server.py:214(main_loop)
 2457  806.185    0.328  806.185    0.328 {method 'poll' of 'select.epoll' objects}
 2067    0.070    0.000    6.069    0.003 /root/app/src/serv/appserver/client.py:89(read)
 2274    0.013    0.000    5.875    0.003 /root/app/src/serv/appserver/client.py:150(handle_read_line)
 2264    0.062    0.000    5.600    0.002 /root/app/src/serv/appserver/client.py:164(handle_client_line)

我对使用Python进行性能分析没有经验,但在我看来,815秒的运行时间中有806个用于轮询,因此高响应时间不是由于过载或在其他地方浪费时间。

还有什么可能导致我的回复时间如此之高?

套接字初始化代码:

self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server_socket.bind(bind)
self.server_socket.listen(5)
self.server_socket.setblocking(0)

编辑: 我已经设置了TCP_NODELAY套接字选项。结果现在明显好转但仍然很糟糕。仍然从90ms跳到500ms到1000ms。

0 个答案:

没有答案