1. 程式人生 > >網絡卡軟中斷繫結優化

網絡卡軟中斷繫結優化


今天測試剛好發現一個關於網絡卡軟中斷不均衡的問題,之前處理過類似情況,一直未有總結,今天稍作總結下,並寫了個自動化繫結指令碼。關於什麼是軟中斷,網絡卡硬體中斷佇列,RFS,RPS 這些概,這裡不做具體解釋。感興趣可自行google

問題現象:

         1.  網絡卡軟中斷不平衡,集中在一個CPU核心上(mpstat 檢視%soft集中,通常是cpu0)

         2.  網絡卡的硬體中斷佇列不夠, < CPU 核心數,無法一對一繫結,導致部分CPU核心%soft 較少,CPU使用不均衡

解決辦法:

         情況1: 繫結網絡卡中斷,通常是和CPU 一對一繫結

         情況2: 開啟RFS,RPS

最終效果:

mpstat -P ALL 2


cpu 執行緒利用率


附上tuneNetSoft.py 指令碼內容,主要是用於繫結軟中斷和開啟RPS,RFS


#!/usr/bin/env python
#python version < 3
#net irq_smp_affinity && rps,rfs setting
#version 1.0
#author: pylt


import re
from os import system,popen
from os import walk as walkdir
from optparse import OptionParser

RPS_CPUS_VALUE = 'ffffffff'
RPS_FLOW_VALUE = '4096'
RPS_RFS_DEFAULT = '0'
interrupts_file = '/proc/interrupts'
rps_cpus_list = []
rps_flow_list = []
#ENTRY_VALUE=32768

def get_device():
    return re.findall(r'([a-z]+\d+)\s+Link.*',popen('ifconfig').read())

def get_rfs_rps_file(net_device):   
    rps_path = '/sys/class/net/' + net_device + '/queues/'
    for s in walkdir(rps_path):
        if len(s[2]) == 2:
            rps_cpus_list.append('/'.join([s[0],s[2][0]]))
            rps_flow_list.append('/'.join([s[0],s[2][1]]))

def file_hander(TARGET,VALUE='0'):
    try:
          f_hander = open(TARGET,'w')
          f_hander.write(VALUE)
    finally:
          f_hander.close()

def set_rfs_rps(net_device):  
    get_rfs_rps_file(net_device)
    def set_rps_cpus_value(PATH):
        file_hander(PATH,RPS_CPUS_VALUE)

    def set_rps_flow_value(PATH):
        file_hander(PATH,RPS_FLOW_VALUE)

    map(set_rps_cpus_value,rps_cpus_list)
    map(set_rps_flow_value,rps_flow_list)
   
def unset_rfs_rps(net_device):
    get_rfs_rps_file(net_device)   
    def unset_rps_cpus_value(PATH):
        file_hander(PATH,RPS_RFS_DEFAULT)

    def unset_rps_flow_value(PATH):
        file_hander(PATH,RPS_RFS_DEFAULT)
    
    map(unset_rps_cpus_value,rps_cpus_list)
    map(unset_rps_flow_value,rps_flow_list)
   
def set_irq_balance():
    	stop_irq_balance = 'service irqbalance stop'  
    	system(stop_irq_balance)
    	interrupts_ct = open(interrupts_file)
    	cores_nr = len(interrupts_ct.readline().split()) # 獲取CPU核心數
    	irq_bit = 0
    	while True:
              inter_line = interrupts_ct.readline()
              if inter_line == "":
              	 break
              js = inter_line.split()
              if len(js[-1]) > 5:
                  if re.match(r'eth.-',js[-1][:5]):
					 irq_nr = js[0][:-1]            
					 TARGET = '/proc/irq/%s/smp_affinity' %(irq_nr)
					 VALUE = str(re.sub('0x','',hex(1 << irq_bit)))  #1 << irq_bit 相對於2的N次方 ,hex() 二進位制轉十六進位制
					 file_hander(TARGET,VALUE)
					 irq_bit += 1
					 if irq_bit == cores_nr:
						irq_bit = 0

