1. 程式人生 > >高併發多佇列網絡卡設定CPU親和性專案記錄

高併發多佇列網絡卡設定CPU親和性專案記錄

例項

做ssl加速卡(高併發)測試又遇到相同的問題,多佇列網絡卡軟中斷過高,記錄備忘

場景:nginx模擬業務伺服器,worker不繫結;網絡卡佇列親和性不設定
結果:那叫一塌糊塗,3w TPS 0號CPU就滿了, 其中si多達60%,其餘的cpu空閒,總體CPU才使用20%不到

調整場景:多網絡卡佇列繫結CPU親和性,nginx繞開繫結網絡卡佇列親和性的CPU
結果:TPS4.8w 網絡卡打滿,沒有出現cpu使用率過高的情況

調整伺服器:更換萬兆網絡卡模組
結果:測試ssl加速卡的極限值~balabala

修訂:20180418新增
到此並未結束,發現雙c的cpu快壓滿時,編號剛好是1/2處的幾顆cpu idle%最先壓滿,其他還有將近20%左右
cpu


接著調整,將8個網絡卡佇列的4個繫結在編號最前兩個,剩餘的4個繫結在從1/2處編號最前兩個(專案中是40,標號是0~39,那麼繫結0、1、20、21)【注意這裡是手工繫結的沒有使用指令碼進行繫結】
結果比全部繫結在前4顆CPU上要優,且沒有出現靠前和1/2靠前的幾顆cpu長時間被耗盡的情況,相同情況下效能提升
cpu

調整過程

在此說下繫結網絡卡佇列親和性
方式有兩種原理都一樣:手工繫結或者寫個指令碼(省不少事特別是調優需要多次設定)
手工方式把下面腳本里堆積的命令拆出來就可以,下面看指令碼設定親和性(不具有通用性,只是個我做的專案例子)

1、檢視使用網絡卡支援的佇列

./bindCpu.sh
或者
./bind
Cpu.sh list
[[email protected] ~]# ./bindCpu.sh 

Dev:em1
/proc/irq/155/smp_affinity
|----15500000000,00000000,00000000,00000000,00000000,00000001
/proc/irq/156/smp_affinity
|----15600000000,00000000,00000000,00000000,00000000,00000002
/proc/irq/157/smp_affinity
|----15700000000,00000000,00000000,00000000,00000000,00000004
/proc/irq/158/smp_affinity
|----15800000000,00000000,00000000,00000000,00000000,00000008
/proc/irq/159/smp_affinity
|----15900000000,00000000,00000000,00000000,00000000,00000010

