加速套接字发送行为(在Python中)

时间:2011-07-30 01:22:24

标签: python performance sockets network-programming buffer

我有一个脚本,每秒向服务器发送5-10个请求。我最关键的要求是每秒请求数限制。它必须始终是具体的数字,而不是更多也不少。为此,我在给定的时间间隔后发送请求(减去发送上一个请求所需的时间)。

问题:某些请求的发送速度足够快,但其他请求在sock.sendall()步骤中占用了太多时间。我相信这是因为发送缓冲区已满,执行被阻止,直到缓冲区被清除。

如何更快地清除缓冲区?

我尝试的其中一个选项是禁用Nagle:

sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)

但它似乎没有改善。

尝试它的另一个选项甚至听起来太错了,就是在每次sendall()调用之前将发送缓冲区设置为请求的长度。

我能做些什么来获得每秒更可预测的请求吗?

我刚想到的另一个选项是:有几个进程每秒会执行少量请求,希望它会使结果更具可预测性。

有问题的操作系统是Centos。

更新:连接后设置套接字选项似乎是我的错误。看起来大小缓冲区只能在connect()调用之前设置。与TCP_NODELAY相同。尚未有时间测试它是否有任何区别。

2 个答案:

答案 0 :(得分:2)

  

我最关键的要求是每秒请求数限制。   它必须始终是具体的数字,而不是更多也不少。

该要求完全无法通过TCP实现。您还需要实时保证对等服务时间。

答案 1 :(得分:0)

(来自How can I force a socket to send the data in its buffer?

  

你不能强迫它。期。 TCP可以自己决定何时可以发送数据。现在,通常当你在TCP套接字上调用write()时,TCP确实会发送一个段,但是没有保证也没办法强迫它。 TCP不会发送段的原因有很多:关闭窗口和Nagle算法是我们想到的两件事。

阅读完整的帖子,它是非常深入的,并为我澄清了一些事情,例如,当禁用Nagle算法有意义时等等。