x86服务器中网络性能分析与调优(高并发、大流量网卡调优)
最近在百度云做一些RTC大客戶的項目,晚上邊緣計算的一臺宿主機由于CPU單核耗被打滿,最后查到原因是網卡調優沒有生效,今天查了一下網卡調優的資料,歡迎大家共同探討。
一.網卡調優方法
1、Broadcom的網卡建議關閉GRO功能
ethtool?-K eth0 gro offethtool?-K eth1 gro offethtool?-K eth2 gro offethtool?-K eth3 gro off2、關閉irqbalance服務并手動分配網卡中斷
#關閉 軟IRQ服務 service irqbalance stop chkconfig irqbalance off # 查看網卡中斷號,ens33是網卡名稱,對應的中斷號是19 cat /proc/interruptsCPU0 CPU1 0: 72 0 IO-APIC-edge timer1: 11 143 IO-APIC-edge i80428: 1 0 IO-APIC-edge rtc09: 0 0 IO-APIC-fasteoi acpi12: 17 2966 IO-APIC-edge i804214: 0 0 IO-APIC-edge ata_piix15: 8343 176 IO-APIC-edge ata_piix16: 826 0 IO-APIC-fasteoi vmwgfx, snd_ens137117: 12896 3063 IO-APIC-fasteoi ehci_hcd:usb1, ioc018: 147 296 IO-APIC-fasteoi uhci_hcd:usb219: 287 9931 IO-APIC-fasteoi ens3324: 0 0 PCI-MSI-edge PCIe PME, pciehp25: 0 0 PCI-MSI-edge PCIe PME, pciehp26: 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或以上版本支持)
獻上一個完整的腳本:
vi?/opt/sbin/change_irq.sh#!/bin/bashethtool?-K eth0 gro offethtool?-K eth1 gro offethtool?-K eth2 gro offethtool?-K eth3 gro offservice irqbalance stopchkconfig irqbalance offcat?/proc/irq/{84,85,86,87,88,89,90,91,92,93}/smp_affinityecho?1 >?/proc/irq/84/smp_affinityecho?2 >?/proc/irq/85/smp_affinityecho?4 >?/proc/irq/86/smp_affinityecho?8 >?/proc/irq/87/smp_affinityecho?10 >?/proc/irq/88/smp_affinityecho?20 >?/proc/irq/89/smp_affinityecho?40 >?/proc/irq/90/smp_affinityecho?80 >?/proc/irq/91/smp_affinityecho?100 >?/proc/irq/92/smp_affinityecho?200 >?/proc/irq/93/smp_affinity# Enable RPS (Receive Packet Steering)rfc=4096cc=$(grep?-c processor?/proc/cpuinfo)rsfe=$(echo?$cc*$rfc |?bc)sysctl -w net.core.rps_sock_flow_entries=$rsfefor?fileRps?in?$(ls?/sys/class/net/eth*/queues/rx-*/rps_cpus)doecho?fff > $fileRpsdonefor?fileRfc?in?$(ls?/sys/class/net/eth*/queues/rx-*/rps_flow_cnt)doecho?$rfc > $fileRfcdonetail?/sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}chmod?+x?/opt/sbin/change_irq.shecho?"/opt/sbin/change_irq.sh"?>>?/etc/rc.localPS:記得修改網卡中斷號,別直接拿來用哦二.?網絡性能理論極限
網絡數據包處理的性能指標,一般包括吞吐、延時、丟包率、抖動等。
數據包有大有小,數據包的大小對這些性能指標有很大的影響。
一般認為服務器處理能力很強,不是數據包處理的瓶頸,而通過物理線路能夠傳送數據包的最大速率,即線速(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服务器中网络性能分析与调优(高并发、大流量网卡调优)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 调优篇 :硬件调优(BIOS
- 下一篇: XDP(eXpress Data Pat