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

一.网卡调优方法

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


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

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


  1. #关闭 软IRQ服务
  2. service irqbalance stop
  3. chkconfig irqbalance off

  1. # 查看网卡中断号,ens33是网卡名称,对应的中断号是19
  2. cat /proc/interrupts
  3. CPU0 CPU1
  4. 0: 72 0 IO-APIC-edge timer
  5. 1: 11 143 IO-APIC-edge i8042
  6. 8: 1 0 IO-APIC-edge rtc0
  7. 9: 0 0 IO-APIC-fasteoi acpi
  8. 12: 17 2966 IO-APIC-edge i8042
  9. 14: 0 0 IO-APIC-edge ata_piix
  10. 15: 8343 176 IO-APIC-edge ata_piix
  11. 16: 826 0 IO-APIC-fasteoi vmwgfx, snd_ens1371
  12. 17: 12896 3063 IO-APIC-fasteoi ehci_hcd:usb1, ioc0
  13. 18: 147 296 IO-APIC-fasteoi uhci_hcd:usb2
  14. 19: 287 9931 IO-APIC-fasteoi ens33
  15. 24: 0 0 PCI-MSI-edge PCIe PME, pciehp
  16. 25: 0 0 PCI-MSI-edge PCIe PME, pciehp
  17. 26: 0 0 PCI-MSI-edge PCIe PME, pciehp

  1. smp_affinity的值可以用下面脚本算哈
  2. #!/bin/bash
  3. #
  4. echo "统计cpu的16进制"
  5. [ $# -ne 1 ] && echo ‘$1 is Cpu core number’ && exit 1
  6. CCN=$1
  7. echo “Print eth0 affinity”
  8. for((i=0; i<${CCN}; i++))
  9. do
  10. echo ==============================
  11. echo "Cpu Core $i is affinity"
  12. ((affinity=(1<<i)))
  13. echo "obase=16;${affinity}" | bc
  14. done
  15. 使用方法:sh 脚本名字 空格 cpu核数
  16. [root@localhost ~]# sh 12.sh 2
  17. 统计cpu的16进制
  18. “Print eth0 affinity”
  19. ==============================
  20. Cpu Core 0 is affinity
  21. 1
  22. ==============================
  23. Cpu Core 1 is affinity
  24. 2
  25. # 例如,有多颗CPU和多块网卡,将网卡绑定到每颗CPU核上
  26. cat /proc/irq/{84,85,86,87,88,89,90,91,92,93}/smp_affinity
  27. echo 1 > /proc/irq/84/smp_affinity
  28. echo 2 > /proc/irq/85/smp_affinity
  29. echo 4 > /proc/irq/86/smp_affinity
  30. echo 8 > /proc/irq/87/smp_affinity
  31. echo 10 > /proc/irq/88/smp_affinity
  32. echo 20 > /proc/irq/89/smp_affinity
  33. echo 40 > /proc/irq/90/smp_affinity
  34. echo 80 > /proc/irq/91/smp_affinity
  35. echo 100 > /proc/irq/92/smp_affinity
  36. echo 200 > /proc/irq/93/smp_affinity

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


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

献上一个完整的脚本:


  1. vi /opt/sbin/change_irq.sh
  2. #!/bin/bash
  3. ethtool -K eth0 gro off
  4. ethtool -K eth1 gro off
  5. ethtool -K eth2 gro off
  6. ethtool -K eth3 gro off
  7. service irqbalance stop
  8. chkconfig irqbalance off
  9. cat /proc/irq/{84,85,86,87,88,89,90,91,92,93}/smp_affinity
  10. echo 1 > /proc/irq/84/smp_affinity
  11. echo 2 > /proc/irq/85/smp_affinity
  12. echo 4 > /proc/irq/86/smp_affinity
  13. echo 8 > /proc/irq/87/smp_affinity
  14. echo 10 > /proc/irq/88/smp_affinity
  15. echo 20 > /proc/irq/89/smp_affinity
  16. echo 40 > /proc/irq/90/smp_affinity
  17. echo 80 > /proc/irq/91/smp_affinity
  18. echo 100 > /proc/irq/92/smp_affinity
  19. echo 200 > /proc/irq/93/smp_affinity
  20. # Enable RPS (Receive Packet Steering)
  21. rfc=4096
  22. cc=$(grep -c processor /proc/cpuinfo)
  23. rsfe=$(echo $cc*$rfc | bc)
  24. sysctl -w net.core.rps_sock_flow_entries=$rsfe
  25. for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus)
  26. do
  27. echo fff > $fileRps
  28. done
  29. for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt)
  30. do
  31. echo $rfc > $fileRfc
  32. done
  33. tail /sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}
  34. chmod +x /opt/sbin/change_irq.sh
  35. echo "/opt/sbin/change_irq.sh" >> /etc/rc.local
  36. 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加速,云环境中虚机到网卡的性能得到了很大提升。

