gpt4 book ai didi

sockets - socket recv() 是否强制刷新 socket send() 缓冲区?

转载 作者:可可西里 更新时间:2023-11-01 02:52:13 32 4
gpt4 key购买 nike

在我的应用程序中,我向服务器发送了两条小消息(类似 memcached 的服务)。在类似 Python 的伪代码中,这看起来像:

sock.send("add some-key 0")
ignored = sock.recv(...)
sock.send("incr some-key 1")
new_value = sock.recv(...)

由于服务器支持即发即弃式写入,我可以优化此代码使其看起来更像:

sock.send("add some-key 0 noreply")
sock.send("incr some-key 1")
new_value = sock.recv(...)

但是,这需要更长的时间——此版本平均需要 40 毫秒,而前者平均不到 1 毫秒。

此外,我注意到如果我使用 TCP_NODELAY 创建套接字,从而禁用 Nagle 的算法,则第二个片段的计时与第一个相似。这表明延迟发生在两个 send() 之间(“写-写-读”问题)。

我有理由相信禁用 Nagle 是适合我的应用程序的正确举措——我有相当多的相当小的写入,必须以尽可能短的延迟来处理——但我不确定为什么会这样在第一个例子中没有必要。 recv() 是否强制内核发送任何缓冲写入?我怀疑这是真的,但我无法在任何地方找到这方面的文档。

(注意这是 Linux 2.6.32 和 glibc 2.12 与 Python 2.6.8,以防其中任何一个对答案有任何影响)

最佳答案

Does recv() force the kernel to send any buffered writes?

没有。一个TCP连接的两个方向是完全独立的。

在某些情况下,Nagle 算法延迟发送一个数据包,我认为最多可以延迟 200 毫秒,以便它可以与后续写入合并。这就是您所看到的,当您禁用 Nagle 时,它​​就不会再发生了。

I suspect this is true

不是。

but I haven't been able to find documentation to that effect anywhere.

你不会的。

关于sockets - socket recv() 是否强制刷新 socket send() 缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19666524/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com