【转帖】x86服务器中网络性能分析与调优(高并发、大流量网卡调优)
最近在百度云做一些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加速,云环境中虚机到网卡的性能得到了很大提升。
【转帖】x86服务器中网络性能分析与调优(高并发、大流量网卡调优)的更多相关文章
- x86服务器中网络性能分析与调优 转
x86服务器中网络性能分析与调优 2017-04-05 巨枫 英特尔精英汇 [OpenStack 易经]是 EasyStack 官微在2017年新推出的技术品牌,将原创技术干货分享给您,本期我们讨论 ...
- 高并发大流量专题---11、Web服务器的负载均衡
高并发大流量专题---11.Web服务器的负载均衡 一.总结 一句话总结: 推荐使用nginx七层(应用层)负载均衡的实现:配置那是相当的简单 http{ upstream cluster{ serv ...
- 中国移动基于ARM/x86服务器的Ceph性能对比
2018年11月17日,Ceph中国行首次走进杭州,万众期待的杭州站沙龙如期而至,虽然杭州已经开始降温,阵雨不断,但活动现场依然热度爆表,杭州各大IT公司的从业人员和Ceph爱好者纷纷而来. 中国移动 ...
- Python性能分析与优化PDF高清完整版免费下载|百度云盘
百度云盘|Python性能分析与优化PDF高清完整版免费下载 提取码:ubjt 内容简介 全面掌握Python代码性能分析和优化方法,消除性能瓶颈,迅速改善程序性能! 对于Python程序员来说,仅仅 ...
- linux下改动内核參数进行Tcp性能调优 -- 高并发
前言: Tcp/ip协议对网络编程的重要性,进行过网络开发的人员都知道,我们所编写的网络程序除了硬件,结构等限制,通过改动Tcp/ip内核參数也能得到非常大的性能提升, 以下就列举一些Tcp/ip内核 ...
- 分析http协议和高并发网站架构
案例任务名称 分析http协议和高并发网站架构 案例训练目标 深入理解http协议的工作原理 掌握http协议的分析方法 包含技能点 搭建web服务器 编辑简单的html页面并上传到服务器 使用wir ...
- WireShark网络性能分析
最近生产上出现一个性能问题,表现为:行情延时5s左右.从log一路追查下去,发现是我们自己写的一个行情网关(部署在xx.xx.xx.132)<->第三方的中转网关(部署在xx.xx.xx. ...
- 使用tcpdump+Wireshark(或Fiddler)做linux服务器的网络请求分析
我们的服务器上,一般都没有窗口界面,这时候要抓包,用tcpdump是最方便的.而分析网络请求时,wireshark又是相当方便的,这时候我们就需要把它们两个一起来使用了. tcpdump 抓取数据 命 ...
- Qt 框架的图形性能高(OpenGL上的系统效率高),网络性能低,开发效率高,Quick是可以走硬件加速——Qt中分为好几套图形系统,差不多代表了2D描画的发展史。最经典的软描画系统
-----图形性能部分-----Qt的widgets部分,运行时的图像渲染性能是一般的,因为大部分的界面内容都是Qt自绘,没有走硬件加速,也就是说很多图形内容都是CPU算出来的.但是widgets底层 ...
- Linux服务器I/O性能分析-2
一.如何正确分析IO性能 1.1 BLKTRACE分析IO性能 之前的文章已经说明,要是系统发生I/O性能问题,我们常用的命令是无法精确定位问题(内核I/O调度器消耗的时间和硬件消耗的时间,这个不能作 ...
随机推荐
- antd ui的from使用问题
select 的allowClear失效问题 select的value与allowClear同时使用会导致allowClear失效 解决方法 from包装一层,通过const [form] = For ...
- 想了解Python中的super 函数么
摘要:经常有朋友问,学 Python 面向对象时,翻阅别人代码,会发现一个 super() 函数,那这个函数的作用到底是什么? 本文分享自华为云社区<Python 中的 super 函数怎么学, ...
- 华为云UGO:醒醒!你的异构数据库迁移难题有救了
摘要:华为云推出的数据库和应用迁移 UGO,正是一款专注于异构数据库结构迁移和应用SQL转换的专业云服务. 数字化时代下,上云已成为企业管理者的基本共识,随着技术日新月异,上云也变得轻松简单起来,但异 ...
- VEGA:诺亚AutoML高性能开源算法集简介
摘要:VEGA是华为诺亚方舟实验室自研的全流程AutoML算法集合,提供架构搜索.超参优化.数据增强.模型压缩等全流程机器学习自动化基础能力. 本文分享自华为云社区<VEGA:诺亚AutoML高 ...
- 火山引擎DataLeap背后的支持者 - 工作流编排调度系统FlowX
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 背景介绍 业务场景 在日常工作中,我们时不时需要对某些逻辑进行重复调度,这时我们就需要一个调度系统.根据不同的调度 ...
- 从“概念”到“应用”,字节跳动基于 DataLeap 的 DataOps 实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,火山引擎数智平台 VeDI Meetup「超话数据」在深圳举办,来自火山引擎的产品专家分享了字节跳动基于 D ...
- A/B 实验避坑指南:为什么不建议开 AABB 实验
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 本文将针对日常开设 A/B 实验过程中一个不太合理的使用方法--AABB 实验进行详细的解释,告诉大家为什么不建议 ...
- Solon2 开发之插件,四、插件热插拔管理机制(H-Spi)
插件热插拔管理机制,简称:H-Spi.是框架提供的生产时用的另一种高级扩展方案.相对E-Spi,H-Spi 更侧重隔离.热插热拔.及管理性. 应用时,是以一个业务模块为单位进行开发,且封装为一个独立插 ...
- VS IIS Express 启动项目后,绑IP让别人可以访问你的网站
如何VS IIS Express 启动项目后,绑本机IP,让别人可以访问你的网站,方便Debug 一.修改iis配置 1.在web服务器执行后,会运行IIS Express,右击它选择显示所有应用程序 ...
- C99标准前后对于二维数组的动态声明问题
html: toc: true 写在前面: 出于作者不了解C99以前标准中对二维数组的动态声明而导致的一场考场事故,作者写下这篇文章,,以便其他同学在遇到类似问题时不要犯同样的错误,同时作为对自己的警 ...