def unset_irq_balance():
      start_irq_balance = 'service irqbalance start'
      system(start_irq_balance)
    
def usage():
    usage = '''=================================================
Description: irq_balance_set && rfs_rps_set tools
Usage:
      <script> -i  : set irq smp_affinity
               -I  : unset irq smp_affinity
               -r  : set rfs && rps
               -R  : unset rfs && rps
    '''
    print usage

if __name__ == '__main__':

   parser = OptionParser() 
   parser.add_option("-i", action="store_true", 
                  dest="irq_true", 
                  default=False) 
   parser.add_option("-I", action="store_true", 
                  dest="irq_false", 
                  default=False)
   parser.add_option("-r", action="store_true", 
                  dest="rps_true", 
                  default=False)
   parser.add_option("-R", action="store_true", 
                  dest="rps_false", 
                  default=False)
   (options, args) = parser.parse_args() 

   if options.irq_true == True: 
         set_irq_balance()
         print "irq_balance_set successfully"  
   elif options.irq_false == True:
         unset_irq_balance()
         print "unset irq balance successfully"
   elif options.rps_true == True:
         device_list = get_device()
         map(set_rfs_rps,device_list)
         print "rfs&&rps configured successfully"
   elif options.rps_false == True:
         device_list = get_device() 
         map(unset_rfs_rps,device_list)
         print "unconfigured rfs&&rps successfully"
   else:
         usage()






相關推薦

中斷優化

今天測試剛好發現一個關於網絡卡軟中斷不均衡的問題,之前處理過類似情況,一直未有總結,今天稍作總結下,並寫了個自動化繫結指令碼。關於什麼是軟中斷,網絡卡硬體中斷佇列,RFS,RPS 這些概,這裡不做具體解釋。感興趣可自行google 問題現象:          1.  

中斷中斷親和力

在這裡先解釋下啥是中斷親和力 中斷親和力是指將一個或多箇中斷源繫結到特定的 CPU 上執行 具體如何操作我這裡就不說了,網路上一大片一大片的.我今天這篇文件是用來吐槽的..具體操作請見連結 這個連結的文章已經說的很清楚了在操作方面, 只要看過這個,跟著做一邊 就知

系統技術非業餘研究 » MYSQL資料庫中斷不平衡問題及解決方案

最近公司在MySQL的資料庫上由於採用了高速的如PCIe卡以及大記憶體,去年在壓力測試的時候突然發現數據庫的流量可以把一個千M網絡卡壓滿了。隨著資料庫的優化,現在流量可以達到150M,所以我們採用了雙網絡卡,在交換機上繫結,做LB的方式,提高系統的吞吐量。 但是在最近壓測試的一個數據庫中,mps

linux 中斷的檢視與設定負載均衡

      在使用 cat /proc/irq/95/smp_affinity cat /proc/irq/smp_affinity 等看出網絡卡的佇列都在使用cpu1 和cpu2 cat /proc/irq/95/smp_affinity   00000002   cat /proc/irq/96/

Linux技巧:多核下中斷到不同CPU(core)總結

http://www.cnblogs.com/zackyang/archive/2012/02/08/2342141.html http://blog.chinaunix.net/uid-20737871-id-3491415.html http://smilej

【shell】海思3536 多聚合——bond技術

0.原理說明 目前網絡卡繫結mode共有七種(0~6)bond0、bond1、bond2、bond3、bond4、bond5、bond6 常用的有三種: mode=0:平衡負載模式,有自動備援,但需要”Switch”支援及設定。 mode=1:自動備援模式,其中一條線若斷線,其他線路

DPDK驅動載入、和解綁

Igb_uio程式碼相關的可以分為三個部分:igb_uio核心驅動,核心uio框架,uio使用者態部分。 載入igb_uio模組與繫結dpdk網絡卡 a)載入dpdk驅動需要先載入uio:modprobe uio b)載入dpdk驅動的方法:/sbin/insmod  ig

linux設定bond

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

Linux中高階網路配置-team方式多