【转帖】x86服务器中网络性能分析与调优(高并发、大流量网卡调优)的更多相关文章

  1. x86服务器中网络性能分析与调优 转

    x86服务器中网络性能分析与调优 2017-04-05 巨枫 英特尔精英汇 [OpenStack 易经]是 EasyStack 官微在2017年新推出的技术品牌,将原创技术干货分享给您,本期我们讨论 ...

  2. 高并发大流量专题---11、Web服务器的负载均衡

    高并发大流量专题---11.Web服务器的负载均衡 一.总结 一句话总结: 推荐使用nginx七层(应用层)负载均衡的实现:配置那是相当的简单 http{ upstream cluster{ serv ...

  3. 中国移动基于ARM/x86服务器的Ceph性能对比

    2018年11月17日,Ceph中国行首次走进杭州,万众期待的杭州站沙龙如期而至,虽然杭州已经开始降温,阵雨不断,但活动现场依然热度爆表,杭州各大IT公司的从业人员和Ceph爱好者纷纷而来. 中国移动 ...

  4. Python性能分析与优化PDF高清完整版免费下载|百度云盘

    百度云盘|Python性能分析与优化PDF高清完整版免费下载 提取码:ubjt 内容简介 全面掌握Python代码性能分析和优化方法,消除性能瓶颈,迅速改善程序性能! 对于Python程序员来说,仅仅 ...

  5. linux下改动内核參数进行Tcp性能调优 -- 高并发

    前言: Tcp/ip协议对网络编程的重要性,进行过网络开发的人员都知道,我们所编写的网络程序除了硬件,结构等限制,通过改动Tcp/ip内核參数也能得到非常大的性能提升, 以下就列举一些Tcp/ip内核 ...

  6. 分析http协议和高并发网站架构

    案例任务名称 分析http协议和高并发网站架构 案例训练目标 深入理解http协议的工作原理 掌握http协议的分析方法 包含技能点 搭建web服务器 编辑简单的html页面并上传到服务器 使用wir ...

  7. WireShark网络性能分析

    最近生产上出现一个性能问题,表现为:行情延时5s左右.从log一路追查下去,发现是我们自己写的一个行情网关(部署在xx.xx.xx.132)<->第三方的中转网关(部署在xx.xx.xx. ...

  8. 使用tcpdump+Wireshark(或Fiddler)做linux服务器的网络请求分析

    我们的服务器上,一般都没有窗口界面,这时候要抓包,用tcpdump是最方便的.而分析网络请求时,wireshark又是相当方便的,这时候我们就需要把它们两个一起来使用了. tcpdump 抓取数据 命 ...

  9. Qt 框架的图形性能高(OpenGL上的系统效率高),网络性能低,开发效率高,Quick是可以走硬件加速——Qt中分为好几套图形系统,差不多代表了2D描画的发展史。最经典的软描画系统

    -----图形性能部分-----Qt的widgets部分,运行时的图像渲染性能是一般的,因为大部分的界面内容都是Qt自绘,没有走硬件加速,也就是说很多图形内容都是CPU算出来的.但是widgets底层 ...

  10. Linux服务器I/O性能分析-2

    一.如何正确分析IO性能 1.1 BLKTRACE分析IO性能 之前的文章已经说明,要是系统发生I/O性能问题,我们常用的命令是无法精确定位问题(内核I/O调度器消耗的时间和硬件消耗的时间,这个不能作 ...

随机推荐

  1. 斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论

    前言 UE C++在国内目前还处于比较新的一个领域,网上能找到的教程多为蓝图教程,且质量良莠不齐.终于在B站找到了外网搬运的斯坦福UE C++课程,目前看下来是一个完整的ARPG游戏实例教学,对于入门 ...

  2. vscode 启动go

    { "version": "0.2.0", "configurations": [ { "name": "La ...

  3. 云图说 | 华为云MCP多云容器平台,让您轻松灾备!

    摘要:多云容器平台是华为云基于多年容器云领域实践经验和社区先进的集群联邦技术,提供的容器多云和混合云的解决方案. 多云容器平台(Multi-Cloud Container Platform,MCP)是 ...

  4. 让 AI “潜入”物流中心,你的快递很快就到!

    摘要:华为利用数字化.智能化的手段从传统物流运营转升成为专业智慧物流,在那些"看不见的地方"华为正在默默耕耘. 网购已经成为了新时代下的"日常",于是每年的「6 ...

  5. 火山引擎DataLeap如何解决SLA治理难题(一):应用场景与核心概念介绍

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 基于火山引擎分布式治理的理念,数据平台数据治理团队自研了火山引擎DataLeap SLA保障平台,目前已在字节内部 ...

  6. Solon 的多配置文件切换

    比如有配置文件: app.yml app-dev.yml app-pro.yml 可以通过启动参数:-env java -jar demoapp.jar -env=dev

  7. Cypress系列(1)-Window下安装Cypress并打开

    Cypress系列(1)-Window下安装Cypress并打开 系统要求 Cypress是一个被安装在你电脑上的桌面应用,你的操作系统需要满足如下条件才能正常安装 Mac OS 10.9+(仅提供6 ...

  8. Hugging News 年度特刊: Transformers & Gradio 年终大事件总结

    Transformers 年终大事件总结 对于 Transformers 来说,这是激动人心的一年.2022 年,我们的每周活跃用户数量增加了两倍,最近的一周用户超过 100 万,平均每日 pip 安 ...

  9. Github 自建一个 Helm Charts 库

    前言 在构建私有的 charts 仓库之前,有几个先决条件: Helm 已经安装,版本号是 v3 拥有一个 Github 账号 初始化仓库 在 github 仓库上新建一个仓库,我这里命名为 helm ...

  10. MySQL 的 crash-safe 原理解析

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/5i9wmJs4_Er7RaYfNnETyA作者:xieweipeng MySQL作为当下最流行 ...