百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

网络参数 RSS、RPS、RFS、aRFS 学习总结

cac55 2024-12-24 11:04 45 浏览 0 评论

最近学习,发现网络参数(包括内核参数、网卡参数)非常多,搞得人云里雾里,非常头大。因此打算在这里对学习到的东西做个总结,方便知识的梳理和以后的复习。

Receive Side Scaling (RSS)

RSS 是一个 Linux 网络协议栈中的调度机制。它的主要作用是将数据包路由到不同的接收队列,进而由该队列所对应的 CPU 进行处理,从而实现对数据包处理的负载均衡。

在硬件上,通常使用 hash 函数(一般是 Toeplitz hash)和长度为 128 (2^7) 的置换表来实现。具体做法是,首先将网络和传输层头部的一些信息(如地址端口四元组)通过 hash 函数计算出一个 hash 值,然后取该 hash 值的后 7 位。将这 7 位数作为索引,在置换表中寻找相应的值,该值即为相应的队列。

1
2
[hash value] : [queue number]
...

网卡的置换表可以通过命令 ethtool --show-rxfh-indir <eth0> 来获取,例子如下:

可见一共有 128 条表项,完全均匀分配给了队列 rx-0 → rx-3。该表可通过命令 ethtool —set-rxfh-indir 进行配置。

上述机制实现了从数据包到队列的对应,为了真正实现负载均衡,我们还需要协调好从队列到 CPU 的对应关系。又因为每个队列对应一个中断(参考上一篇),所以我们可以通过中断号绑定的方式来实现队列和 CPU 的对应。关于此,请参考关于此,请参考 理解 CPU、中断、队列、进程的绑定关系 - 麋鹿博客 (Elk blog) | 一个分享知识和乐趣的地方 。

RSS

本文RSS、RPS、RFS、aRFS图片来源:Linux Network Scaling: Receiving Packets (garycplin.blogspot.com)

技巧

该文档 给出建议,想要实现低延时,应该配置 CPU 数量的队列(即每个 CPU 一个)。对此,笔者的理解是,如果队列数量少了,则可能会有 CPU 闲着,处理不够及时。队列数量多了也没用,因为 CPU 就那么多。

针对以高速率为目的的网络,文档建议使用尽可能少的队列,在这种配置下,不会出现接收队列因为一个 CPU 饱和而溢出的情况。因为在启用中断合并(如 NAPI)的情况下,队列越多,中断数越多。

Receive Packet Steering (RPS)

RPS 逻辑上是 RSS 的软件实现,但又不完全一样。RSS 可以为每个数据包选择接收队列,因此也就选择了相对应的执行中断处理的 CPU;而在 RPS 中,中断由默认队列触发,中断处理函数结束之后,选择进行后续协议处理的 CPU。

RPS

引用

RPS 不会增加额外的硬件设备中断,但是引入了处理器间中断(IPI)。

— Scaling in the Linux Networking Stack — The Linux Kernel documentation

RPS 使用和 RSS 相同的 hash 计算方式,并且每个队列对应一个 CPU 列表。使用计算得到的 hash 值模上 CPU 列表的长度就得到了 CPU 号。当确定了新的 CPU 之后,数据包会被放置到相应 CPU 的 backlog 队列中。随后在新的 CPU 上触发一个 IPI 中断,告诉该 CPU 有 RPS 过来的新包需要其处理。

1
[CPU id] = [hash value] mod [len(CPU list)]

在编译内核时通过设置 CONFIG_RPS 参数来设置是否支持 RPS 功能,系统默认为开。但是需要为想要使用 RPS 功能的队列配置上面提到的 CPU 列表。

RPS 配置文件为 /sys/class/net/<device>/queue/<rx-queue>/rps_cpus ,其中 <device> 表示网络设备,如 eth0<rx-queue> 表示接收队列,如 rx-0

该文件中存储的是一个十六进制的 bitmap。每一个二进制比特代表一个 CPU,最右边对应序号最小的 CPU(即 CPU0),最左边代表最大的。(参考上一篇)