Dev:em2
/proc/irq/160/smp_affinity
|----16000000000,00000000,00000000,00000000,00000000,00000001
/proc
/irq/161/smp_affinity |----16100000000,00000000,00000000,00000000,00000000,00000002 /proc/irq/162/smp_affinity |----16200000000,00000000,00000000,00000000,00000000,00000004 /proc/irq/163/smp_affinity |----16300000000,00000000,00000000,00000000,00000000,00000008 /proc/irq/164/smp_affinity |----16400000000,00000000,00000000,00000000,00000000,00000010 Dev:em3 /proc/irq/198/smp_affinity |----19800000000,00000000,00000000,00000000,00000000,00000001 /proc/irq/199/smp_affinity |----19900000000,00000000,00000000,00000000,00000000,00000002 /proc/irq/200/smp_affinity |----20000000000,00000000,00000000,00000000,00000000,00000004 /proc/irq/201/smp_affinity |----20100000000,00000000,00000000,00000000,00000000,00000008 /proc/irq/202/smp_affinity |----20200000000,00000000,00000000,00000000,00000000,00000010 Dev:em4 /proc/irq/203/smp_affinity |----20300000000,00000000,00000000,00000000,00000000,00000001 /proc/irq/204/smp_affinity |----20400000000,00000000,00000000,00000000,00000000,00000002 /proc/irq/205/smp_affinity |----20500000000,00000000,00000000,00000000,00000000,00000004 /proc/irq/206/smp_affinity |----20600000000,00000000,00000000,00000000,00000000,00000008 /proc/irq/207/smp_affinity |----20700000000,00000000,00000000,00000000,00000000,00000010 Dev:p6p1 /proc/irq/101/smp_affinity |----10100000000,00000000,00000000,00000000,00000000,00000001 /proc/irq/103/smp_affinity |----10300000000,00000000,00000000,00000000,00000000,00000002 /proc/irq/104/smp_affinity |----10400000000,00000000,00000000,00000000,00000000,00000004 /proc/irq/105/smp_affinity |----10500000000,00000000,00000000,00000000,00000000,00000008 /proc/irq/106/smp_affinity |----10600000000,00000000,00000000,00000000,00000000,00000010 /proc/irq/107/smp_affinity |----10700000000,00000000,00000000,00000000,00000000,00000020 /proc/irq/108/smp_affinity |----10800000000,00000000,00000000,00000000,00000000,00000040 /proc/irq/109/smp_affinity |----10900000000,00000000,00000000,00000000,00000000,00000080 /proc/irq/110/smp_affinity |----11000000000,00000000,00000000,00000000,00000000,00000100 Dev:p6p2 /proc/irq/112/smp_affinity |----11200000000,00000000,00000000,00000000,00000000,01000000 /proc/irq/114/smp_affinity |----11400000000,00000000,00000000,00000000,00000000,01000000 /proc/irq/115/smp_affinity |----11500000000,00000000,00000000,00000000,00000000,01000000 /proc/irq/116/smp_affinity |----11600000000,00000000,00000000,00000000,00000000,02000000 /proc/irq/117/smp_affinity |----11700000000,00000000,00000000,00000000,00000000,02000000 /proc/irq/118/smp_affinity |----11800000000,00000000,00000000,00000000,00000000,04000000 /proc/irq/119/smp_affinity |----11900000000,00000000,00000000,00000000,00000000,04000000 /proc/irq/120/smp_affinity |----12000000000,00000000,00000000,00000000,00000000,08000000 /proc/irq/121/smp_affinity |----12100000000,00000000,00000000,00000000,00000000,08000000

2、設定網絡卡佇列親和性,每個佇列繫結一顆單獨的cpu

./bindCpu.sh set

3、指令碼

treeStr="|----"
usage(){
echo "./`basename $0` [set|list]"
echo 
echo "set:按佇列數從0號CPU開始依次繫結"
echo "list:列出個網絡卡佇列情況"
echo
exit
}
if [ "$1" != "" ]
then
    cmdtype=$1
else
    cmdtype="list"
fi
if [ "$cmdtype" != "set" -a "$cmdtype" != "list" ]
then
usage
fi

#擴充套件:比如需要將多個佇列繫結在一個cpu上,
#入參是繫結的佇列數:如3就是每個cpu上面繫結3個佇列;若是列表,列表的個數表示預計使用的cpu數(也有可能少於設定的資料當佇列數少於引數總和時)如 3 2 2 則表示cpu0繫結3個佇列,cpu1繫結2個佇列,cpu2繫結2個(和剩餘的所有佇列)
#實現:加一個引數,程式順序計算繫結的cpu編號;或者一個引數列表,佇列按列表順序繫結cpu,若引數總和多於佇列數則忽略多餘的,若引數綜合少於佇列數,剩餘的全繫結在最後一個


echo
#此處有坑,不同的系統可能會不一樣,根據情況修改
#作用是找出網路裝置
#此處ifconfig的結果格式為:p6p2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
#還遇到到過格式為:eth0      Link encap:Ethernet  HWaddr 90:B1:1C:35:5E:14 
for dev in `ifconfig |grep ": "|grep -v "lo" |awk -F':' '{print $1}'`
do
    cpuFlag=1
    echo "Dev:"$dev
    for devseq in `grep $dev /proc/interrupts |awk '{print $1}'|sed -e 's/://g'`
      do
      echo  "/proc/irq/${devseq}/smp_affinity"
    if [ "$cmdtype" = "set" ]
    then
      echo `printf %0x ${cpuFlag}` >/proc/irq/${devseq}/smp_affinity
    fi
    sleep 0.5
    echo -n $treeStr$devseq 
    cat /proc/irq/${devseq}/smp_affinity
    ((cpuFlag=cpuFlag*2))
  done
    echo 