team簡介 在redhat7.0以上版本,配置多網絡卡繫結時,專門提供了team工具來實現多網絡卡的繫結。 team :也是鏈路聚合 最多支援8塊網絡卡,不需要手動載入相應核心模組 支援模式: broadcast 廣播容錯 roundrobin 輪詢

Linux中高階網路配置-bond方式雙

bond簡介 bond可以兩塊網絡卡虛擬成為一塊網絡卡,在網絡卡繫結後,看起來是一個單獨的乙太網介面裝置並具有相同的 IP 地址。既能新增網路頻寬,同時又能做相應的冗餘,輪詢和負載均衡。 bond 網絡卡的工作模式 網絡卡 bond 後的工作模式有兩種:主備的工作方式和負載

CentOS下多bond/多聚合

網絡卡bond我直接理解成網絡卡聚合了,就是把多張網絡卡虛擬成1張網絡卡,出口時,這張網絡卡無論哪個斷線都不影響網路,入口時,需要結合交換機的埠聚合功能實現和網絡卡配置的bond模式進行負載均衡。bond需要在核心Kernels 2.4.12及以上才能使用,因為需要使用bonding模組。 bond模式:

Linux雙指令碼

linux運維及配置工作中,常常會用到雙網絡卡繫結,少數幾臺伺服器的配置還好,如果是需要配置幾十甚至上百臺,難免會枯燥乏味,易於出錯,我編寫了這個雙網絡卡繫結的輔助指令碼,可傻瓜式地完成linux雙網絡卡繫結工作,當然,該指令碼主要還是用於小批量的系統配置,如需配置大量的伺服器,可提取指令碼中的bonding

詳解Linux雙之bond0

1、什麼是bond?    網絡卡bond是通過多張網絡卡繫結為一個邏輯網絡卡,實現本地網絡卡的冗餘,頻寬擴容和負載均衡,在生產場景中是一種常用的技術。Kernels 2.4.12及以後的版本均供bonding模組,以前的版本可以通過patch實現。 2、實現原理:  

第十一節課: 第九章,與sshd服務

8.4、服務的訪問控制列表         TCPwrappers是RHEL7中預設啟用的流量監控程式,能夠對服務做出允許或拒絕。         TCPwrappers服務由兩個檔案控制:     &n

02 Linux 多

 Linux 多網絡卡繫結 網絡卡繫結mode共有七種(0~6) bond0、bond1、bond2、bond3、bond4、bond5、bond6 常用的有三種 mode=0:平衡負載模式,有自動備援,但需要”Switch”支援及設定。 mode=1:自

redhat6版本做bond

1.編寫bond0配置檔案 cd /etc/sysconfig/network-scripts(進入網絡卡配置檔案路徑) vi ifc-bond0(編輯bond0的配置檔案,具體如下) DEVICE=bond0 ONBOOT=yes BOOTPROTO=static

學習記錄——Linux雙

1#檢視網絡卡連線資訊。 nmcli connection show 2#刪除網絡卡配置資訊。 nmcli connection delete 網絡卡名稱或者通用唯一識別符號(即UUID) 3#新增虛擬網絡卡bond。 nmcli connection ad

配置bond(

        網絡卡bond(繫結),也稱作網絡卡捆綁。就是將兩個或者更多的物理網絡卡 繫結成一個虛擬網絡卡。網絡卡是通過把多張網絡卡繫結為一個邏輯網絡卡,實現本地 網絡卡的冗餘,頻寬擴容和負載均衡,在應用部署中是一種常用的技術。多網絡卡繫結實際上需要提供一個額外的軟

:active-backup - 主備模式

網絡卡繫結模式:active-backup - 主備模式 一個網絡卡處於活躍狀態,另一個處於備份狀態,所有流量都在主鏈路上處理,當活躍網絡卡down掉時,啟用備份網絡卡。 系統:這裡以Centos7為例(Centos6配置引數和7不一樣) 這裡將em1和em2繫結到bond0上,

Ubuntu:雙(多)(bonding)配置

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