网络参数 RSS、RPS、RFS、aRFS 学习总结
cac55 2024-12-24 11:04 47 浏览 0 评论
最近学习,发现网络参数(包括内核参数、网卡参数)非常多,搞得人云里雾里,非常头大。因此打算在这里对学习到的东西做个总结,方便知识的梳理和以后的复习。
Receive Side Scaling (RSS)
RSS 是一个 Linux 网络协议栈中的调度机制。它的主要作用是将数据包路由到不同的接收队列,进而由该队列所对应的 CPU 进行处理,从而实现对数据包处理的负载均衡。
在硬件上,通常使用 hash 函数(一般是 Toeplitz hash)和长度为 128 (2^7) 的置换表来实现。具体做法是,首先将网络和传输层头部的一些信息(如地址端口四元组)通过 hash 函数计算出一个 hash 值,然后取该 hash 值的后 7 位。将这 7 位数作为索引,在置换表中寻找相应的值,该值即为相应的队列。
|
|
网卡的置换表可以通过命令 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 过来的新包需要其处理。
|
|
在编译内核时通过设置 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。
|
|
回顾一下,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 的队列上,没有问题。如果不一样,那么就看以下三个情况:
- 现在的 CPU 队列头计数器 ≥ rps_dev_flow 表中的队列尾计数器。
- 现在的 CPU 未被设置 (≥ nr_cpu_ids)。
- 现在的 CPU 下线了。
如果上面任意一条满足,就将现在的 CPU 更新为 Desired CPU (即 rps_sock_flow 表中的值)。否则,仍在原(现) CPU 上执行。
直观的理解上面的判断机制,那就是:当进程切换 CPU 时,先判断原 CPU 队列上有没有未处理完的包,如果有就不切换;如果没有,就切换。
Linux 内核编译可通过允许 CONFIG_RPS 来使能该功能,一般默认允许。但要是想让 RFS 真正工作,还需要进行配置上面提到的两个表,他们的配置路径分别为:
|
|
技巧
该文档 建议 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。
参考
- Scaling in the Linux Networking Stack — The Linux Kernel documentation
- Toeplitz Hash Algorithm - Wikipedia
- 8.7. Receive Packet Steering (RPS) Red Hat Enterprise Linux 6 | Red Hat Customer Portal
- SMP IRQ affinity — The Linux Kernel documentation
- Linux Network Scaling: Receiving Packets (garycplin.blogspot.com)
转自:https://blog.luckyoung.org/posts/page/2/
相关推荐
- MIRIX重塑AI记忆:超Gemini 410%,节省99.9%内存,APP同步上线
-
MIRIX,一个由UCSD和NYU团队主导的新系统,正在重新定义AI的记忆格局。在过去的十年里,我们见证了大型语言模型席卷全球,从写作助手到代码生成器,无所不能。然而,即使最强大的模型依...
- 硬盘坏了怎么把数据弄出来对比10种硬盘数据恢复软件
-
机械硬盘或固态硬盘损坏导致数据丢失时,应立即停止对硬盘的读写操作,并根据损坏类型选择逻辑层恢复工具或专业物理恢复服务。紧急处置措施立即停止通电使用:发现硬盘异响、无法识别或数据异常时,需立即断开连接,...
- 蓝宝石B850A WIFI主板新玩法:内存小参调节体验
-
蓝宝石前段时间发布了一款性价比极高的主板:NITRO氮动B850AWIFI主板。这款主板的售价只要1349元,相比普遍1500元以上的B850主板,确实极具竞争力。虽然价格实惠,蓝宝石NITR...
- 内存卡损坏读不出怎么修复?这5个数据恢复工具汇总,3秒挽回!
-
在数字化生活的浪潮中,内存卡凭借小巧便携与大容量存储的特性,成为相机、手机、行车记录仪等设备存储数据的得力助手,承载着无数珍贵回忆与重要文件。然而,当内存卡突然损坏无法读取,无论是误删、格式化、病毒入...
- 内存卡修复不再难,2025年必学的6款软件工具
-
内存卡出现问题时,通常是因为文件系统损坏、物理损坏或病毒感染。通过专业的修复工具,我们可以尝试恢复数据并修复内存卡。内存卡修复利器:万兴恢复专家万兴恢复专家是一款功能强大的数据恢复软件,支持多种设备和...
- 有5款内存卡修复工具汇总,内存卡数据轻松找回!
-
在如今的数字时代,内存卡作为不可或缺的存储介质,广泛应用于相机、手机、行车记录仪等各类设备中,承载着我们珍贵的照片、视频以及重要文件。然而,数据丢失的风险却如影随形,误删、格式化、病毒入侵、硬件故障等...
- 揭秘:如何通过多种方式精准查询内存条型号及规避风险?
-
以下是内存条型号查询的常用方法及注意事项,综合了物理查看、软件检测、编码解析等多种方式:一、物理标签查看法1.拆机查看标签打开电脑主机/笔记本后盖找到内存条,观察标签上的型号标识。例如内存标签通常标...
- 内存卡数据恢复5个工具汇总推荐,轻松找回珍贵记忆!
-
在这个数字化时代,内存卡作为我们存储珍贵照片、重要文件的常用载体,广泛应用于手机、相机、平板电脑等设备。但数据丢失的意外却常常不期而至,误删除、格式化、病毒攻击,甚至内存卡的物理损坏,都可能让辛苦保存...
- 电脑内存智能监控清理,优化性能的实用软件
-
软件介绍Memorycleaner是一款内存清理软件。功能很强,效果很不错。Memorycleaner会在内存用量超出80%时,自动执行“裁剪进程工作集”“清理系统缓存”以及“用全部可能的方法清理...
- TechPowerUp MemTest64:内存稳定性测试利器
-
TechPowerUpMemTest64:内存稳定性测试利器一、软件简介TechPowerUpMemTest64,由知名硬件信息工具GPU-Z的出品公司TechPowerUp发布,是一款专为64位...
- 微软推出AI恶意软件检测智能体Project Ire,精确度高达98%
-
IT之家8月6日消息,当地时间周二,微软宣布推出可自主分析恶意软件的AI检测系统原型——ProjectIre。该项目由微软研究院、Defender研究团队及Discovery&a...
- 农村老木匠常用的20种老工具,手艺人靠它养活一家人,你认识几种
-
生活中的手艺老匠人是非常受到尊敬和崇拜的,特别是在农村曾经的老匠人都是家里的“座上宾”。对于民间传统的手艺人,有一种说法就是传统的八大匠:木匠、泥匠、篾匠、铁匠、船匠、石匠、油匠和剃头匠。木匠的祖始爷...
- 恶意木马新变种伪装成聊天工具诱人点击
-
国家计算机病毒应急处理中心通过对互联网监测发现,近期出现一种恶意木马程序变种Trojan_FakeQQ.CTU。该变种通过伪装成即时聊天工具,诱使计算机用户点击运行。该变种运行后,将其自身复制到受感染...
- 学习网络安全 这些工具你知道吗?
-
工欲善其事必先利其器,在新入门网络安全的小伙伴而言。这些工具你必须要有所了解。本文我们简单说说这些网络安全工具吧!Web安全类web类工具主要是通过各种扫描工具,发现web站点存在的各种漏洞...
- 5分钟盗走你的隐私照片,这个全球性漏洞到底有多可怕?
-
这个时代,大家对电脑出现漏洞,可能已经习以为常。但如果机哥告诉大家,这个漏洞能够在5分钟内,破解并盗取你所有加密文件,而且还无法通过软件和补丁修复...这可就有点吓人啦。事情是酱婶的。来自荷兰埃因...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 如何绘制折线图 (52)
- javaabstract (48)
- 新浪微博头像 (53)
- grub4dos (66)
- s扫描器 (51)
- httpfile dll (48)
- ps实例教程 (55)
- taskmgr (51)
- s spline (61)
- vnc远程控制 (47)
- 数据丢失 (47)
- wbem (57)
- flac文件 (72)
- 网页制作基础教程 (53)
- 镜像文件刻录 (61)
- ug5 0软件免费下载 (78)
- debian下载 (53)
- ubuntu10 04 (60)
- web qq登录 (59)
- 笔记本变成无线路由 (52)
- flash player 11 4 (50)
- 右键菜单清理 (78)
- cuteftp 注册码 (57)
- ospf协议 (53)
- ms17 010 下载 (60)