1.RSS(Receive Side Scaling)

RSS(Receive Side Scaling)也叫多队列接收,可以硬件级别实现使用多核处理接收网络数据。可用于缓解因单个CPU过载,导致的接收中断处理瓶颈,并减少网络延迟。

可以通过/proc/interrupts确定网络接口卡是否支持RSS。也可以在加载网络驱动程序后,通过“ls  -1   /sys/devices/*/*/device_pci_address/msi_irq” 的输出来查看。(需要网卡硬件及驱动同时支持)

默认情况下,RSS是启用的。RSS的队列数量通常在/sys/class/net/device/queues/rx queue/中配置,其中device是网络设备的名称(例如eth1),rx queue是相应接收队列的名称。

在配置RSS时,RedHat建议将队列数量限制为每个物理CPU核心一个队列。启用RSS后,会根据每个CPU使用情况来分配数据的处理。也可以使用ethtool --show-rxfh-indir和--set-rxfh-indir参数来修改使用的权重。

irqbalance守护进程可以与RSS一起使用,它将减少跨节点内存传输和缓存线跳转的可能性。如果开启了irqbalance和RSS,通过irqbalance将与网络设备相关的中断定向到适当的RSS队列,可以实现最低的延迟。

2.Receive-Side Scaling (RSS)

RPS与RSS类似,用于将数据包定向到特定的CPU进行处理。RPS是在软件级别实现的,有助于避免单队列网卡成为网络流量的瓶颈。

与RSS相比,RPS有几个优势:

RPS由于是基于软件的,所有网卡都可以使用;

在处理新协议时,更容易增加软件过滤器;

RPS不增加网络设备的硬件中断率。注意:RPS它引入了处理器间的中断(软中断);

RPS是在/sys/class/net/device/queues/rx-queue/rps_cpus文件中配置接收队列,其中device是网络设备的名称(如eth0),rx-queue是相应接收队列的名称(如rx-0)。

rps_cpus文件默认值为0,也就是禁用RPS,这样CPU既会处理数据中断,也会处理数据包。

要指定CPU处理接收队列的中断数据,需要将CPU索引位设置为1。如,要使用CPU 0、1、2和3处理中断,只需要将rps_cpus文件值设置为00001111或 f(十六进制值=1+2+4+8)。

对于单队列的网络设备,可以通过将RPS配置为在同一内存域中使用CPU,来实现最佳性能。在非NUMA系统上,这意味着可以使用所有可用的CPU。如果网络中断率极高时,非处理网络中断的CPU,也可能会提高性能。

对于多队列的网络设备,同时开启RPS和RSS通常是没有用处的。因为默认情况下,RSS会将CPU映射到每个接收队列。注意:如果硬件队列少于CPU,并且RPS被配置为在同一内存域中使用CPU,则RPS仍然是有用的。

 开启rps后softirq消耗仍不均衡:发现开启rps后,softirq不均衡的情况有缓解,但仍有较大差异。用perf分析高消耗cpu的ksoftirqd,发现有很大一部分cpu消耗在网卡驱动的清理流程中。rps只能减轻cpu处理网络协议的开销,对于网卡驱动上的开销无优化效果,对于这种情况可以设置rps_cup时排除本身cpu,进一步减轻其开销。

RPS只作用于数据的接收,对于发送没有效果

3.RFS(Receive Flow Steering)

RFS扩展了RPS,用提高CPU缓存命中率的方法,减少网络延迟。在RPS仅根据队列长度转发数据包的情况下,RFS使用RPS后端计算最合适的CPU,然后根据使用数据包的应用程序的位置转发数据包。这提高了CPU缓存效率。(将同1个sockect的包,命中为同1个CPU进行处理)

默认情况下禁用RFS。要启用RFS,必须编辑两个文件:

/proc/sys/net/core/rps_sock_flow_entries:将此文件为指定并发活动连接的最大预期数量。对于中等服务器负载,建议使用32768。在实践中,所有输入的值都被四舍五入到最接近的2次方。

/sys/class/net/device/queues/rx-queue/rps_flow_cnt:它的值为rps_sock_flow_entries的值除以接收队列的数量。例如,如果rps_flow_条目设置为32768,并且有16个配置的接收队列,则rps_flow_cnt应设置为2048。对于单队列设备,rps_flow_cnt的值与rps_sock_flow_条目的值相同。

