首页 文章

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

提问于
浏览
1

我被告知要增加TCP缓冲区大小以便更快地处理消息 . 我的问题是,无论我使用什么缓冲区用于TCP消息(ByteBuffer,DirectByteBuffer等),每当CPU从NIC接收中断,处理网络请求以读取套接字数据时,OS是否在内存空间外维护任何缓冲区 . 请求进程(ig正在侦听该套接字的进程)

要么

无论CPU接收网络数据的方式如何,它总是只写入进程地址空间的缓冲区中,并且没有为该通信维护地址空间之外的缓冲区(包括netstat命令的“Recv-Q”和“Send-Q”) ?

3 回答

  • 0

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

  • -1

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

    内核中维护了很多缓冲区:

    • 在NIC到达后由NIC写入数据包的DMA环 .

    • 对DMA环上的数据包的引用用于处理数据包 .

    • 最终,如果接收队列尚未满,则将数据包数据添加到进程'接收队列 .

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

    • 如果正在进行数据包嗅探,则会复制数据包数据并将其发送到数据包嗅探代码添加的任何过滤器 .

    上面链接的博客文章中描述了如何移动,计算和删除数据(如果需要)的完整过程 .

    现在,如果您想更快地处理邮件,我认为您的意思是希望减少数据包处理延迟,对吗?如果是这样,您应该考虑使用SO_BUSYPOLL,它可以帮助减少数据包处理延迟 .

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

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

  • -1

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

    选项是SO_SNDBUF和SO_RCVBUF . 如果直接使用C-API,则调用是setsockopt本身 . 如果你使用某种框架查找如何设置套接字选项 . 这确实是一个内核端缓冲区,而不是您的进程所持有的缓冲区 . 它确定内核可以为您从读取/接收调用中获取的字节数 . 它还影响TCP的flow control机制 .

相关问题