在數據量大的時候,硬中斷和軟中斷會形成瓶頸。 網卡接收數據包,從網卡產生中斷信號,CPU將網路數據包拷貝到內核,然後進行協議棧的處理,最後將數據部分傳遞給用戶空間,但硬體中斷處理僅僅做從網卡拷貝數據的工作,而協議棧的處理的工作就交給軟中斷處理。所以當硬中斷和軟中斷集中在cpu0的時候,會給調度帶來負 ...
在數據量大的時候,硬中斷和軟中斷會形成瓶頸。
網卡接收數據包,從網卡產生中斷信號,CPU將網路數據包拷貝到內核,然後進行協議棧的處理,最後將數據部分傳遞給用戶空間,但硬體中斷處理僅僅做從網卡拷貝數據的工作,而協議棧的處理的工作就交給軟中斷處理。所以當硬中斷和軟中斷集中在cpu0的時候,會給調度帶來負擔(集中在其他cpu也會造成性能瓶頸,這裡舉cpu0的例子,是因為集中在cpu0影響最大)。
- 關閉irqbalance服務,service irqbalance stop,irqbalance在負載不高的時候是不錯的服務,但負載太高,就顯得力不從心,關閉irqbalance服務,我們自己手動綁定中斷號到cpu。
- 然後確定使用的是哪個網卡,先lshw -C network –short看看都有哪些網卡。
可知有eth0 eth1 eth2 eth3四個網卡
- 然後ifconfig看下各網卡的流量,跑壓測,再ifconfig,對比前後流量,可知是哪個網卡在跑。
壓測前
壓測後
對比前後流量,可知用的是eth2
- 獲取網卡的中斷號
可知中斷號是72-80
2.綁定
echo 9 > /proc/irq/72/smp_affinity_list
echo 10 > /proc/irq/73/smp_affinity_list
echo 11 > /proc/irq/74/smp_affinity_list
echo 12 > /proc/irq/75/smp_affinity_list
echo 13 > /proc/irq/76/smp_affinity_list
echo 14 > /proc/irq/77/smp_affinity_list
echo 15> /proc/irq/78/smp_affinity_list
echo 16 > /proc/irq/79/smp_affinity_list
echo 17 > /proc/irq/80/smp_affinity_list
網卡中斷號的綁定可以分散硬中斷,不過這樣還不夠徹底,因為硬中斷集中在上述配置的幾個核上,且軟中斷在硬中斷結束後工作,也在同一個核上,一個核同時跑硬中斷和軟中斷,這樣會大大降低硬中斷和軟中斷的處理速度,會對性能造成極大的瓶頸,因為如果中斷沒處理完,就無法分發請求到haproxy的各進程。
可通過rps和rfs,將軟中斷均衡到各個核上。
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus 24核,所以設置fffff,分散到各核
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus
echo ffffff > /sys/class/net/eth2/queues/rx-0/rps_cpus
echo 4096 > /sys/class/net/eth2/queues/rx-0/rps_flow_cnt 32768/N,N為網卡多隊列的隊列數
echo 4096 > /sys/class/net/eth2/queues/rx-1/rps_flow_cnt
echo 4096 > /sys/class/net/eth2/queues/rx-2/rps_flow_cnt
echo 4096 > /sys/class/net/eth2/queues/rx-3/rps_flow_cnt
echo 4096 > /sys/class/net/eth2/queues/rx-4/rps_flow_cnt
echo 4096 > /sys/class/net/eth2/queues/rx-5/rps_flow_cnt
echo 4096 > /sys/class/net/eth2/queues/rx-6/rps_flow_cnt
echo 4096 > /sys/class/net/eth2/queues/rx-7/rps_flow_cnt
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries