溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux服務器的網(wǎng)卡的優(yōu)化

發(fā)布時間:2020-08-03 01:30:17 來源:網(wǎng)絡 閱讀:215 作者:我的二狗呢 欄目:系統(tǒng)運維

通常情況下,Linux的網(wǎng)卡中斷是由一個CPU核心來處理的,當承擔高流量的場景下,會出現(xiàn)一些詭異的情況(網(wǎng)卡尚未達到瓶頸,但是卻出現(xiàn)丟包的情況)


這種時候,我們最好看下網(wǎng)卡中斷是不是缺少調優(yōu)。


優(yōu)化3要點:網(wǎng)卡多隊列+irq affinity親緣性設置+關閉irqbalance


目前阿里云官方提供的centos和ubuntu鏡像里面,已經(jīng)自帶了優(yōu)化腳本,內容如下:


centos7的腳本路徑在? /usr/sbin/ecs_mq_rps_rfs? 具體內容如下:

#!/bin/bash
#?This?is?the?default?setting?of?networking?multiqueue?and?irq?affinity
#?1.?enable?multiqueue?if?available
#?2.?irq?affinity?optimization
#?3.?stop?irqbalance?service
#?set?and?check?multiqueue

function?set_check_multiqueue()
{
????eth=$1
????log_file=$2
????queue_num=$(ethtool?-l?$eth?|?grep?-ia5?'pre-set'?|?grep?-i?combined?|?awk?{'print?$2'})
????if?[?$queue_num?-gt?1?];?then
????????#?set?multiqueue
????????ethtool?-L?$eth?combined?$queue_num
????????#?check?multiqueue?setting
????????cur_q_num=$(ethtool?-l?$eth?|?grep?-iA5?current?|?grep?-i?combined?|?awk?{'print?$2'})
????????if?[?"X$queue_num"?!=?"X$cur_q_num"?];?then
????????????echo?"Failed?to?set?$eth?queue?size?to?$queue_num"?>>?$log_file
????????????echo?"after?setting,?pre-set?queue?num:?$queue_num?,?current:?$cur_q_num"?>>?$log_file
????????????return?1
????????else
????????????echo?"OK.?set?$eth?queue?size?to?$queue_num"?>>?$log_file
????????fi
????else
????????echo?"only?support?$queue_num?queue;?no?need?to?enable?multiqueue?on?$eth"?>>?$log_file
????fi
}

#set?irq?affinity
function?set_irq_smpaffinity()
{
????log_file=$1
????node_dir=/sys/devices/system/node
????for?i?in?$(ls?-d?$node_dir/node*);?do
????????i=${i/*node/}
????done
????
????echo?"max?node?:$i"?>>?$log_file
????node_cpumax=$(cat?/sys/devices/system/node/node${i}/cpulist?|awk?-F-?'{print?$NF}')
????irqs=($(cat?/proc/interrupts?|grep?virtio?|grep?put?|?awk?-F:?'{print?$1}'))
????core=0
????for?irq?in?${irqs[@]};do
????????VEC=$core
????????if?[?$VEC?-ge?32?];then
????????????let?"IDX?=?$VEC?/?32"
????????????MASK_FILL=""
????????????MASK_ZERO="00000000"
????????????for?((i=1;?i<=$IDX;i++))
????????????????do
????????????????????MASK_FILL="${MASK_FILL},${MASK_ZERO}"
????????????????done
????????????let?"VEC?-=?32?*?$IDX"
????????????MASK_TMP=$((1<<$VEC))
????????????MASK=$(printf?"%X%s"?$MASK_TMP?$MASK_FILL)
????????else
????????????MASK_TMP=$((1<<$VEC))
????????????MASK=$(printf?"%X"?$MASK_TMP)
????????fi
????????echo?$MASK?>?/proc/irq/$irq/smp_affinity
????????echo?"mask:$MASK,?irq:$irq"?>>?$log_file
????????core=$(((core+1)%(node_cpumax+1)))
????done
}

#?stop?irqbalance?service
function?stop_irqblance()
{
????log_file=$1
????ret=0
????if?[?"X"?!=?"X$(ps?-ef?|?grep?irqbalance?|?grep?-v?grep)"?];?then
????????if?which?systemctl;then
????????????systemctl?stop?irqbalance
????????else
????????????service?irqbalance?stop
????????fi
????????if?[?$??-ne?0?];?then
????????????echo?"Failed?to?stop?irqbalance"?>>?$log_file
????????????ret=1
????????fi
????else
???????echo?"OK.?irqbalance?stoped."?>>?$log_file
????fi
????return?$ret
}
#?main?logic
function?main()
{
????ecs_network_log=/var/log/ecs_network_optimization.log
????ret_value=0
????echo?"running?$0"?>?$ecs_network_log
????echo?"========??ECS?network?setting?starts?$(date?+'%Y-%m-%d?%H:%M:%S')?========"?>>?$ecs_network_log
????#?we?assume?your?NIC?interface(s)?is/are?like?eth*
????eth_dirs=$(ls?-d?/sys/class/net/eth*)
????if?[?"X$eth_dirs"?=?"X"?];?then
????????echo?"ERROR!?can?not?find?any?ethX?in?/sys/class/net/?dir."?>>?$ecs_network_log
????????ret_value=1
????fi
????for?i?in?$eth_dirs
????do
????????cur_eth=$(basename?$i)
????????echo?"optimize?network?performance:?current?device?$cur_eth"?>>?$ecs_network_log
????????#?only?optimize?virtio_net?device
????????driver=$(basename?$(readlink?$i/device/driver))
????????if?!?echo?$driver?|?grep?-q?virtio;?then
????????????echo?"ignore?device?$cur_eth?with?driver?$driver"?>>?$ecs_network_log
????????????continue
????????fi
????????echo?"set?and?check?multiqueue?on?$cur_eth"?>>?$ecs_network_log
????????set_check_multiqueue?$cur_eth?$ecs_network_log
????????if?[?$??-ne?0?];?then
????????????echo?"Failed?to?set?multiqueue?on?$cur_eth"?>>?$ecs_network_log
????????????ret_value=1
????????fi
????done
????stop_irqblance??$ecs_network_log
????set_irq_smpaffinity?$ecs_network_log
????echo?"========??ECS?network?setting?END?$(date?+'%Y-%m-%d?%H:%M:%S')??========"?>>?$ecs_network_log
????return?$ret_value
}


#?program?starts?here
main
exit?$?



查詢的rps綁定情況的腳本 get_rps.sh

#!/bin/bash
#?獲取當前rps情況
for?i?in?$(ls?/sys/class/net/eth0/queues/rx-*/rps_cpus);?do?
??echo?$i
??cat?$i
done



參考文檔:?

https://help.aliyun.com/knowledge_detail/52559.html? 【推薦閱讀】

https://www.jianshu.com/p/09bb5d5a72ba

https://help.aliyun.com/document_detail/25378.html#g6

https://tech.meituan.com/2018/03/16/redis-high-concurrency-optimization.html? 【推薦閱讀】



向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI