精华内容
下载资源
问答
  • 2022-03-16 10:01:30

    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是相应接收队列的名称(如rx-0))。

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

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

    2.RPS( Receive Packet Steering)

    ​ 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,来进一步减轻其开销。

    3.RFS(Receive Flow Steering)

    ​ RFS是RPS的功能扩展,用来提高CPU缓存命中率,减少网络延迟。RPS仅根据队列长度转发数据包,而RFS使用RPS后端计算最合适的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_条目的值相同。

      ​ 同1个sockect的包,命中为同1个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设置,某些设备可能被列为固定设置,这意味着它们无法更改。

    6.XPS(Transmit Packet Steering)

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

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

    • 使用CPU映射:通过指定发送队列在某几个CPU上处理,通过减小分发的CPU范围来减少锁开销以及cache miss。最常见的就是1对1,和上面说到的接收软中断绑核类似,通过 /sys/class/net//queues/tx-/xps_cpus文件设置,同样是bitmaps方式。
    • 接收队列映射方式:基于接收队列的映射来选择CPU,也就是说让接收队列和发送队列在同一个CPU,或指定范围的几个CPU来处理。这种方式对于多线程一直收发包的系统效果比较明显,收发包队列处理在同一个CPU,不仅减少了对其他CPU的打断,同时提高应用处理效率,收完包后直接在同个CPU继续发包,从而减小CPU消耗,同时减小包的时延。可通过/sys/class/net//queues/tx-/xps_rxqs文件设置(不是所有网卡都支持)。

    ​ XPS对于单发送队列网卡没有效果

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

    • 开启CPU性能模式:cpupower frequency-set -g performance

    • 开启RPS和RFS;

    • ethtool -G p1p1 [rx|tx] 4096,检查设置结果ethtool -g p1p1

    • sysctl -w net.core.netdev_budget=600

    • 查看网卡相应收发包情况;

    开启RPS和RFS的脚本示例:

    #!/bin/bash
    # cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
    # cpupower frequency-set -g performance
    # activate rps/rfs by script: https://gist.github.com/wsgzao/18828f69147635f3e38a14690a633daf
    # double ring buffer size: ethtool -G p1p1 [rx|tx] 4096, ethtool -g p1p1
    # double NAPI poll budget: sysctl -w net.core.netdev_budget=600
    
    rps_start() 
    {
    	net_interface=`ip link show | grep "state UP" | awk '{print $2}' | egrep -v '^docker|^veth' | tr ":\n" " "`
    	for em in ${net_interface[@]}
    	do
    		rq_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++))
    		do
    			echo $rps_flow_cnt_value > /sys/class/net/$em/queues/rx-$i/rps_flow_cnt
    		done
    	
    		flag=0
    		while [ -f /sys/class/net/$em/queues/rx-$flag/rps_cpus ]
    		do
    			echo `cat  /sys/class/net/$em/queues/rx-$flag/rps_cpus | sed 's/0/f/g' ` >  /sys/class/net/$em/queues/rx-$flag/rps_cpus
    			flag=$(($flag+1))
    		done
    	done
    	echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
    	sysctl -p
    }
    
    rps_stop() {
    	net_interface=`ip link show | grep "state UP" | awk '{print $2}' | egrep -v '^docker|^veth' | tr ":\n" " "`
    	for em in ${net_interface[@]}
    	do
    		rq_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++))
    	  do
    	      echo 0 > /sys/class/net/$em/queues/rx-$i/rps_flow_cnt
    	  done
    	
    	  flag=0
    	  while [ -f /sys/class/net/$em/queues/rx-$flag/rps_cpus ]
    	  do
    	      echo 0 >  /sys/class/net/$em/queues/rx-$flag/rps_cpus
    	      flag=$(($flag+1))
    	  done
      done
      echo 0 > /proc/sys/net/core/rps_sock_flow_entries
      sysctl -p
    }
    
    rps_status() {
      ni_list=`ip link show | grep "state UP" | awk '{print $2}' | egrep -v "^docker|^veth" | tr ":\n" " "`
      for n in $ni_list
      do
          rx_queues=`ls /sys/class/net/$n/queues/ | grep "rx-[0-9]"`
          for q in $rx_queues
          do
              rps_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_cnt
          done
    
      done
      rps_sock_flow_entries=`cat /proc/sys/net/core/rps_sock_flow_entries`
      echo "rps_sock_flow_entries =" $rps_sock_flow_entries
    }
    
    case "$1" in
      start)
            echo -n "Starting $DESC: "
            rps_start
            rps_status
            ;;
      stop)
            rps_stop
            rps_status
            ;;
      restart|reload|force-reload)
            rps_stop
    		 rps_start
            ;;
      status)
            rps_status
            ;;
      *)
            echo "Usage: $0 [start|stop|status]"
            ;;
    esac
    exit 0
    

    **实际测试:**开启RPS后,可以一定程度上解决网卡数据集中在一个CPU核处理的问题,但CPU消耗会明显增加;

    8.多队列网卡

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

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

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

    8.2.设置网卡多队列

    ethtool -L eth1 combined 16
    

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

    Redhat的RSS参考文档

    更多相关内容
  • 最近作RTC项目,晚上边缘计算的一台宿主机由于CPU单核耗被打满,最后查到原因是网卡调优没有生效,今天查了一下网卡调优的资料,下面是关于我们公司网卡调优的相关知识,欢迎大家共同探讨。

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

    一.网卡调优方法

    1、Broadcom的网卡建议关闭GRO功能

    ethtool -K eth0 gro off
    
    ethtool -K eth1 gro off
    
    ethtool -K eth2 gro off
    
    ethtool -K eth3 gro off

    2、关闭irqbalance服务并手动分配网卡中断

    #关闭 软IRQ服务
    service irqbalance stop
    chkconfig irqbalance off
    # 查看网卡中断号,ens33是网卡名称,对应的中断号是19
    cat /proc/interrupts
                CPU0       CPU1       
       0:         72          0   IO-APIC-edge      timer
       1:         11        143   IO-APIC-edge      i8042
       8:          1          0   IO-APIC-edge      rtc0
       9:          0          0   IO-APIC-fasteoi   acpi
      12:         17       2966   IO-APIC-edge      i8042
      14:          0          0   IO-APIC-edge      ata_piix
      15:       8343        176   IO-APIC-edge      ata_piix
      16:        826          0   IO-APIC-fasteoi   vmwgfx, snd_ens1371
      17:      12896       3063   IO-APIC-fasteoi   ehci_hcd:usb1, ioc0
      18:        147        296   IO-APIC-fasteoi   uhci_hcd:usb2
      19:        287       9931   IO-APIC-fasteoi   ens33
      24:          0          0   PCI-MSI-edge      PCIe PME, pciehp
      25:          0          0   PCI-MSI-edge      PCIe PME, pciehp
      26:          0          0   PCI-MSI-edge      PCIe PME, pciehp
    
    smp_affinity的值可以用下面脚本算哈
    #!/bin/bash
    #
    echo "统计cpu的16进制"
    [ $# -ne 1 ] && echo ‘$1 is Cpu core number’ && exit 1
    CCN=$1
    echo “Print eth0 affinity”
    for((i=0; i<${CCN}; i++))
    do
    echo ==============================
    echo "Cpu Core $i is affinity"
    ((affinity=(1<<i)))
    echo "obase=16;${affinity}" | bc
    done
    
    使用方法:sh 脚本名字 空格 cpu核数
    [root@localhost ~]# sh 12.sh 2
    统计cpu的16进制
    “Print eth0 affinity”
    ==============================
    Cpu Core 0 is affinity
    1
    ==============================
    Cpu Core 1 is affinity
    2
    
    # 例如,有多颗CPU和多块网卡,将网卡绑定到每颗CPU核上
    cat /proc/irq/{84,85,86,87,88,89,90,91,92,93}/smp_affinity
    echo 1 > /proc/irq/84/smp_affinity
    echo 2 > /proc/irq/85/smp_affinity
    echo 4 > /proc/irq/86/smp_affinity
    echo 8 > /proc/irq/87/smp_affinity
    echo 10 > /proc/irq/88/smp_affinity
    echo 20 > /proc/irq/89/smp_affinity
    echo 40 > /proc/irq/90/smp_affinity
    echo 80 > /proc/irq/91/smp_affinity
    echo 100 > /proc/irq/92/smp_affinity
    echo 200 > /proc/irq/93/smp_affinity
    
    


    3、开启网卡的RPS功能 (Linux内核2.6.38或以上版本支持)

    # Enable RPS (Receive Packet Steering)
    
    rfc=4096
    
    cc=$(grep -c processor /proc/cpuinfo)
    
    rsfe=$(echo $cc*$rfc | bc)
    
    sysctl -w net.core.rps_sock_flow_entries=$rsfe
    
    for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus)
    
    do
    
    echo fff > $fileRps
    
    done
    
    for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt)
    
    do
    
    echo $rfc > $fileRfc
    
    done
    
    tail /sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}

    献上一个完整的脚本:

    vi /opt/sbin/change_irq.sh
    
    #!/bin/bash
    
    ethtool -K eth0 gro off
    
    ethtool -K eth1 gro off
    
    ethtool -K eth2 gro off
    
    ethtool -K eth3 gro off
    
    service irqbalance stop
    
    chkconfig irqbalance off
    
    cat /proc/irq/{84,85,86,87,88,89,90,91,92,93}/smp_affinity
    
    echo 1 > /proc/irq/84/smp_affinity
    
    echo 2 > /proc/irq/85/smp_affinity
    
    echo 4 > /proc/irq/86/smp_affinity
    
    echo 8 > /proc/irq/87/smp_affinity
    
    echo 10 > /proc/irq/88/smp_affinity
    
    echo 20 > /proc/irq/89/smp_affinity
    
    echo 40 > /proc/irq/90/smp_affinity
    
    echo 80 > /proc/irq/91/smp_affinity
    
    echo 100 > /proc/irq/92/smp_affinity
    
    echo 200 > /proc/irq/93/smp_affinity
    
    # Enable RPS (Receive Packet Steering)
    
    rfc=4096
    
    cc=$(grep -c processor /proc/cpuinfo)
    
    rsfe=$(echo $cc*$rfc | bc)
    
    sysctl -w net.core.rps_sock_flow_entries=$rsfe
    
    for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus)
    
    do
    
    echo fff > $fileRps
    
    done
    
    for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt)
    
    do
    
    echo $rfc > $fileRfc
    
    done
    
    tail /sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}
    
    chmod +x /opt/sbin/change_irq.sh
    
    echo "/opt/sbin/change_irq.sh" >> /etc/rc.local
    
    PS:记得修改网卡中断号,别直接拿来用哦

    二. 网络性能理论极限

    网络数据包处理的性能指标,一般包括吞吐、延时、丢包率、抖动等。

    数据包有大有小,数据包的大小对这些性能指标有很大的影响。

    一般认为服务器处理能力很强,不是数据包处理的瓶颈,而通过物理线路能够传送数据包的最大速率,即线速(Wire Speed)才是网络性能的瓶颈点。

    随着物理线路和网卡的不断发展,这个线速不断增大,带宽从100Mpbs、1Gbpbs、10Gbpbs、25Gbpbs、40Gbpbs,甚至到100Gpbs。此时服务器数据包处理能力越显重要。原有的服务器数据包处理方式已不能满足要求,一方面服务器硬件需要更新,另一个方面软件处理方式也需要变化。

    物理线路上传送的这些0、1电或光信号,当有了格式规定就有了意义,我们知道以太网中有OSI七层模型和简化的TCP/IP四层模型,这些模型规定了一个数据包的格式,下面是一个以太帧(Ethernet frame,俗称二层)格式。

    由于物理线路的信号冲突问题(https://en.wikipedia.org/wiki/Ethernet_frame#cite_note-7),一个以太帧(不带vlan)最小为7+1+6+6+2+46+4+12=84B,即我们常说的最小数据包64B,指的是6+6+2+46+4=64B。

    根据以太帧的大小,我们就可以算出来,不同的以太帧大小在不同的物理线路上传输的速率,比如10Gbps的物理线路,一个10Gbps的网卡1秒内可以接收的64B的数据包的个数(packet per seconds,即pps)为

    14.88Mpps(10^10/84/8),每个以太帧到达网卡的时间为67.20(10^9/14.88/10^6)纳秒,下图可以看出以太帧越大,pps越低,到达时间越长。

    由于物理服务器处理数据包是一个一个处理,包括数据包的校验,数据包每一层包头的处理,所以数据包越小,到达时间就越短,服务器处理数据包要求就越高。比如64B的小包,如果处理数据包要达到线速,那么就要求服务器67.20纳秒就要处理完一个包,随着物理线路速率越大,处理时间就要求越短,这也就要求服务器硬件和软件都要相应的发展和升级来应对越来越多的数据包处理需求。

    三.网卡接收与发送流程

    发送流程如下:

    1. CPU通知网卡控制器发送内存中的数据

    2. 网卡控制器使用DMA将内存中的数据拷贝到网卡本地内存的发送队列

    3. 网卡的MAC单元等待数据拷贝完成,准备发送

    4. 网卡MAC单元通过PHY(PortPhysical Layer)单元将数据的数字信号转换为对应的电信号或光信号从线缆发送出去

    5. 网卡控制器通知CPU数据发送完成

    接收流程如下:

    1. 网卡的PHY单元接收到数据包信号,将其转换为数字信号

    2. 网卡的MAC单元将数据包存储在本地内存的接收队列上

    3. 网卡控制器使用DMA将数据拷贝到系统内存上

    4. 网卡控制器以中断方式告诉CPU数据包已放在了指定的内存空间

    网卡连接主板接口的发展

    1. 主板内置网卡(LAN OnMotherboard, LOM),一般为100Mbps或1Gbps,速度慢

    2. PCI:也叫传统PCI,速度比较慢

    3. PCI Express:支持热插拔,提供更高的总线传输率和带宽

    网口的发展

    常见接口:电口(RJ-45),光口,InfiniBand

    速度发展从100Mbps到100Gbps快速发展

    四.网卡控制器的发展

      目前常用的网卡控制器都是ASIC(专用集成电路)芯片,该芯片固化了网络的功能,速度快,设计完成后,成本低。但不可编程。

       现在FPGA的可编程控制器也越来越流行,原来FPGA是作为实验和研究的平台,比如设计和实验新的网络功能,之后使用ASIC实现。随着虚拟化,云计算的发展,FPGA成本的降低,FPGA的使用也越来越多。

       还有一种是ASIC和FPGA混合方案,力图做到兼顾两者的优点。

       ASIC芯片控制器的发展使得网卡的功能越来越强大,之前很多数据包处理的功能都是CPU来完成,占用大量CPU时间,很多重复简单的工作被网卡芯片来处理大大减轻了CPU的负担,这就是网卡offload功能。

    我们使用 ethtool -k eth0 命令可以看到网卡支持的offload功能。

    • Checksumming:TCP,UDP数据包都有checksum字段,这些checksum的计算和校验交由网卡处理。
    • segmentation-offload:由于MTU的限制,从网卡发出去的包中PDU(ProtocolData Unit)需要小于等于MTU,所以网卡发出去的数据包的大小都有限制。用户态应用程序发送数据时,不会关心MTU,一个IP数据包最大可以是65535B,即MTU最大可以是65535,但是这个数据包要从网卡发出必须要切分为1500的小包。这个切分过程如果CPU来做会占用大量CPU时间,segmentation-offload就是网卡来做这件事。当然如果你将MTU设置为9000(jumbo frame),CPU和网卡都会少处理一些。MTU理论上虽然可以设置更大,但是9000是一个标准,交换机、网卡等都支持,为什么不能设置更大,一个原因是设备不支持,另一个原因是太大的话数据包传输过程中出错几率就变大,数据包处理慢,延时也变高。
    • receive-offload:这个和segmentation-offload刚好相反,网卡收到小包之后,根据包的字段知道可以合成为一个大包,就会将这些小包合成为大包之后给到应用程序,这样既减少了CPU的中断,也减少了CPU处理大量包头的负担。
    • scatter-gather:DMA将主存中的数据包拷贝到网卡内存时,由于主存中的数据包内容在物理内存上是分散存储的,如果没有scatter-gather,DMA没法直接拷贝,需要kernel拷贝一次数据让地址连续,有了scatter-gather,就可以少一次内存拷贝。
    • tx-fcoe-segmentation,tx-gre-segmentation,tx-ipip-segmentation,tx-sit-segmentation,tx-udp_tnl-segmentation,tx-mpls-segmentation: 这些基本是overlay或其他类型的数据包网卡是否支持的offload,比如udp_tnl就是指vxlan是否支持offload。
    • ntuple-filters,receive-hashing:如果网卡支持多队列,ntuple-filters使得用户可以设置不同的数据包到不同的队列,receive-hashing根据从网卡进来的数据包hash到不同的队列处理,实现并发接收数据包。

    还有很多offload,都对性能有或多或少的影响。

    随着网卡的不断发展,智能网卡会承载越来越多的功能,以减轻CPU的负担。

    比如:

    • 将安全相关的处理(SSL/IPsec,防火墙,入侵检测,防病毒)集成在网卡中
    • 将协议栈实现在网卡中
    • 将虚拟交换机功能实现在网卡中(ASAP2)
    • 使用FPGA的网卡实现用户对网卡的自定义。

    五.网卡offload

    对于云计算中虚拟机的网络,首先充分利用网卡的Offload功能,性能会有很大提升,其次从虚拟机网卡到物理网卡的这段路径如何实现也会对性能产生很大影响,目前有四种方式

    1. Passthrough方式:直接把物理网卡映射给虚机,虽然这种性能是最好的,但是丧失了虚拟化的本质,一个物理网卡只能被一个虚机使用。

    2. SR-IOV方式:物理网卡支持虚拟化功能,能将物理网卡虚拟成多个网卡,让多个虚机直接使用,相当于虚拟机直接使用物理网卡功能,性能很好。但是对于虚拟机的防火墙,动态迁移等不好实现。

    3. Virtio半虚拟化方式:Vritio是Hypervisor中IO设备的抽象层,虚拟机的网卡是Virtio的前端驱动实现,而后端驱动实现可以是Linux kernel中的vhost-net,也可以用户态的vhost-user。后端驱动实现的方式对Virtio性能影响很大。

    4. 全虚拟化方式:完全由QEMU纯软件模拟的设备,性能最差。

    六.网卡调优

    硬件调优尽量使用网卡的offload,offload的成本是低的,效果是明显的。

    Offload的一些参数调优

    1. 查看设置网卡队列个数

    ethtool -l eth0

    2.查看设置ring buffer大小

    ethtool -g eth0

    3. 查看设置RSS的hash策略,比如vxlan的数据包,两个物理节点的mac和ip是不变的,我们在进行hash时可以算上port,这样两个物理节点之间vxlan也能使用网卡多队列。

    ethtool -N eth0 rx-flow-hash udp4 sdfn

    七.软件优化

    标准Linux网络栈设计复杂,但也是最通用的。下面是一些优化点.

    1. 软中断的优化处理

    网卡的每个队列会对应一个CPU来处理数据包到达的软中断,合理的将网卡队列绑定到指定的CPU能更好的并发处理数据包,比如将网卡队列绑定到离网卡近的CPU上。

    2. 减少不必要的网络栈处理,比如如果不使用ipv6,可以disable掉,如果不使用iptables,清空规则。

    3. 网络参数的优化,比如调整socketbuffer,txqueuelen的大小等等。

    b. OvS+DPDK

    DPDK是Intel实现的一个用户态高速数据包处理框架,相比于Linux内核实现的数据包处理方式,有以下优势。

    1. 用户态驱动程序,避免不必要的内存拷贝和系统调用。

    2. 使用轮询方式从网卡获取数据包,避免中断方式的上下文切换开销。

    3. 独占CPU处理数据包,虽然在网络流量低的时候浪费CPU资源,但是网络流量高的时候处理数据包性能很好,可以避免CPU切换导致的cache miss和上下文切换。最新DPDK可以实现流量小的时候使用中断方式,流量大的时候使用轮询方式。

    4. 内存访问优化,充分利用NUMA架构,大页内存,无锁队列实现数据包的并发高效处理。

    5. 软件的优化,比如cache line对齐,CPU预取数据,充分利用IntelCPU的网络相关新指令来提升性能。

    6. 充分利用网卡的Offload功能实现硬件加速。

    虽然DPDK对于数据包处理性能很好,但是它只是将数据包高效的送给用户态,而没有网络栈去处理数据包,社区版DPDK也无法与Linux网络栈很好结合,所以基于Linux网络栈实现的网络应用程序无法直接使用DPDK,如果要使用DPDK,应用程序需要重写。当然如果是全新的网络程序,基于DPDK开发是个不错的选择。

    OvS是目前主流的虚拟交换机,支持主流的交换机功能,比如二层交换、网络隔离、QoS、流量监控等,而其最大的特点就是支持openflow,openflow定义了灵活的数据包处理规范,通过openflow流表可以实现各种网络功能,并且通过openflow protocol可以方便的实现控制+转发分离的SDN方案。

    OvS丰富的功能和稳定性使得其被部署在各种生产环境中,加上云计算的快速发展,OvS成为了云网络里的关键组件。随着OvS的广泛使用,对OvS的性能也提出了更高的要求。

    标准OvS的数据包处理是在kernel中有个datapath,缓存流表,实现快速数据包转发。Kernel中数据包的处理复杂,效率相比DPDK慢不少,因此使用DPDK加速能有效的提升OvS数据包处理的能力。

    虽然DPDK没有用户态网络栈支撑,但是OvS提供的基于流表的交换机,负责连通虚机和网卡,不需要网络栈的更多功能,通过DPDK加速,云环境中虚机到网卡的性能得到了很大提升。

     

    展开全文
  • 网卡调优基本套路

    2020-08-02 10:02:53
  • 高并发、大流量网卡调优

    千次阅读 2016-08-09 10:07:42
    周五晚上LVS集群的一台LB由于CPU单核耗尽挂掉了,最后查到原因是网卡调优没有生效,今天查了一下网卡调优的资料,感谢同事higkoo给我讲解了一下这方面的东西,下面是关于我们公司网卡调优的相关知识,欢迎大家共同...

    周五晚上LVS集群的一台LB由于CPU单核耗尽挂掉了,最后查到原因是网卡调优没有生效,今天查了一下网卡调优的资料,感谢同事higkoo给我讲解了一下这方面的东西,下面是关于我们公司网卡调优的相关知识,欢迎大家共同探讨,让我们的机器跑的更high。

    1、Broadcom的网卡建议关闭GRO功能

    1
    2
    3
    4
    ethtool  -K eth0 gro off
    ethtool  -K eth1 gro off
    ethtool  -K eth2 gro off
    ethtool  -K eth3 gro off

    2、关闭irqbalance服务并手动分配网卡中断

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    service irqbalance stop
    chkconfig irqbalance off
    # 查看网卡中断号
    grep  ethx  /proc/interrupts
    # 分配到每颗颗CPU核上
    cat  /proc/irq/ {84,85,86,87,88,89,90,91,92,93} /smp_affinity
    echo  1 >  /proc/irq/84/smp_affinity
    echo  2 >  /proc/irq/85/smp_affinity
    echo  4 >  /proc/irq/86/smp_affinity
    echo  8 >  /proc/irq/87/smp_affinity
    echo  10 >  /proc/irq/88/smp_affinity
    echo  20 >  /proc/irq/89/smp_affinity
    echo  40 >  /proc/irq/90/smp_affinity
    echo  80 >  /proc/irq/91/smp_affinity
    echo  100 >  /proc/irq/92/smp_affinity
    echo  200 >  /proc/irq/93/smp_affinity
    PS:smp_affinity的值可以用下面脚本算哈,此脚本来自:http: //rfyiamcool .blog.51cto.com /1030776/1335700
    #!/bin/bash
    #
    echo  "统计cpu的16进制"
    [ $ # -ne 1 ] && echo ‘$1 is Cpu core number’ && exit 1
    CCN=$1
    echo  “Print eth0 affinity”
    for ((i=0; i<${CCN}; i++))
    do
    echo  ==============================
    echo  "Cpu Core $i is affinity"
    ((affinity=(1<<i)))
    echo  "obase=16;${affinity}"  bc
    done
    使用方法:sh 脚本名字 空格 cpu核数

     

    3、开启网卡的RPS功能 (Linux内核2.6.38或以上版本支持)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # Enable RPS (Receive Packet Steering)
    rfc=4096
    cc=$( grep  -c processor  /proc/cpuinfo )
    rsfe=$( echo  $cc*$rfc |  bc )
    sysctl -w net.core.rps_sock_flow_entries=$rsfe
    for  fileRps  in  $( ls  /sys/class/net/eth * /queues/rx- * /rps_cpus )
    do
    echo  fff > $fileRps
    done
    for  fileRfc  in  $( ls  /sys/class/net/eth * /queues/rx- * /rps_flow_cnt )
    do
    echo  $rfc > $fileRfc
    done
    tail  /sys/class/net/eth * /queues/rx- */{rps_cpus,rps_flow_cnt}

    献上一个完整的脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    vi  /opt/sbin/change_irq .sh
    #!/bin/bash
    ethtool  -K eth0 gro off
    ethtool  -K eth1 gro off
    ethtool  -K eth2 gro off
    ethtool  -K eth3 gro off
    service irqbalance stop
    chkconfig irqbalance off
    cat  /proc/irq/ {84,85,86,87,88,89,90,91,92,93} /smp_affinity
    echo  1 >  /proc/irq/84/smp_affinity
    echo  2 >  /proc/irq/85/smp_affinity
    echo  4 >  /proc/irq/86/smp_affinity
    echo  8 >  /proc/irq/87/smp_affinity
    echo  10 >  /proc/irq/88/smp_affinity
    echo  20 >  /proc/irq/89/smp_affinity
    echo  40 >  /proc/irq/90/smp_affinity
    echo  80 >  /proc/irq/91/smp_affinity
    echo  100 >  /proc/irq/92/smp_affinity
    echo  200 >  /proc/irq/93/smp_affinity
    # Enable RPS (Receive Packet Steering)
    rfc=4096
    cc=$( grep  -c processor  /proc/cpuinfo )
    rsfe=$( echo  $cc*$rfc |  bc )
    sysctl -w net.core.rps_sock_flow_entries=$rsfe
    for  fileRps  in  $( ls  /sys/class/net/eth * /queues/rx- * /rps_cpus )
    do
    echo  fff > $fileRps
    done
    for  fileRfc  in  $( ls  /sys/class/net/eth * /queues/rx- * /rps_flow_cnt )
    do
    echo  $rfc > $fileRfc
    done
    tail  /sys/class/net/eth * /queues/rx- */{rps_cpus,rps_flow_cnt}
    chmod  +x  /opt/sbin/change_irq .sh
    echo  "/opt/sbin/change_irq.sh"  >>  /etc/rc . local
    PS:记得修改网卡中断号,别直接拿来用哦
    展开全文
  • 昨天在查LVS调度均衡性问题时,最终确定是persistence_timeout参数会...过去使用LVS,遇到过单核CPU被软中断耗尽的问题,然后知道了网卡驱动与多队列。而后知道了淘宝对LVS的优化,然后对生产环境进行了优化,效果显
  • Mellanox网卡参数调优

    千次阅读 2021-04-07 14:31:37
    为了提高IPv4和IPv6的流量性能,可以使用Linux sysctl命令修改操作系统设置的默认系统网络参数。但是,需要注意,更改网络参数可能会在不同的系统上产生不同的结果。结果显著依赖于CPU和芯片组的效率。...
  • 网卡性能调优

    千次阅读 2015-03-27 14:29:43
    大量小包的CPU密集型系统调优案例一则 http://blog.netzhou.net/?p=181 我的blog前面有一篇文章描述了软终端导致单cpu消耗100%,导致机器丢包跟延迟高的问题,文中我只是简单的说明了一下升级内核...
  • 网卡调优绑定

    千次阅读 2018-04-13 11:57:06
    numa架构,万兆网卡两个,挂载不同numa[root@localhost ~]# lscpuArchitecture: x86_64CPU op-mode(s): 32-bit, 64-bitByte Order: Little EndianCPU(s): 88On-line CPU(s) list: 0-8...
  • Intel光网卡调优

    千次阅读 2017-01-18 16:03:59
    随着电信行业步入4G时代,业务数据海量增长,为了提升处理能力,项目最近准备采购一批光网卡以取代普通网卡进行移动网络语音数据采集处理。 项目上的Probe程序在使用普通千兆网卡时理想处理速率在300Mbps~400Mbps,...
  • Linux网卡调优篇-禁用ipv6与优化socket缓冲区大小  作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。  一般在内网环境中,我们几乎是用不到IPV6,因此我们没有必要把多不用的功能开起来从而...
  • 周五晚上LVS集群的一台LB由于CPU单核耗尽挂掉了,最后查到原因是网卡调优没有生效,今天查了一下网卡调优的资料,感谢同事higkoo给我讲解了一下这方面的东西,下面是关于我们公司网卡调优的相关知识,欢迎大家共同...
  • PCIe的特性之一。总之,MSI-X使用软件来分配中断号,这样就避免了由于硬件中断线有限而...大包情况:如果网卡接收的数据包普遍都是大包,并且是短间隔的连续接收,那么82575/6网卡的interrupt moderation将会带来很...
  • 网卡内核参数调优

    2017-12-10 08:53:57
    例如, 下面是最重要的一些调优参数, 后面是它们的含义: 1. /proc/sys/net/core/rmem_max — 最大的TCP数据接收缓冲 2. /proc/sys/net/core/wmem_max — 最大的TCP数据发送缓冲 3. /proc/sys/...
  • 昨天在查LVS调度均衡性问题时,最终确定是persistence_timeout参数...过去使用LVS,遇到过单核CPU被软中断耗尽的问题,然后知道了网卡驱动与多队列。而后知道了淘宝对LVS的优化,然后对生产环境进行了优化,效果显著...
  • 前言因为交易系统部的同事在测试研究 Intel DPDK 和 Solarflare 的低延迟性能,硬件是 Dell R730 , OS 为 RHEL7.2 ,之前也对 DPDK 有所了解借这个机会再多接触一些,前者是开源方案但需要强大的技术团队支撑,而后...
  • 周五晚上LVS集群的一台LB由于CPU单核耗尽挂掉了,最后查到原因是网卡调优没有生效,今天查了一下网卡调优的资料,感谢同事higkoo给我讲解了一下这方面的东西,下面是关于我们公司网卡调优的相关知识,欢迎大家共同...
  • 返回专栏总目录 文章目录 一、USBNET驱动模型 二、上位机网卡枚举信息与交互过程 2.1、网卡USB接口描述符 2.2、网卡控制消息 沉淀、分享、成长,让自己和他人都能有所收获! 本篇章将介绍USBNET驱动模型 一、USBNET...
  • 最近作了一些系统和网络调优相关的测试,达到了指望的效果,有些感悟。同时,我也发现知乎上对Linux服务器低延迟技术的讨论比较欠缺(满嘴高并发现象);或者对现今cpu + 网卡的低延迟潜力认识不足(动辄FPGA现象),...
  • 把以下代码全部复制在ssh工具里一次性执行: cat >> /etc/sysctl.conf 无限星辰 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明centos系统网卡性能优化!
  • 网卡性能优化

    2021-07-24 13:10:04
    ip add 查看网卡名字 cat /proc/interrupts | grep 网卡名字 读取interrupts会依次显示irq编号,每个cpu对该irq的处理次数,中断控制器的名字,irq的名字,以及驱动程序注册该irq时使用的名字 修改数字 echo 1 &...
  • 关于网卡部分的调优

    2019-07-21 09:09:01
    对于多队列的网卡,可以将他的IRQ终端绑定到不同的CPU核上,以此来保证网卡的吞吐量[1][2];但文章[2]中也提到,对于这种情况,如果不同的终端分配之后,可能真正使用的应用程序不在同一个核上,甚至于不在同一个CPU...
  • 以下代码保存为.reg文件,双击运行即可。 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters] "MaxConnectionsPerServer"=dword:00000000 ...
  • 前言因为交易系统部的同事在测试研究Intel DPDK和Solarflare的低延迟性能,硬件是Dell R730,OS为RHEL7.2,之前也对DPDK有所了解借这个机会再多接触一些,前者是开源方案但需要强大的技术团队支撑,而后者却是小众但...
  • KVM网络性能调优终极版

    千次阅读 2017-08-11 11:35:01
    四、KVM网络性能调优 首先,我给大家看一张图,这张图是数据包从虚拟机开始然后最后到物理网卡的过程。 我们分析下这张图,虚拟机有数据包肯定是先走虚拟机自身的那张虚拟网卡,然后发到中间的虚拟化层,再然后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,037
精华内容 4,414
关键字:

网卡调优