<p id="jnj9j"></p>

<ruby id="jnj9j"></ruby>
<ruby id="jnj9j"></ruby>
<p id="jnj9j"><dfn id="jnj9j"></dfn></p>

    <p id="jnj9j"></p>

      CPU网卡亲和绑定

      #!/bin/bash
      #
      # Copyright (c) 2014, Intel Corporation
      #
      # Redistribution and use in source and binary forms, with or without
      # modification, are permitted provided that the following conditions are met:
      #
      #     * Redistributions of source code must retain the above copyright notice,
      #       this list of conditions and the following disclaimer.
      #     * Redistributions in binary form must reproduce the above copyright
      #       notice, this list of conditions and the following disclaimer in the
      #       documentation and/or other materials provided with the distribution.
      #     * Neither the name of Intel Corporation nor the names of its contributors
      #       may be used to endorse or promote products derived from this software
      #       without specific prior written permission.
      #
      # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
      # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
      # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
      # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
      # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
      # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
      # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
      # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      #
      # Affinitize interrupts to cores
      #
      # typical usage is (as root):
      # set_irq_affinity -x local eth1 <eth2> <eth3>
      #
      # to get help:
      # set_irq_affinity
      
      usage()
      {
          echo
          echo "Usage: $0 [-x] {all|local|remote|one|custom} [ethX] <[ethY]>"
          echo "    options: -x        Configure XPS as well as smp_affinity"
          echo "    options: {remote|one} can be followed by a specific node number"
          echo "    Ex: $0 local eth0"
          echo "    Ex: $0 remote 1 eth0"
          echo "    Ex: $0 custom eth0 eth1"
          echo "    Ex: $0 0-7,16-23 eth0"
          echo
          exit 1
      }
      
      if [ "$1" == "-x" ]; then
          XPS_ENA=1
          shift
      fi
      
      num=^[0-9]+$
      # Vars
      AFF=$1
      shift
      
      case "$AFF" in
          remote)    [[ $1 =~ $num ]] && rnode=$1 && shift ;;
          one)    [[ $1 =~ $num ]] && cnt=$1 && shift ;;
          all)    ;;
          local)    ;;
          custom)    ;;
          [0-9]*)    ;;
          -h|--help)    usage ;;
          "")        usage ;;
          *)        IFACES=$AFF && AFF=all ;;    # Backwards compat mode
      esac
      
      # append the interfaces listed to the string with spaces
      while [ "$#" -ne "0" ] ; do
          IFACES+=" $1"
          shift
      done
      
      # for now the user must specify interfaces
      if [ -z "$IFACES" ]; then
          usage
          exit 1
      fi
      
      # support functions
      
      set_affinity()
      {
          VEC=$core
          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<<$VEC))
              MASK=$(printf "%X" $MASK_TMP)
          fi
      
          printf "%s" $MASK > /proc/irq/$IRQ/smp_affinity
          printf "%s %d %s -> /proc/irq/$IRQ/smp_affinity\n" $IFACE $core $MASK
          if ! [ -z "$XPS_ENA" ]; then
              printf "%s %d %s -> /sys/class/net/%s/queues/tx-%d/xps_cpus\n" $IFACE $core $MASK $IFACE $((n-1))
              printf "%s" $MASK > /sys/class/net/$IFACE/queues/tx-$((n-1))/xps_cpus
          fi
      }
      
      # Allow usage of , or -
      #
      parse_range () {
              RANGE=${@//,/ }
              RANGE=${RANGE//-/..}
              LIST=""
              for r in $RANGE; do
              # eval lets us use vars in {#..#} range
                      [[ $r =~ .. ]] && r="$(eval echo {$r})"
              LIST+=" $r"
              done
          echo $LIST
      }
      
      # Affinitize interrupts
      #
      setaff()
      {
          CORES=$(parse_range $CORES)
          ncores=$(echo $CORES | wc -w)
          n=1
      
          # this script only supports interrupt vectors in pairs,
          # modification would be required to support a single Tx or Rx queue
          # per interrupt vector
      
          queues="${IFACE}-.*TxRx"
      
          irqs=$(grep "$queues" /proc/interrupts | cut -f1 -d:)
          [ -z "$irqs" ] && irqs=$(grep $IFACE /proc/interrupts | cut -f1 -d:)
          [ -z "$irqs" ] && irqs=$(for i in `ls -Ux /sys/class/net/$IFACE/device/msi_irqs` ;                             do grep "$i:.*TxRx" /proc/interrupts | grep -v fdir | cut -f 1 -d : ;                             done)
          [ -z "$irqs" ] && echo "Error: Could not find interrupts for $IFACE"
      
          echo "IFACE CORE MASK -> FILE"
          echo "======================="
          for IRQ in $irqs; do
              [ "$n" -gt "$ncores" ] && n=1
              j=1
              # much faster than calling cut for each
              for i in $CORES; do
                  [ $((j++)) -ge $n ] && break
              done
              core=$i
              set_affinity
              ((n++))
          done
      }
      
      # now the actual useful bits of code
      
      # these next 2 lines would allow script to auto-determine interfaces
      #[ -z "$IFACES" ] && IFACES=$(ls /sys/class/net)
      #[ -z "$IFACES" ] && echo "Error: No interfaces up" && exit 1
      
      # echo IFACES is $IFACES
      
      CORES=$(</sys/devices/system/cpu/online)
      [ "$CORES" ] || CORES=$(grep ^proc /proc/cpuinfo | cut -f2 -d:)
      
      
      node_dir=/sys/devices/system/node
      for i in $(ls -d $node_dir/node*); 
      do i=${i/*node/} corelist[$i]=$(<$node_dir/node${i}/cpulist) done for IFACE in $IFACES; do dev_dir=/sys/class/net/$IFACE/device [ -e $dev_dir/numa_node ] && node=$(<$dev_dir/numa_node) [ "$node" ] && [ "$node" -gt 0 ] || node=0 case "$AFF" in local) CORES=${corelist[$node]} ;; remote) [ "$rnode" ] || { [ $node -eq 0 ] && rnode=1 || rnode=0; } CORES=${corelist[$rnode]} ;; one) [ -n "$cnt" ] || cnt=0 CORES=$cnt ;; all) CORES=$CORES ;; custom) echo -n "Input cores for $IFACE (ex. 0-7,15-23): " read CORES ;; [0-9]*) CORES=$AFF ;; *) usage exit 1 ;; esac # call the worker function setaff done 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
      相关文章
      20017年香港六合彩63集 宁乡县| 运城市| 丹寨县| 冀州市| 深州市| 亚东县| 洛川县| 正宁县| 儋州市| 乌兰县| 丹巴县| 峨眉山市| 汉中市| 乐东| 新乡市| 台安县| 丹巴县| 亚东县| 雅安市| 阜新市| 康保县| 辽宁省| 绩溪县| 文山县| 渭南市| 平南县| 华容县| 六枝特区| 萨嘎县| 金溪县| 松江区| 同德县| 黎城县| 平原县| 和硕县| 镇原县| 清苑县| 峡江县| 江达县| 嘉黎县| 黑山县| 荃湾区| 上栗县| 临清市| 锡林郭勒盟| 娄底市| 县级市| 陆良县| 许昌县| 门头沟区| 梨树县| 蕉岭县| 澜沧| 申扎县| 镇宁| 尉犁县| 绥棱县| 东兴市| 黔东| 徐水县| 华亭县| 丰原市| 叙永县| 揭东县| 凤台县| 桦川县| 贵德县| 屏边| 南丹县| 海城市| 贵溪市| 弋阳县| 柳江县| 原阳县| 德州市| 尤溪县| 阳西县| 石台县| 新疆| 招远市| 汾西县| 灵川县| 昭苏县| 田阳县| 攀枝花市| 大洼县| 无为县| http://gwvolunteerl888.com http://m.flserveo888.com http://gwzerol888.com http://m.hsizer888.com http://hspreadr888.com http://wap.hwarmr888.com http://m.flshifto888.com http://wap.htreer888.com http://flsequenceo888.com http://3g.flshowero888.com http://3g.gwebl888.com