每个队列的配置默认为 0,即关闭 RPS 功能。如果要打开,用户可以根据规则自行设置。

技巧

如果网卡只支持单个队列,并且有多个 CPU 的的话,在 NUMA 系统中,一般将 RPS CPU 设置为在相同 domain 的 CPU,非 NUMA 系统就无所谓了,因为设置为每一个 CPU 的性能都是一样的。

对于多队列网卡,一般系统不会同时启用 RSS 和 RPS,因为这没什么好处。但也有例外,比如网卡所支持的队列数目少于 CPU 数,也就是每个 CPU 还分不到一个接收队列,那么使用 RPS 可能会使得 CPU 的任务分布更高效。

Receive Flow Steering (RFS)

以上机制很好地保证了数据包处理的负载均衡,可以将处理任务合理的分配到所有的 CPU 上。

但是,有时候我们还需要考虑其他的因素。比如,网卡收到了属于一个运行在 CPU0 上的进程的数据包,那么这些数据包被 CPU0 处理会比其他 CPU 处理更高效。

原因很简单直观,数据在 CPU 内传递比跨 CPU 传递要更节省时间。因此,我们希望数据包尽量能够被其所属的进程所在的 CPU 处理,至少能够被同属一个 NUMA 域的 CPU 处理。

RFS 机制就是为了实现这一点。该机制利用了与 RSS/RPS 类似的 hash 和查找策略,即使用 hash 函数根据包头信息计算得到一个 hash 值,然后作为索引查表。但与之不同的是,RFS 所查找的匹配表(rps_sock_flow_table)中存储的是数据包所属进程所在的 CPU

1
2
[hash value] : [CPU id]
...

回顾一下,RPS/RSS 中存储的是预先配置好的 CPU 列表。

如果能查找到有效的 CPU,就按照与 RPS 相同的机制,将数据包入队到 CPU 对应的 backlog 队列中;如果查找不到,那么就直接按照 RPS 机制转发。

与 RPS 预先配置好的 CPU 列表不同,rps_sock_flow 表是动态更新的。如果有数据包的收发操作,如 inet_recvmsg(), inet_sendmsg(), inet_sendpage(), tcp_splice_read() 等操作,则会插入新的值。类似的情况还发生在进程被调度到新的 CPU 的时候。这时候就需要更新匹配表中的值。如果原来的 CPU 队列上还有未处理完的数据包,那么就会发生乱序。

为了避免乱序,RFS 使用了另一个表 —— rps_dev_flow 表,每个网卡队列对应一个该表。该表的索引依旧是包头的 hash 值,每个索引对应两个字段:1) 现在的 CPU(也就是该数据包所属流已经把数据包放在其队列上等待其内核处理的 CPU)号。2) 当该流最后一个数据包到达后,该 CPU 的 backlog 队列的尾计数器值。

RFS

当选择处理数据包的 CPU 时,首先检查 rps_sock_flow 表和 rps_dev_flow 表中对应的 CPU 值是否相同。如果一样,说明进程还是运行在相同的 CPU 上,仍将数据包放在该 CPU 的队列上,没有问题。如果不一样,那么就看以下三个情况:

  1. 现在的 CPU 队列头计数器 ≥ rps_dev_flow 表中的队列尾计数器。
  2. 现在的 CPU 未被设置 (≥ nr_cpu_ids)。
  3. 现在的 CPU 下线了。

如果上面任意一条满足,就将现在的 CPU 更新为 Desired CPU (即 rps_sock_flow 表中的值)。否则,仍在原(现) CPU 上执行。

直观的理解上面的判断机制,那就是:当进程切换 CPU 时,先判断原 CPU 队列上有没有未处理完的包,如果有就不切换;如果没有,就切换。

Linux 内核编译可通过允许 CONFIG_RPS 来使能该功能,一般默认允许。但要是想让 RFS 真正工作,还需要进行配置上面提到的两个表,他们的配置路径分别为:

1
2
/proc/sys/net/core/rps_sock_flow_entries
/sys/class/net/<dev>/queues/rx-<n>/rps_flow_cnt

技巧

该文档 建议 rps_sock_flow_entries 的数量应该跟活跃流的数量相当,然后四舍五入取二的指数值。进一步,文档建议对于一般负载的服务器,值取为 32768 (2^15) 效果比较好。对于 rps_flow_cnt 的取值应该参考 rps_sock_flow_entries,因为前者是每个队列一个,后者是全局的,所以只要将 rps_flow_cnt 取为 rps_sock_flow_entries / N 就行,其中 N 为队列数。

关于该建议,本人的理解是:最好能够给每一个活跃的流都能分配一个表项,使其能够准确找到对应的 CPU。

Accelerated RFS

Accelerated RFS 之于 RFS 相当于 RSS 之于 RPS。Accelerated RFS 在硬件上就可以选择正确的队列,随后触发该数据包所属流所在的 CPU 的中断。由此可见,如果想要在硬件上实现队列选择,我们需要一个从流到硬件队列的对应关系。

从上文可知,我们已经有了一个从流到 CPU 的映射关系,记录在 rps_dev_flow 表中。然后,我们也有 CPU 和硬件队列的关系,通过 /proc/irq/<irq_num>/smp_affinity 进行配置。

信息

回顾一下 rps_dev_flow 表中存储的信息,如果该表被更新,说明有某个进程被创建,或者进程连同协议处理完全迁移到了一个新的 CPU。

aRFS

每当 rps_dev_flow 表中的条目被更新,网络协议栈就会调用驱动中的 ndo_rx_flow_steer 函数来更新流到硬件队列的对应关系。

Accelerated RFS 需要在编译阶段使能 CONFIG_RFS_ACCEL,并且需要硬件和驱动的支持。此外,还需要使用 ethtool 设置 ntuple 过滤。其他的就不需要配置了。

技巧

Accelerated RFS 机制可以将数据包直接放在最终的 CPU 硬件队列上,所以性能应该是要比 RFS 高。因此,当硬件支持该选项,应该选择此机制。

总结

回顾一下这些机制之间的关系。首先是 RSS/RPS,该机制在接收数据包的时候,通过手动配置,甚至是根据负载情况的自动配置(如 irqbalance),来把数据包的处理负载均匀分配到不同的 CPU 上。RSS/RPS 仅根据负载大小进行判断,但是这可能导致从协议栈处理到上层应用处理之间数据包的转移。

因此 RFS/aRFS 更进一步,在进行 CPU 选择的时候考虑上层应用所处位置,对每一个流都配置一个 Desired CPU。因此,在为数据包选择 CPU 的时候,会优先选择 Desired CPU。

参考

  1. Scaling in the Linux Networking Stack — The Linux Kernel documentation
  2. Toeplitz Hash Algorithm - Wikipedia
  3. 8.7. Receive Packet Steering (RPS) Red Hat Enterprise Linux 6 | Red Hat Customer Portal
  4. SMP IRQ affinity — The Linux Kernel documentation
  5. Linux Network Scaling: Receiving Packets (garycplin.blogspot.com)


转自:https://blog.luckyoung.org/posts/page/2/

相关推荐

Linux服务器被黑客入侵后各排查项及排除步骤

Linux入侵排查0x00前言当企业发生黑客入侵、系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故...

[常用工具] Python视频处理库VidGear使用指北

VidGear是一个高性能的Python视频处理库,它在预载多个专业视频图像处理库的基础上,如OpenCV、FFmpeg、ZeroMQ、picamera、starlette、yt_dlp、pyscre...

微信公众号自动回复及多客服功能实现

目录前期准备1、微信公众平台基本设置2、开发所需参数功能步骤1、填写服务器配置2、验证服务器地址的有效性3、依据接口文档实现业务逻辑具体实现1、微信接入2、自定义回复及多客服接入默认微信公众平台对公众...