从单个发送器接收的数据不会发送到多个CPU。如果从单个发送器接收的数据量大于单个CPU可以处理的数据量,请配置更大的帧大小,以减少中断次数,从而减少CPU的处理工作量。或者,考虑 NIC offload选项或更快的CPU。

4.RFS加速

增加硬件辅助来提高RFS的速度,从而实现PFS的加速。

只有满足以下条件,加速RFS才可用:网卡支持加速RFS;启用ntuple筛选;

一旦满足这些条件,就会根据传统的RFS配置自动推导CPU到队列的映射。也就是说,CPU到队列的映射是基于驱动程序为每个接收队列配置的IRQ亲和力推导出来的。

5.NIC OFFLOADS

默认的以太网最大传输单元(MTU)是1500字节,这是通常可以传输的最大帧大小。这可能会导致系统资源未充分利用,例如,如果有3200字节的数据用于传输,这将意味着生成三个较小的数据包。有几个称为offloads的选项,允许相关协议栈传输比正常MTU大的数据包。可以创建最大允许64KiB的数据包,并提供发送(Tx)和接收(Rx)选项。当发送或接收大量数据时,这意味着每发送或接收64KiB数据,就要处理一个大数据包,而不是多个较小的数据包。这意味着生成的中断请求更少,用于拆分或组合流量的处理开销更少,传输机会更多,从而导致吞吐量的总体增加。

5.1.Offload类型

TCP Segmentation Offload (TSO)

使用TCP协议发送大数据包。使用NIC处理段,然后将TCP、IP和数据链路层协议头添加到每个数据段。

UDP Fragmentation Offload (UFO)

使用UDP协议发送大数据包。使用NIC将IP碎片处理为MTU大小的数据包,用于大型UDP数据报文。

Generic Segmentation Offload (GSO)

使用TCP或UDP协议发送大数据包。如果NIC无法处理数据段/报文,GSO将绕过NIC硬件执行相同的操作。它通过尽可能晚地延迟分段来实现的。

Large Receive Offload (LRO)

使用TCP协议。所有传入数据包在接收时,都会重新分段,从而减少系统必须处理的段数。它们可以在驱动程序中合并,也可以使用NIC合并。

LRO的一个问题是:它倾向于对所有传入的数据包进行重新排序,通常会忽略标头和其他可能导致错误的信息的差异。当启用IP转发时,通常不可能使用LRO。LRO与IP转发相结合可能会导致校验和错误。注意:如果/proc/sys/net/ipv4/ip_forward设置为1,则启用转发。

Generic Receive Offload (GRO)

使用TCP或UDP协议。在对数据包重新排序时,GRO比LRO更严格。例如,它检查每个数据包的MAC报头(必须匹配),只有有限数量的TCP或IP报头可以不同,并且TCP时间戳必须匹配。重新排序可以由NIC或GSO代码处理。

5.2.使用NIC Offloads

Offload应该用于传输或接收大量数据的高速系统,并且有利于吞吐量而不是延迟。使用Offload大大增加了驱动程序队列的容量,所以延迟可能会成为一个问题。

这方面的一个例子,一个系统使用大数据包大小传输大量数据,但也运行许多交互式应用程序。由于交互式应用程序以一定的时间间隔发送小数据包,因此在处理前面较大的数据包时,这些数据包可能会“被困”在缓冲区中,从而造成不可接受的延迟,这是一个非常现实的风险。

可以使用ethtool命令检查Offload设置,某些设备可能被列为固定设置,这意味着它们无法更改。

  • RPS( Receive Packet Steering)是在单个CPU将数据从Ring Buffer取出后,网卡驱动通过四元组(SIP,SPORT,DIP,DPORT)生成一个hash值,然后根据这个hash值,自动分配到对应的CPU上进行数据处理,从而实现多核数据处理的能力
  • 和RFS(Receive Flow Steering)
  • Accelerated Receive Flow Steering
  • XPS: Transmit Packet Steering

6.XPS(Transmit Packet Steering)

XPS通过创建CPU到网卡发送队列的对应关系,来保证处理发送软中断请求的CPU和向外发送数据包的CPU是同一个CPU,用来保证发送数据包时候的局部性。

对于发送队列到CPU的映射有两种选择:

1、使用CPU映射
        通过指定发送队列在某几个CPU上处理,通过减小分发的CPU范围来减少锁开销以及cache miss。最常见的就是1对1,和上面说到的接收软中断绑核类似,通过 /sys/class/net/<dev>/queues/tx-<n>/xps_cpus文件设置,同样是bitmaps方式。

