cuốn sách gpt4 ai đã làm

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

In lại Tác giả: Hồ Xil 更新时间:2023-11-01 02:52:13 32 4
mua khóa gpt4 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,以防其中任何一个对答案有任何影响)

câu trả lời hay nhất

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
Hồ Xil
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress