網絡卡中斷負載均衡

2021-08-26 04:43:53 字數 1977 閱讀 5939

現實中的問題

隨著硬體成本的降低,我們伺服器配置也越來越「上流」了,可是單台伺服器的包處理能力還是很有限,經常看到cpu負載很高,linux核心自從2.4版本之後就引入了netfilter框架,網路資料報的處理能力很大程度上是以併發連線數來衡量的,每乙個連線在核心中實際上是做了很多處理的。特別是有大量udp包處理的情況,這些udp包多是短連線,併發量又大,也就是說對cpu的耗費是非常大的。mpstat -p all 1:

我們從圖中可以看出cpu0處於比較繁忙的狀態,佔用率在60%-70%,已經是高負載,實際上linux核心從2.4開始就已經支援中斷數在各個cpu上的負載均衡了,很顯然我們沒有充分利用已有的多cpu資源。

解決之道

我們知道,任何外設(如磁碟,網絡卡等)需要cpu服務時,都會丟擲乙個中斷,中斷告訴cpu發生了什麼事情,cpu就要停止目前的工作來處理這個中斷。比如當網絡卡收到包時,假如cpu正在執行某個應用程序處理程式,此刻就會被網絡卡中斷所打斷執行中斷處理程式。每個外設對應的中斷處理程式自然是不同的,因此為了進行區分,防止多個裝置發出相同的中斷請求,系統中的每個裝置都被分配了乙個獨一無二的irq(interuptrequest)。

每個裝置對應的irq資訊可以從/proc/interrupts中讀取:

第一列即為每台裝置對應的irq,這個在不同機器上可能會不同,該圖中我們可以看出網絡卡eth1對應的irq為16。

第二列到第五列分別對應cpu0-cpu3已經處理的關於某個irq(對應某裝置)的中斷數量。這是我做過優化之後的截圖,可以看到各個cpu都處理了大概一樣多的eth1網絡卡中斷。

第六列對應中斷控制器。

第七列就是具體的裝置了。

其實我們的優化方法也就是想把eth1的中斷請求平均分配在各個cpu上,從linux2.4開始就實現了把irq繫結在某個cpu或者某些cpu上,叫做多cpu中斷親和性。要實現這一點,有若干條件:

1.eth1對應的中斷控制器必須是io-apic晶元,有時候是硬體上支援,但io-apic未被啟用,需要調整系統啟動引數來更改,這一點一定要注意。

2.只有特定cpu才支援,如果是那種cpu超執行緒的,沒有辦法,目前我實驗過的一些intel至強處理器是支援的,如intel(r)xeon(r)[email protected],amd的試過幾個型號不支援。

設定中斷分配的方法很簡單,就是修改/proc/irq/irq/smp_affinity,這裡irq前面已經說過可以從/proc/interrupts裡面查,上圖的例子中eth1對應的irq為16,如果我們需要把eth1網絡卡中斷被各個cpu平均處理,只需要執行如下命令:

echoff>/proc/irq/16/smp_affinity

如果想把eth1對應的中斷繫結在cpu2上處理,執行:

echo04>/proc/irq/16/smp_affinity

此處echo的數字為十六進製制,置1的位對應cpu生效,1對應cpu0,2對應cpu1,4對應cpu2,8對應cpu3,如此類推。

下面看下我們優化後的效果吧:

可以看出cpu繁忙程度平均了,單個cpu的佔用率只有20-30%了,處理能力大大提公升。

上面截圖都是在聊天記錄漫遊的幾台機器上做的優化,優化後機器cpu負載大大降低,不需要進行擴容,有效降低了運營成本。

附:1、如何察看某個程序在哪個cpu上執行:

#top

之後按下f 進入top current fields設定頁面:

選中:j: p = last used cpu (smp)

則多了一項:p 顯示此程序使用哪個cpu。

2、linux下,如何看每個cpu的使用率:

#top

之後按下1. 則顯示多個cpu

cpu0:1.0%us,3.0%sy,0.0%ni, 96.0%id,0.0%wa,0.0%hi,0.0%si,0.0%st

cpu1:0.0%us,0.0%sy,0.0%ni,100.0%id,0.0%wa,0.0%hi,0.0%si,0.0%st

另外,shift+p,按cpu使用率排序,shift+m,按記憶體使用率排序

網絡卡中斷不均衡處理

在資料量大的時候,硬中斷和軟中斷會形成瓶頸。網絡卡接收資料報,從網絡卡產生中斷訊號,cpu將網路資料報拷貝到核心,然後進行協議棧的處理,最後將資料部分傳遞給使用者空間,但硬體中斷處理僅僅做從網絡卡拷貝資料的工作,而協議棧的處理的工作就交給軟中斷處理。所以當硬中斷和軟中斷集中在cpu0的時候,會給排程...

bonding實現網絡卡負載均衡與高可用

bondinglinux bonding 驅動提供了乙個把多個網路介面裝置 為單個的網路介面設定來使用,用於網路負載均衡及網路冗餘。他是解決同乙個ip下突破網絡卡的流量限制的工具,網絡卡網線對吞吐量是有限制的。在資源有限的情況下,bonding做負載均衡是再好不過的辦法。步驟一 首先檢視當前的作業系...

搞機 雙網絡卡做資料均衡負載

我是長城寬頻使用者 艹,重新整理對isp的理解新高度 所以我就想辦法弄了個中國電信緩緩。然後來說說倆者區別在 長城屬於共享型寬頻,且和聯通有合作上行很快 可以申請公網ip 中國電信屬於獨享型頻寬,根據北聯通南電信的規劃所以本身就很好,加之電信有自己的出口節點 國內外全部直連 所以對我來說有聯通和電信...