电脑病毒怎么彻底清理?这3个方法可以解决!

案例:电脑中毒无法正常使用怎么办?怎么清理电脑病毒?如何彻底清除病毒?有没有小伙伴知道解决的方法?在使用电脑的过程中,我们经常会遇到电脑中病毒的情况,它们能够通过各种渠道感染你的计算机系统,给你带来许...

人在低谷落难的时候,一定要记住的4句话

凌晨三点在便利店啃面包时,我看见邻座大哥对着手机里的存款余额发呆,手指在屏幕上划了又划——原来成年人的崩溃,真的会藏在每个看似普通的深夜里。如果你也正在经历「人生断电期」,这10句从谷底爬起来的人总结...

Linux环境Docker容器安装与使用(六)——安装Hadoop大数据集群

简介:Hadoop是一种分析和处理大数据的软件平台,是Appach开源软件的一个架构,在大量计算机组成的集群当中实现了对于海量的数据进行的分布式计算。Hadoop框架最核心的设计就是HDFS和MapR...

(2023年最新)50个超实用电脑实用快捷键,提高操作效率10倍!

我们现在大多数工作都需要使用电脑,掌握简单的电脑知识,可以更好的提高操作效率,熟能生巧是没错,但还有一个方法就是使用快捷键。办公室文员必备技能知识;基本要求:打字快,会office办公软件(word文...

升级WIN10毛病多?解决这些问题,轻松应对!

1、win10网络不稳定①打开设置,进入网络和INTERNET。②在“WLAN页面”选择“管理Wi-Fi设置”。③在此页面上有个管理已知网络,里面记录着之前电脑连接过的无线网络连接,点击“连接名称”,...

史上最贱最贱的电脑病毒!(最致命的电脑病毒)

看了标题,有很多人是充满好奇心进来的,想看看有多贱!我可以郑重的告诉你,贱到你想掐死黑客!下面我给你介绍一下这个病毒是怎么个贱法!因为我亲身体验了一把!前几天我不知道怎么回事,我电脑莫名其妙多了几...

五千字长文全平台笔记软件obsidian同步攻略&amp;图床使用教程

全平台笔记软件obsidianobsidian(黑曜石)是一个全平台的笔记软件,基础笔记功能免费,如果使用官方的同步功能好像是收费(我也不确定,因为我甚至没登陆过obsidian的账号)。可以使用ma...

工业自动化2.0演进:具有自我意识的运动控制

工业自动化领域的下一个发展方向要求机器能够独立调整其性能参数,以完成工厂操作人员分配的任务,或根据生产力增强的人工智能(AI)算法的输入,对机器自身重新配置以优化其行为。具有自我意识的机器的价值在于,...

零信任的时代到来!VPN将逐渐被取代

转自NETWORKWORLD,作者NealWeinberg,蓝色摩卡译,合作站点转载请注明原文译者和出处为超级盾!传统的VPN正在被一种更智能、更安全的网络安全方法所取代,这种方法将每个人都视为不受...

电脑键盘指法+常用快捷键文字及图片详解

图1:20190820(整理)(较全面的在后面)Ctrl+N:新建文档F4:重复上述操作Esc:取消当前操作HOME:光标跳转行首END:光标跳转到行尾WIN+L:锁定桌面WIN+E:开启磁...

VPN正在消亡,零信任万岁

转自NETWORKWORLD,作者NealWeinberg,蓝色摩卡译,合作站点转载请注明原文译者和出处为超级盾!传统的VPN正在被一种更智能、更安全的网络安全方法所取代,这种方法将每个人都视为不受...

Windows自带的「黑科技」工具,能让你少装10个软件!

电脑装了一堆软件,桌面却还是乱糟糟?其实Windows系统里藏着一堆“神器”,无需第三方工具就能搞定截图、录屏、OCR文字提取、系统加速……这7个冷门但逆天的内置工具,专治“软件成瘾症”,看完立马卸载...

取消回复欢迎 发表评论: