物理服務器網(wǎng)絡性能優(yōu)化
#01、基礎知識
中斷本質(zhì)是一種電信號,由硬件產(chǎn)生,并直接送到中斷控制器,然后再由中斷控制器向 CPU發(fā)送信號。常見的中斷控制器有兩種:可編程中斷控制器(8259A)和高級可編程中斷控制器(APIC),8259A只適合單CPU的情況,高級可編程中斷控制器(APIC)更能充分發(fā)揮多CPU多核的SMP體系(Symmetric Multi-Processor)優(yōu)勢,把中斷傳遞給每個CPU以便更好實現(xiàn)并行和性能提高。同時,Linux kernel 2.4以后的版本支持通過SMP IRQ Affinity實現(xiàn)把不同硬件中斷請求(IRQs)分配到特定的CPU上。
SMP IRQ affinity允許系統(tǒng)限制或者重新分配服務器的工作負載, 從而讓服務器更有效的工作。以網(wǎng)卡中斷為例,在沒有設置SMP IRQ affinity時, 所有網(wǎng)卡中斷都關聯(lián)到CPU0, 這導致了CPU0負載過高,而無法有效快速地處理網(wǎng)絡數(shù)據(jù)包,容易產(chǎn)生性能瓶頸。通過SMP IRQ affinity,把網(wǎng)卡多個中斷分配到多個CPU上,可以分散CPU壓力,提高數(shù)據(jù)處理速度。
圖1 SMP對稱多處理器結構
同時,Linux的irqbalance用于優(yōu)化中斷分配,自動收集系統(tǒng)數(shù)據(jù)以分析使用模式,并依據(jù)系統(tǒng)負載狀況將工作狀態(tài)置于Performance Mode或Power-Save Mode。處于Performance Mode時irqbalance會將中斷盡可能均勻地分發(fā)給各個CPU以充分利用CPU多核,提升性能;處于Power-Save Mode時,irqbalance會將中斷集中分配給第一個CPU,以保證其它空閑CPU的睡眠時間,降低能耗。
正常情況下,一張網(wǎng)卡只有一個隊列用來接收網(wǎng)絡數(shù)據(jù)包時,同一時間數(shù)據(jù)包的處理只能由某個單核處理,不僅無法發(fā)揮多CPU多核優(yōu)勢,而且大流量帶寬下必然造成數(shù)據(jù)包阻塞。因此,隨著技術的發(fā)展,引入了網(wǎng)卡多隊列機制,一張網(wǎng)卡支持多個隊列來接發(fā)收數(shù)據(jù)包,這樣同一時間多個隊列的數(shù)據(jù)包可以分散到不同的CPU進行處理。RSS(Receive Side Scaling)是網(wǎng)卡的硬件特性,實現(xiàn)多隊列,每個隊列對應一個中斷號,通過中斷綁定實現(xiàn)網(wǎng)卡中斷在多CPU多核上的分配。
但是在網(wǎng)絡壓力較大時,多隊列網(wǎng)卡I/O產(chǎn)生的中斷訪問非常多,此時隊列數(shù)量會對網(wǎng)卡數(shù)據(jù)包的處理效率產(chǎn)生較大影響。根據(jù)實踐經(jīng)驗,當單個PCIe槽位上網(wǎng)卡的隊列總數(shù)等于該PCIe槽位所連接的CPU物理核數(shù)時,網(wǎng)卡I/O中斷的處理效率將會最高。例如,單顆CPU的物理核心數(shù)為32,每張網(wǎng)卡的端口為2,所以網(wǎng)卡的多隊列數(shù)應設置為16=32/2。
由于操作系統(tǒng)默認通過irqbalance服務來分派網(wǎng)卡隊列中的網(wǎng)絡數(shù)據(jù)包交由哪個CPU core處理,當irqbalance服務分配的處理網(wǎng)卡中斷的CPU core不是網(wǎng)卡PCIe槽位所連接的CPU die或CPU時,會觸發(fā)跨CPU die或CPU的core訪問,中斷處理效率會比較低。因此,在網(wǎng)卡隊列數(shù)設置完成后,我們還需要關閉irqbalance服務,將網(wǎng)卡隊列中斷號綁定到處理網(wǎng)卡中斷的CPU core上,從而減少跨CPU die或CPU訪問所帶來的額外開銷,進一步提升網(wǎng)絡處理性能。
#02、動手實踐
1、判斷當前系統(tǒng)環(huán)境是否支持多隊列網(wǎng)卡。
# lspci -vvv |
如果在Ethernet項中含有MSI-X: Enable+ Count=9 Masked-語句,則說明當前系統(tǒng)環(huán)境是支持多隊列網(wǎng)卡的,否則不支持。
2、查看網(wǎng)卡是否支持多隊列,以及最多支持多少、當前開啟多少。
# ethtool -l eth0 ## 查看 eth0 多隊列情況 |
3、設置網(wǎng)卡當前使用多隊列。
# ethtool -L eth0 combined <N> ## 針對 eth0 網(wǎng)卡設置多隊列,N為要設置的隊列數(shù) |
4、確保多隊列設置確實已生效,可以查看文件。
# ls /sys/class/net/eth0/queues/ ## 確認rx數(shù)量等于設定值 rx-0 rx-2 rx-4 rx-6 tx-0 tx-2 tx-4 tx-6 |
5、查看系統(tǒng)給網(wǎng)卡端口分配的中斷號。
# cat /proc/interrupts | grep –i eth0 |
6、主動關閉irqbalance進程。
# service irqbalance stop |
7、更新文件,設置中斷綁定。
通過修改
或
可以設置中斷綁定,其中{IRQ_ID}是相應的中斷號。smp_affinity內(nèi)容是16進制,smp_affinity_list內(nèi)容是10進制,兩個文件相通,修改一個之后另一個相應改變。
#03、經(jīng)驗總結
1、可以通過手動改變smp_affinity文件中的值來將IRQ綁定到指定的CPU核心上,或者啟用irqbalance服務來自動綁定IRQ到CPU核心上。針對多CPU多核的SMP體系,一般默認啟用irqbalance簡化配置并保障性能。
2、對于文件服務器、高流量Web服務器這樣的應用來說,把不同的網(wǎng)卡IRQ均衡綁定到不同的CPU上將會減輕某個CPU的負擔,提高多個CPU整體處理中斷的能力。
3、對于數(shù)據(jù)庫服務器這樣的應用來說,把磁盤控制器綁到一個CPU、把網(wǎng)卡綁定到另一個CPU將會提高數(shù)據(jù)庫的響應時間實現(xiàn)優(yōu)化性能。
綜上所述,性能優(yōu)化是一個過程而不是結果,需要大量的測試、觀察、驗證和改進。因此,應用系統(tǒng)需要合理地根據(jù)生產(chǎn)環(huán)境配置和應用特點來平衡IRQ中斷,從而不斷提高系統(tǒng)的整體吞吐能力和性能。























