首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TCP缓冲区是否在进程内存的地址空间中?

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

Stack Overflow用户
提问于 2016-08-03 13:52:47
回答 3查看 1.8K关注 0票数 2

我被告知要增加TCP缓冲区大小,以便更快地处理消息。我的问题是,无论我使用什么缓冲区(ByteBuffer,DirectByteBuffer等),每当中央处理器接收到来自网卡的中断时,为了处理读取套接字数据的网络请求,操作系统是否在请求进程的地址空间之外的内存中保留任何缓冲区(例如,监听该套接字进程)

无论CPU以何种方式接收网络数据,它总是只写入进程地址空间的缓冲区中,并且不会为此通信维护地址空间之外的缓冲区(包括netstat命令的'Recv-Q‘和'Send-Q’)?

EN

回答 3

Stack Overflow用户

发布于 2016-08-04 05:25:28

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

在内核中有很多地方维护了缓冲区:

如果接收队列还未满,数据包将被添加到进程的接收队列中。

  • 从套接字读取将从进程的接收队列中提取数据包。

  • 如果发生数据包嗅探,数据包数据将被复制并发送到由数据包嗅探代码添加的任何筛选器。

在上面链接的博客文章中描述了如何移动、记帐和删除(当需要时)数据的完整过程。

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

增加接收缓冲区只会增加可为用户区套接字排队的数据包数量。为了提高数据包处理能力,您需要仔细监视和调整网络堆栈的每个组件。您可能需要使用RPS之类的方法来增加处理数据包的CPU数量。

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

票数 0
EN

Stack Overflow用户

发布于 2016-08-03 16:22:49

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

票数 -1
EN

Stack Overflow用户

发布于 2016-08-03 16:26:22

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

选项包括SO_SNDBUF和SO_RCVBUF。如果直接使用C-API,则调用setsockopt本身。如果您使用某种框架,请查看如何设置套接字选项。这确实是一个内核端缓冲区,而不是由您的进程持有的缓冲区。它确定内核可以保留多少字节供您从读取/接收调用中获取。这也影响了flow control协议的机制。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38735424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档