done

^_^後面的調整發現指令碼有心無力 還是直接手動綁定了,懶得改指令碼,指令碼就當是一種思路參考吧。把不同的需求寫成不同的函式模組,根據入參呼叫。此專案做完我再完善該部分,立杆為證。

擴充套件

親和性介紹

Linux排程程式同時提供軟CPU親和性和硬CPU親和性機制。

  • 軟親和性:程序並不會在處理器之間頻繁遷移。
  • 硬親和性:程序需要在您指定的處理器上執行

雖然linux盡力通過一種軟的親和性試圖使程序儘量在同一個處理器上執行,但它也允許使用者強制指定程序無論如何都必須在指定的處理器上執行。

硬親和性使用場景

  • 需要大量計算:常見的標誌是應用程式要在多處理器的機器上花費大量的計算時間。
  • 需要保持高CPU快取命中率:如果一個給定的程序遷移到其他地方去了,那麼它就失去了利用 CPU 快取的優勢。實際上,如果正在使用的 CPU 需要為自己快取一些特殊的資料,那麼所有其他 CPU 都會使這些資料在自己的快取中失效。因此,如果有多個執行緒都需要相同的資料,那麼將這些執行緒繫結到一個特定的 CPU 上是非常有意義的,這樣就確保它們可以訪問相同的快取資料(或者至少可以提高快取的命中率)。否則,這些執行緒可能會在不同的 CPU 上執行,這樣會頻繁地使其他快取項失效。

相關推薦

併發佇列設定CPU親和專案記錄

例項 做ssl加速卡(高併發)測試又遇到相同的問題,多佇列網絡卡軟中斷過高,記錄備忘 場景:nginx模擬業務伺服器,worker不繫結;網絡卡佇列親和性不設定 結果:那叫一塌糊塗,3w TPS 0號CPU就滿了, 其中si多達60%,其餘的cpu

佇列簡介以及Linux通過傳送資料包原始碼解讀

摘自:http://blog.csdn.net/yanghua_kobe/article/details/7485254  首先我們看一下一個主流多佇列網絡卡(E1000)跟多核CPU之間的關係圖: 非多佇列: linux的網絡卡由結構體net_device

佇列介紹

1)   簡介 多佇列網絡卡是指一個網絡卡上有多個佇列,核心會給每個佇列註冊一箇中斷號,具體可以在/proc/interrupts | grep {網絡卡} 檢視,其中第一列是中斷號,最後一列是網絡卡佇列資訊。CPU和中斷號有親和性,一般網絡卡中斷和一個CPU繫結,繫結關係可以在/pro

Ubuntu配置設定/靜態ip

轉自這裡   第一步,Linux下檢視IP 我這裡是Ubuntu 16.04,這裡有2項,下面一項是lo(本地環回)可以不管,上面一項才是需要配置的。注意這裡我的虛擬網絡卡是ens33,待會兒修改的也是ens33,網上很多配置教程他們的Linux系統的網絡卡名字並不是en

設定 的高階設定說明

網絡卡設定 網絡卡的高階設定說明 注意: RTL8101E、RTL8102E及RTL8139系列網絡卡為10/100 Mbp,所以並不支援Gigabit的聯接速度。 自動關閉 PCIe (省電)設定此選項可進入網路控制器省電模式設定此選項可進入網路卡省電模式 選項 說明關閉 關閉自動關閉PCIe (省電)