2、接收队列映射方式
        基于接收队列的映射来选择CPU,也就是说让接收队列和发送队列在同一个CPU,或指定范围的几个CPU来处理。这种方式对于多线程一直收发包的系统效果比较明显,收发包队列处理在同一个CPU,不仅减少了对其他CPU的打断,同时提高应用处理效率,收完包后直接在同个CPU继续发包,从而减小CPU消耗,同时减小包的时延。可通过/sys/class/net/<dev>/queues/tx-<n>/xps_rxqs文件设置(不是所有网卡都支持)。
        XPS对于单发送队列网卡没有效果

7.单网卡调优:开启RPS和RFS(默认关闭)

  • 开启CPU性能模式:cpupower frequency-set -g performance
  • 使用脚本rps.sh开启RPS和RFS;
  • ethtool -G p1p1 [rx|tx] 4096,检查设置结果ethtool -g p1p1
  • sysctl -w net.core.netdev_budget=600
  • 查看网卡相应收发包情况;
#!/bin/bash
rps() {net_interface=`ip link show | grep "state UP" | awk '{print $2}' | egrep -v '^docker|^veth' | tr ":\n" " "`for em in ${net_interface[@]}dorq_count=`ls /sys/class/net/$em/queues/rx-* -d | wc -l`rps_flow_cnt_value=`expr 32768 / $rq_count`for ((i=0; i< $rq_count; i++))doecho $rps_flow_cnt_value > /sys/class/net/$em/queues/rx-$i/rps_flow_cntdoneflag=0while [ -f /sys/class/net/$em/queues/rx-$flag/rps_cpus ]doecho `cat  /sys/class/net/$em/queues/rx-$flag/rps_cpus | sed 's/0/f/g' ` >  /sys/class/net/$em/queues/rx-$flag/rps_cpusflag=$(($flag+1))donedoneecho 32768 > /proc/sys/net/core/rps_sock_flow_entriessysctl -p
}check_rps() {ni_list=`ip link show | grep "state UP" | awk '{print $2}' | egrep -v "^docker|^veth" | tr ":\n" " "`for n in $ni_listdorx_queues=`ls /sys/class/net/$n/queues/ | grep "rx-[0-9]"`for q in $rx_queuesdorps_cpus=`cat /sys/class/net/$n/queues/$q/rps_cpus`rps_flow_cnt=`cat /sys/class/net/$n/queues/$q/rps_flow_cnt`echo "[$n]" $q "--> rps_cpus =" $rps_cpus ", rps_flow_cnt =" $rps_flow_cntdonedonerps_sock_flow_entries=`cat /proc/sys/net/core/rps_sock_flow_entries`echo "rps_sock_flow_entries =" $rps_sock_flow_entries
}rps
check_rps

8.多队列网卡

8.1.查看主网卡支持多队列的情况

其中Pre-set maximums中的combined字段大于1时,表示网卡支持多队列。而Current harware settings中的conbined则表示当前设置的网卡队列数,如果队列数大于1,就是已经开启了网卡多队列。

[root@localhost ~]# ethtool -l eth0Channel parameters for eth0:Pre-set maximums:RX: 0TX: 0Other: 0Combined: 64Current hardware settings:RX: 0TX: 0Other: 0Combined: 32

8.2.设置网卡多队列

ethtool -L eth1 combined 16

        注意:设置的队列数的前提是网卡首先要支持多队列,且不能超过网卡支持的最大的队列数。当网卡驱动比较老旧的时候,也有可能会设置失败,建议将网卡驱动先升级至最新版本。

Redhat的RSS参考文档https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/performance_tuning_guide/network-rss

