Networking TCP缓冲区是否在进程内存的地址空间中?

Networking TCP缓冲区是否在进程内存的地址空间中?,networking,tcp,linux-kernel,network-programming,operating-system,Networking,Tcp,Linux Kernel,Network Programming,Operating System,我被告知增加TCP缓冲区大小,以便更快地处理消息。 我的问题是,无论我对TCP消息ByteBuffer、DirectByteBuffer等使用什么缓冲区,每当CPU接收到来自NIC的中断以处理读取套接字数据的网络请求时,操作系统是否在请求进程i.g的地址空间之外的内存中维护任何缓冲区。正在该套接字上侦听的进程 或 无论CPU以何种方式接收网络数据,它都将始终仅写入进程地址空间的缓冲区中,并且不会为该通信维护地址空间之外的netstat命令的“Recv-Q”和“Send-Q”缓冲区。您被告知增加套

我被告知增加TCP缓冲区大小,以便更快地处理消息。 我的问题是,无论我对TCP消息ByteBuffer、DirectByteBuffer等使用什么缓冲区,每当CPU接收到来自NIC的中断以处理读取套接字数据的网络请求时,操作系统是否在请求进程i.g的地址空间之外的内存中维护任何缓冲区。正在该套接字上侦听的进程


无论CPU以何种方式接收网络数据,它都将始终仅写入进程地址空间的缓冲区中,并且不会为该通信维护地址空间之外的netstat命令的“Recv-Q”和“Send-Q”缓冲区。

您被告知增加套接字发送或接收缓冲区的大小。它们与内核TCP部分中的套接字相关联。请参见setsockopt和SO_RCVBUF和SO_SNDBUF。

请参见:


选项有sou SNDBUF和sou RCVBUF。如果直接使用C-API,则调用为setsockopt本身。如果您使用某种框架,请查看如何设置套接字选项。这实际上是一个内核端缓冲区,而不是由进程持有的缓冲区。它确定内核可以保存多少字节,以便您从读取/接收调用中提取。它还影响TCP的机制。

Linux网络堆栈接收数据的过程有点复杂。我写了一篇文章,解释了从设备驱动程序到userland程序的套接字接收队列所需要知道的一切

内核中维护缓冲区的位置很多:

数据包到达后由NIC写入的DMA环。 DMA环上的数据包引用用于处理该数据包。 最后,如果接收队列尚未满,则将数据包数据添加到进程的接收队列中。 从套接字读取将从进程的接收队列中提取数据包。 如果发生包嗅探,包数据将被复制并发送到包嗅探代码添加的任何过滤器。 在上面链接的博客文章中描述了在需要时如何移动、解释和删除数据的完整过程

现在,如果您想更快地处理消息,我想您的意思是想减少数据包处理延迟,对吗?如果是这样,你应该考虑使用它可以帮助减少数据包处理延迟。 增加接收缓冲区只会增加可以排队等待userland套接字的数据包数量。为了提高数据包处理能力,您需要仔细监视和调整网络堆栈的每个组件。您可能需要使用RPS之类的工具来增加CPU处理数据包的数量


您还需要监视网络堆栈的每个组件,以确保可用缓冲区和CPU处理能力足以处理数据包工作负载。

@downvoter您让我感到困惑。我确实正确地拼写了选项名称,很难看出OP的建议还适用于哪些项目。请解释。这个答案不仅是正确的,而且有参考依据。