Ubuntu:雙(繫結(bonding)配置

step 0:安裝網絡卡繫結的功能 apt-get install    ifenslave step 1:載入核心模組:編輯 /etc/modules,新增: bonding     step 2:編輯網絡卡配置:/etc/network/int

【VMware的設定

先寫個框架吧,明兒再補充。 昨天接到導師的任務,開始裝 虛擬機器 + 資料庫 準備做CA證書。 然後,在win10專業版的系統上,做了個虛擬機器 VMware ,此處涉及到 虛擬機器選擇 VMware 還是 Virtualbox , VB是商業開發的軟體,類比window,儘管你們沒

virtualbox 設定 主機 虛擬機器互 ping 問題

安裝虛擬機器後,虛擬機器上網:分配一塊連線方式為“網路地址轉換(NAT)”的網絡卡,啟動後虛擬機器自動獲得10.*****的IP可上網,但不能互ping 虛擬機器ping主機:分配一塊連線方式為 host-only 的網絡卡,此模式僅與主機互通。開機後網絡卡自動獲取192

配置Linux的eth0設定IP地址以及啟動方式

// 進入網絡卡設定配置目錄 [[email protected] ~]# cd/etc/sysconfig/network-scripts/ // 選擇需要配置的網絡卡,用vi編輯器開啟 [[email protected]]#vi ifcfg-eth

centos6.6安裝後必做----.設定

centos6.6安裝後必做之----1.網絡卡設定   1

vmware linux雙設定

作者:fbysssmsn:[email protected]  blog:blog.csdn.net/fbysss宣告:本文由fbysss原創,轉載請註明出處關鍵字:vmware 雙網絡卡1.在vmware中,Edit->Virtual network set

設定雙IP(ubuntu,debian)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

CentOS7設定為橋接模式靜態IP配置方法詳解

備份網路檔案 [[email protected] network-scripts]# cd /etc/sysconfig/network-scripts/ [[email p

LINUX(設定千兆速度及模式)

http://blog.chinaunix.net/uid-23381466-id-58878.html Ethtool是用於查詢及設定網絡卡引數的命令。 概要: ethtool ethX    //查詢ethX網口基本設定 ethtool –h        //顯示

C# 資訊列表

  private static void ShowAdapterInfo()        {            NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();     

vmware雙設定

 我試著給虛擬機器上的系統裝雙網絡卡,系統是openSUSE11.0,試了很久,一開始都是用NAT上網的,執行正常,後來想設定橋接的時候好像誤修改了NAT的設定,導致NAT無法使用了。橋接的設定參考我的另一篇文章。 我這時試驗了幾種方式,都不能在NAT和橋接共存的情況下上網:

VMware下CentOS6.4設定為橋接模式靜態IP配置方法詳解

1、禁用網路管理器 # chkconfig NetworkManager off # service NetworkManager stop 2、建立用以橋接的虛擬網絡卡 # cd /etc/sysconfig/network-scripts # cp ifcf

在linux下面虛擬,在一塊物理上配置個IP地址

1.首先,我們來配置多塊虛擬網絡卡 將一個物理網絡卡,虛擬多個網絡卡使用方法,在這塊網絡卡上配置同一個段的ip地址: 比如將em2這塊物理網絡卡(該網絡卡的ip地址192.168.100.10/24)配置成多塊網絡卡的命令:  ifconfig em2:1 192.16

完美解決ARM上Linux/雙不能工作在同一段的問題

       首先,要丟擲的一個問題,在多網口的ZYNQ開發板上,當五個網口處於同一個網段時,它們之間是完全能夠相互ping通。關於同一網段的測試在網口測試報告中已做詳細說明,接下來新增路由表後的測試結果。 修改路由表:        在開發板上使用指令“route ad

樹莓派--無線設定遠端桌面連線

安裝無線網絡卡 插入無線網絡卡(非免驅網絡卡請先安裝網絡卡驅動),使用lsusb檢視裝置 使用ifconfig檢視網絡卡情況 若依然找不到網絡卡wlan*,使用/etc/init.d/networking restart重啟網絡卡後重試 設定