鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

配置服务端

在服务端的配置操作,包括针对文件描述符限制、SELinux状态、audit服务、网卡SR-IOV直通到虚拟机以及网卡中断绑核的配置。

  1. 在服务器中配置扩展文件描述符。
    1. 打开文件。
      vi /etc/security/limits.conf
    2. “i”进入编辑模式,在文件中新增如下内容,为所有用户(*)设置软限制(soft)和硬限制(hard),文件描述符数量均为102400
      *   soft      nofile      102400
      *   hard      nofile      102400

    3. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。
    4. 退出SSH终端。
      logout

      重新登录SSH终端后,使修改主机名生效。

  2. SELinux可能会限制应用的访问权限,因此需要关闭SELinux,以确保应用能够正常工作。关闭SELinux可能会降低系统的安全性,使系统更容易受到潜在的安全问题和攻击。在关闭之前,您应该仔细评估潜在的风险。
    • 临时关闭SELinux。

      临时关闭SELinux方式,重启服务器后失效。

      1
      setenforce 0
      
    • 永久关闭SELinux。

      永久关闭SELinux方式,需要重启服务器才能生效。

      1. 执行如下命令修改配置文件,关闭SELinux。
        1
        2
        sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
        cat /etc/selinux/config
        

        如下图所示,显示“SELINUX=disabled”即表示修改成功。

      2. 关闭SELinux后,重启服务器,在虚拟机中也需要关闭SElinux,修改完成后需要重启虚拟机。
  3. 关闭audit服务。
    1. 打开文件。
      vim /boot/efi/EFI/openEuler/grub.cfg
    2. “i”进入编辑模式,在对应操作系统版本的内核启动命令行中新增“audit=0”,修改后如下图所示。

    3. “Esc”键,输入:wq!,按“Enter”保存并退出编辑。
    4. 重启服务器,使配置生效。
  4. 将网卡通过VF直通的方式直通虚拟机。

    在服务器中,将网卡通过VF直通的方式直通虚拟机,使虚拟机可以和外部网络进行通信,测试HTTPress时,客户端可以在别的服务器中执行命令,连接到本服务器的Nginx服务中。

    1. 给网卡创建3个VF。请根据实际需要创建VF个数。
      echo 3 > /sys/class/net/enp7s0/device/sriov_numvfs
    2. 获取网卡的bus-info。
      ethtool -i enp7s0

    3. 查询网卡node的NUMA亲和性。
      cat /sys/class/net/enp7s0/device/numa_node

      可以看到,该物理网卡亲和NUMA node0。

      查询网卡node的NUMA亲和性,还可以通过以下命令:

      lspci -vvv -s 07:00.0 | grep NUMA

      可以看到,该物理网卡亲和NUMA node0。

      查看NUMA node0所在的CPU核编号。
      ls cpu

      可以看到,NUMA node0对应的CPU核在编号0-31

    1. 物理网卡创建了3个VF之后,查看物理网卡和虚拟网卡的bus信息。
      cd /sys/class/net/enp7s0
      cd /device
      ls

      查看virtfn2的NUMA亲和性。

      cd virtfn2
      cat numa_node

      可以看到网卡VF的NUMA亲和性和创建VF的物理网卡节点一致,都亲和NUMA node0。

    2. 查看网卡VF的PCI编号。
      • 方式一:
        cd virtfn0
        realpath .

        cd virtfn1
        realpath .

        cd virtfn2
        realpath .

      • 方式二:
        ethtool -i enp7s0v0

        ethtool -i enp7s0v1

        ethtool -i enp7s0v2

        可以发现其PCI编号是按照规律进行递增的。

    3. 通过ip a可以查看创建出来的3个网卡VF,命名为enp7s0v0,enp7s0v1和enp7s0v2。
      ip a

    4. 关闭虚拟机。
      virsh shutdown <虚拟机名称>
    5. 修改虚拟机的配置文件,将以下内容复制到虚拟机的配置文件的<devices>标签中,将虚拟网卡VF直通到虚拟机。
      1
      2
      3
      4
      5
      6
      <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
      <address domain='0x0000' bus='0x07' slot='0x00' function='0x1'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
      </hostdev>
      
    6. 启动虚拟机,查看配置是否生效。
      virsh start <虚拟机名称>

      启动虚拟机完成后,通过ip a命令查看网卡。

      ip a

      如果被直通的虚拟网卡节点没有在回显中显示,说明该虚拟网卡VF直通虚拟机成功。

  5. 网卡中断绑核。

    需要将网卡中断绑核到网卡所亲和的node上。在本例中,虚拟网卡enp7s0v0的VF亲和NUMA node0。

    1. 在服务器“/home”目录下创建一个名为irq_server.sh的绑核脚本文件。
      vim irq_server.sh
    2. 将以下内容拷贝到绑核脚本文件中。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      #!/bin/bash
      # chkconfig: - 50 50
      # description: auto irq
      #获取网卡所在CPU
      function get_default_cpu(){
          eth_numa_node=`cat /sys/class/net/${eth}/device/numa_node`
          numa_nodes=`lscpu | grep node\(s | awk '{print $NF}'`
          cpus=`lscpu | grep CPU\(s | head -1 | awk '{print $NF}'`
          sockets=`lscpu | grep Socket\(s | awk '{print $NF}'`
          cpus_per_socket=`lscpu | grep Core\(s | awk '{print $NF}'`
          numa_per_socket=$((${numa_nodes} / ${sockets}))
          eth_socket=$((${eth_numa_node} / ${numa_per_socket}))
          first_cpu=$[$[$[${cpus_per_socket}*${eth_socket}]]]
          last_cpu=$[$[${cpus_per_socket}*$[${eth_socket}+1]]-1]
          cpurange="${first_cpu}-${last_cpu}"
      }
      #根据参数获取CPU队列
      function get_cpu_list(){
          IFS_bak=$IFS
          IFS=','
          cpurange=($1)
          IFS=${IFS_bak}
          cpulist_arr=()
          n=0
          for i in ${cpurange[@]};do
              start=`echo $i | awk -F'-' '{print $1}'`
              stop=`echo $i | awk -F'-' '{print $NF}'`
              for x in `seq $start $stop`;do
                  cpulist_arr[$n]=$x
                  let n++
              done
          done
      }
      #中断绑核
      function bind(){
          ethtool -L ${eth} combined ${cnt}
          irq=`cat /proc/interrupts| grep ${eth} | awk -F ':' '{print $1}'`
          i=0
          for irq_i in $irq
          do
              if [ $i -ge ${#cpulist_arr[*]} ]; then
                  i=0
              fi
              echo ${cpulist_arr[${i}]} "->" $irq_i
              echo ${cpulist_arr[${i}]}  > /proc/irq/$irq_i/smp_affinity_list
              let i++
          done
      }
      #读取网卡绑定的CPU信息
      function check(){
          ethtool -l $eth
          irq=`cat /proc/interrupts | grep ${eth} | awk -F ':' '{print $1}'`
          for irq_i in $irq
          do
              cat /proc/irq/$irq_i/smp_affinity_list
          done
      }
      [[ $2 ]] && eth=$2 || eth=`ifconfig | grep -B 1 "192.168" | head -1 | awk -F":" '{print $1}'`
      echo "$eth"
      [[ $3 ]] && cnt=$3 || cnt=48
      [[ $4 ]] && cpurange=$4 || get_default_cpu
      get_cpu_list $cpurange
      [[ $1 ]] && $1 || bind
      

      使用举例

      1. 运行下述命令,默认将网段为192.168的网卡的队列深度设置为48,即将网卡绑定到CPU的前48个核上。
        sh irq.sh
      2. 读取网卡绑核信息。
        sh irq.sh check eth1

        eth1为网卡名称,请根据实际情况修改。

      3. eth1队列深度修改为24,并循环绑定到'0 1 2 3'四个核上。支持连续绑核,例如连续绑核至'1-3,6,7-9'
        sh irq.sh bind eth1 24 '0 1 2 3'
    3. 执行网卡中断绑核命令。
      sh irq_server.sh bind enp7s0v0 4 '32-35'
    4. 确认网卡中断绑核成功。
      sh irq_server.sh check enp7s0v0