1

我被告知增加TCP缓冲区大小以便更快地处理消息。 我的问题是,无论我用于TCP消息(ByteBuffer,DirectByteBuffer等)的缓冲区是什么时候,只要CPU接收来自NIC的中断,处理网络请求以读取套接字数据,操作系统是否在地址空间外的内存中维护任何缓冲区请求处理的(IG其是插座上听的过程)TCP Buffer是否在进程内存的地址空间?

任何方式CPU接收到的网络数据,它将始终被写入的唯一进程地址空间和没有缓冲剂的缓冲液(包括“的Recv -Q'和'netstat命令的'Send-Q')保持在这个通信的地址空间之外?

回答

-1

您被告知增加套接字发送或接收缓冲区大小。这些与内核的TCP部分中的套接字相关联。请参阅setsockopt()SO_RCVBUFSO_SNDBUF

+0

@downvoter你让我感到困惑。我确实拼写了正确的选项名称,很难看到OP的建议可以应用到哪些地方。 – EJP

-1

请参见: http://linux.die.net/man/3/setsockopt

选项是SO_SNDBUF和SO_RCVBUF。如果您直接使用C-API,则该调用是setsockopt本身。如果您使用某种框架,请查看如何设置套接字选项。这确实是一个内核端缓冲区,而不是你的进程所拥有的缓冲区。它决定了内核可以保存多少个字节,以便您可以从通话中读取/接收。它也影响TCP的flow control机制。

+0

@downvoter请解释。这个答案不仅是正确的,而且还有一个参考。 – EJP

0

Linux网络堆栈接收数据的过程有点复杂。我写了一个comprehensive guide to the Linux network stack,它解释了从设备驱动程序直到用户空间程序的套接字接收队列所需的所有知识。

有很多地方的缓冲区保持在内核:

  1. 其中包由NIC书面他们已经抵达后,DMA环。
  2. 对DMA环上的数据包的引用用于处理数据包。
  3. 最终,如果接收队列尚未满,则会将数据包数据添加到进程'接收队列中。
  4. 从套接字读取将从进程的接收队列中取出数据包。
  5. 如果发生数据包嗅探,数据包数据将被复制并发送到由数据包嗅探代码添加的任何过滤器。

上面链接的博文中描述了数据如何移动,占据和丢弃(需要时)的完整过程。

现在,如果你想更快地处理消息,我假设你的意思是你想减少你的数据包处理延迟,对吗?如果是这样,你应该考虑使用SO_BUSYPOLL这可以帮助减少数据包处理延迟。

增加接收缓冲区正好增加了可以排队等待用户空间套接字的数据包数量。要提高数据包处理能力,您需要仔细监视和调整网络堆栈的每个组件。您可能需要使用类似RPS的内容来增加处理数据包的CPU数量。

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

相关问题