NICソフトブレーク最適化
4312 ワード
サーバーネットワークカードが大量に同時発生した場合、cpuソフトの中断が不均衡な状況に遭遇したに違いない.cpu 0に押され、他のコアのcpuは暇で仕事をしていない.
例えば、lvsサーバ、高同時ウェブサイトサーバは、このような問題に最も遭遇しやすい.
解決策は2つあります.
NICがマルチキューをサポートしていない場合、2.6.21後にNICドライバがマルチキューをサポートする
マルチキューがサポートされているかどうかを判断
lspci-vvv MSI-X&&Enable+&&TabSize>1がある場合、このNICはマルチキューNICであり、そうでない場合はサポートされません.
cat enable_rps.sh
#!/bin/bash # Enable RPS (Receive Packet Steering) rfc=4096 cc=$(grep -c processor /proc/cpuinfo) rsfe=$(echo $cc*$rfc | bc) sysctl -w net.core.rps_sock_flow_entries=$rsfe for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus) do echo ffff > $fileRps done for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt) do echo $rfc > $fileRfc done tail /sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}
例えば、lvsサーバ、高同時ウェブサイトサーバは、このような問題に最も遭遇しやすい.
解決策は2つあります.
NICがマルチキューをサポートしていない場合、2.6.21後にNICドライバがマルチキューをサポートする
マルチキューがサポートされているかどうかを判断
lspci-vvv MSI-X&&Enable+&&TabSize>1がある場合、このNICはマルチキューNICであり、そうでない場合はサポートされません.
cat enable_rps.sh
ffff 0000-1111 cpu
2.
#!/bin/bash
# setting up irq affinity according to /proc/interrupts
# 2008-11-25 Robert Olsson
# 2009-02-19 updated by Jesse Brandeburg
#
# > Dave Miller:
# (To get consistent naming in /proc/interrups)
# I would suggest that people use something like:
# char buf[IFNAMSIZ+6];
#
# sprintf(buf, "%s-%s-%d",
# netdev->name,
# (RX_INTERRUPT ? "rx" : "tx"),
# queue->index);
#
# Assuming a device with two RX and TX queues.
# This script will assign:
#
# eth0-rx-0 CPU0
# eth0-rx-1 CPU1
# eth0-tx-0 CPU0
# eth0-tx-1 CPU1
#
set_affinity()
{
if [ $VEC -ge 32 ]
then
MASK_FILL=""
MASK_ZERO="00000000"
let "IDX = $VEC / 32"
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<<(`expr $VEC + $CORE`)))
MASK=`printf "%X" $MASK_TMP`
fi
printf "%s mask=%s for /proc/irq/%d/smp_affinity
" $DEV $MASK $IRQ
printf "%s" $MASK > /proc/irq/$IRQ/smp_affinity
}
if [ $# -ne 2 ] ; then
echo "Description:"
echo " This script attempts to bind each queue of a multi-queue NIC"
echo " to the same numbered core, ie tx0|rx0 --> cpu0, tx1|rx1 --> cpu1"
echo "usage:"
echo " $0 core eth0 [eth1 eth2 eth3]"
exit
fi
CORE=$1
# check for irqbalance running
IRQBALANCE_ON=`ps ax | grep -v grep | grep -q irqbalance; echo $?`
if [ "$IRQBALANCE_ON" == "0" ] ; then
echo " WARNING: irqbalance is running and will"
echo " likely override this script's affinitization."
echo " Please stop the irqbalance service and/or execute"
echo " 'killall irqbalance'"
fi
#
# Set up the desired devices.
#
shift 1
for DEV in $*
do
for DIR in rx tx TxRx
do
MAX=`grep $DEV-$DIR /proc/interrupts | wc -l`
if [ "$MAX" == "0" ] ; then
MAX=`egrep -i "$DEV:.*$DIR" /proc/interrupts | wc -l`
fi
if [ "$MAX" == "0" ] ; then
echo no $DIR vectors found on $DEV
continue
fi
for VEC in `seq 0 1 $MAX`
do
IRQ=`cat /proc/interrupts | grep -i $DEV-$DIR-$VEC"$" | cut -d: -f1 | sed "s/ //g"`
if [ -n "$IRQ" ]; then
set_affinity
else
IRQ=`cat /proc/interrupts | egrep -i $DEV:v$VEC-$DIR"$" | cut -d: -f1 | sed "s/ //g"`
if [ -n "$IRQ" ]; then
set_affinity
fi
fi
done
done
done
:https://blog.hackroad.com/operations-engineer/linux_server/6405.html