NICソフトブレーク最適化


サーバーネットワークカードが大量に同時発生した場合、cpuソフトの中断が不均衡な状況に遭遇したに違いない.cpu 0に押され、他のコアのcpuは暇で仕事をしていない.
例えば、lvsサーバ、高同時ウェブサイトサーバは、このような問題に最も遭遇しやすい.
解決策は2つあります.
NICがマルチキューをサポートしていない場合、2.6.21後にNICドライバがマルチキューをサポートする
マルチキューがサポートされているかどうかを判断
lspci-vvv MSI-X&&Enable+&&TabSize>1がある場合、このNICはマルチキューNICであり、そうでない場合はサポートされません.
cat  enable_rps.sh


 ffff  0000-1111  cpu 
  • #!/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}
  • 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