我被告知要增加TCP缓冲区大小,以便更快地处理消息。我的问题是,无论我使用什么缓冲区(ByteBuffer,DirectByteBuffer等),每当中央处理器接收到来自网卡的中断时,为了处理读取套接字数据的网络请求,操作系统是否在请求进程的地址空间之外的内存中保留任何缓冲区(例如,监听该套接字进程)
或
无论CPU以何种方式接收网络数据,它总是只写入进程地址空间的缓冲区中,并且不会为此通信维护地址空间之外的缓冲区(包括netstat命令的'Recv-Q‘和'Send-Q’)?
发布于 2016-08-04 05:25:28
Linux网络堆栈接收数据的过程有点复杂。我编写了一个comprehensive guide to the Linux network stack,解释了从设备驱动程序到用户端程序的套接字接收队列所需了解的所有内容。
在内核中有很多地方维护了缓冲区:
如果接收队列还未满,数据包将被添加到进程的接收队列中。
在上面链接的博客文章中描述了如何移动、记帐和删除(当需要时)数据的完整过程。
现在,如果您想更快地处理消息,我假设您的意思是想要减少数据包处理延迟,对吗?如果是这样的话,您应该考虑使用SO_BUSYPOLL,它可以帮助减少数据包处理延迟。
增加接收缓冲区只会增加可为用户区套接字排队的数据包数量。为了提高数据包处理能力,您需要仔细监视和调整网络堆栈的每个组件。您可能需要使用RPS之类的方法来增加处理数据包的CPU数量。
您还需要监控网络堆栈的每个组件,以确保可用的缓冲区和CPU处理能力足以处理数据包工作负载。
发布于 2016-08-03 16:22:49
您被告知要增加套接字发送或接收缓冲区的大小。它们与内核的TCP部分中的套接字相关联。请参见setsockopt()和SO_RCVBUF和SO_SNDBUF。
发布于 2016-08-03 16:26:22
请参阅:http://linux.die.net/man/3/setsockopt
选项包括SO_SNDBUF和SO_RCVBUF。如果直接使用C-API,则调用setsockopt本身。如果您使用某种框架,请查看如何设置套接字选项。这确实是一个内核端缓冲区,而不是由您的进程持有的缓冲区。它确定内核可以保留多少字节供您从读取/接收调用中获取。这也影响了flow control协议的机制。
https://stackoverflow.com/questions/38735424
复制相似问题