网卡调优RSS、RPS、RFS和XPS相关推荐

  1. x86服务器中网络性能分析与调优(高并发、大流量网卡调优)

    最近在百度云做一些RTC大客户的项目,晚上边缘计算的一台宿主机由于CPU单核耗被打满,最后查到原因是网卡调优没有生效,今天查了一下网卡调优的资料,欢迎大家共同探讨. 一.网卡调优方法 1.Broadc ...

  2. RSS/RPS/RFS究竟是个什么东西

    RSS(Receive Side Scaling) 技术在网络数据接收时有效.具备RSS能力的网卡,有多个接收队列,网卡可以用不同的接收队列来接收不同的网络流,再将这些队列分配到不同的CPU核上进行处 ...

  3. Linux RSS/RPS/RFS/XPS对比

    RSS适合于多队列网卡,把不同的流分散的不同的网卡多列中,至于网卡队列由哪个cpu处理还需要绑定网卡队列中断与cpu RPS:适合于单队列网卡或者虚拟网卡,把该网卡上的数据流让多个cpu处理 RFS: ...

  4. 关于Linux网卡调优之:RPS (Receive Packet Steering)

    昨天在查LVS调度均衡性问题时,最终确定是 persistence_timeout 参数会使用IP哈希.目的是为了保证长连接,即一定时间内访问到的是同一台机器.而我们内部系统,由于出口IP相对单一,所 ...

  5. 内核网络中的GRO、RFS、RPS技术介绍和调优

    内核网络中的GRO.RFS.RPS技术介绍和调优 1. 前言 2. GRO(Generic Receive Offloading) 2.1 使用 ethtool 修改 GRO 配置 2.2 napi_ ...

  6. linux内核网络协议栈--监控和调优:接收数据(十五)

    译者序 本文翻译自 2016 年的一篇英文博客 Monitoring and Tuning the Linux Networking Stack: Receiving Data.如果能看懂英文,建议阅 ...

  7. Linux网络包接收过程的监控与调优

    Linux内核对网络包的接收过程大致可以分为接收到RingBuffer.硬中断处理.ksoftirqd软中断处理几个过程.其中在ksoftirqd软中断处理中,把数据包从RingBuffer中摘下来, ...

  8. Linux 网络包接收过程的监控与调优

    Linux内核对网络包的接收过程大致可以分为接收到RingBuffer.硬中断处理.ksoftirqd软中断处理几个过程.其中在ksoftirqd软中断处理中,把数据包从RingBuffer中摘下来, ...

  9. 【华为云技术分享】Nginx应用调优案例

    1 问题背景 nginx的应用程序移植到TaiShan服务器上,发现业务吞吐量没有达到硬件预期,需要做相应调优. 2 原因分析 l  网卡配置 该应用场景下网络吞吐量大,网卡的配置能对性能提升起到很大 ...

  10. 性能调优攻略——来自酷壳陈皓

    关于性能优化这是一个比较大的话题,在<由12306.cn谈谈网站性能技术>中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别 ...

最新文章

  1. 10 个经典的 Java 集合面试题,看你能否答得上来?
  2. C/C++使用socket实现server和client
  3. 探索Bioconductor数据包
  4. 657. Robot Return to Origin 机器人能否返回原点
  5. What are TCHAR, WCHAR, LPSTR, LPWSTR, LPCTSTR (etc.)?
  6. docker mysql忘记密码_docker 容器 mysql5.7 忘记root密码 重置密码
  7. 谁才是2019最火爆的编程语言,看这篇就够了
  8. 【Json】JSONPath之fastJson与Snack3的使用介绍与区别
  9. mysql-5.7 group commit 详解
  10. java 序列化 学习
  11. HTTP 的概念、原理、工作机制、数据格式和REST(HenCoder学习总结,待整理中...)
  12. 空号检测/空号检测接口/号码状态查询/号码状态查询接口/号码状态查询api/精准实时版/免费试用
  13. 【软件测试】使用C++ Test进行动态测试
  14. 振动信号的短时傅里叶变换分析
  15. ibm最早的个人计算机,个人计算机竞争者分析:IBM.pdf
  16. 企业青睐什么样的产品经理
  17. PWN-CTF:gef工具安装
  18. day2(sdasdasdasdasd)
  19. 信号强度诊断(系统架构)
  20. 动态规划算法---求最长公共子序列

热门文章

  1. 重启Usb蓝牙设备(PD虚拟机模拟插拔)
  2. DAY01.使用JAVA从国家统计局爬取2020年全国统计用区划代码和城乡划分代码(省市区数据)
  3. jupyter notebook更改默认浏览器
  4. 2019年11月计算机语言排名,2019年11月PYPL编程语言排行榜出炉
  5. 计算机语言运行速度排名,2019年的编程语言排行榜你知道吗
  6. scrapy爬取网页数据
  7. 广西建工OA系统office插件显示问题解决方案
  8. 内存分配 与 const
  9. 新网站如何才能被百度快速收录?
  10. Excel如何批量删除公式只保留数值