在服务端的配置操作,包括针对文件描述符限制、SELinux状态、audit服务、网卡SR-IOV直通到虚拟机以及网卡中断绑核的配置。
vi /etc/security/limits.conf
* soft nofile 102400 * hard nofile 102400
logout
重新登录SSH终端后,使修改主机名生效。
临时关闭SELinux方式,重启服务器后失效。
1
|
setenforce 0 |
永久关闭SELinux方式,需要重启服务器才能生效。
1 2 |
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config cat /etc/selinux/config |
如下图所示,显示“SELINUX=disabled”即表示修改成功。
vim /boot/efi/EFI/openEuler/grub.cfg
在服务器中,将网卡通过VF直通的方式直通虚拟机,使虚拟机可以和外部网络进行通信,测试HTTPress时,客户端可以在别的服务器中执行命令,连接到本服务器的Nginx服务中。
echo 3 > /sys/class/net/enp7s0/device/sriov_numvfs
ethtool -i enp7s0
cat /sys/class/net/enp7s0/device/numa_node
可以看到,该物理网卡亲和NUMA node0。
查询网卡node的NUMA亲和性,还可以通过以下命令:
lspci -vvv -s 07:00.0 | grep NUMA
可以看到,该物理网卡亲和NUMA node0。
ls cpu
可以看到,NUMA node0对应的CPU核在编号0-31。
cd /sys/class/net/enp7s0 cd /device ls
查看virtfn2的NUMA亲和性。
cd virtfn2 cat numa_node
可以看到网卡VF的NUMA亲和性和创建VF的物理网卡节点一致,都亲和NUMA node0。
cd virtfn0 realpath .
cd virtfn1 realpath .
cd virtfn2 realpath .
ethtool -i enp7s0v0
ethtool -i enp7s0v1
ethtool -i enp7s0v2
可以发现其PCI编号是按照规律进行递增的。
ip a
virsh shutdown <虚拟机名称>
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> |
virsh start <虚拟机名称>
启动虚拟机完成后,通过ip a命令查看网卡。
ip a
如果被直通的虚拟网卡节点没有在回显中显示,说明该虚拟网卡VF直通虚拟机成功。
需要将网卡中断绑核到网卡所亲和的node上。在本例中,虚拟网卡enp7s0v0的VF亲和NUMA node0。
vim irq_server.sh
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 |
使用举例
sh irq.sh
sh irq.sh check eth1
eth1为网卡名称,请根据实际情况修改。
sh irq.sh bind eth1 24 '0 1 2 3'
sh irq_server.sh bind enp7s0v0 4 '32-35'
sh irq_server.sh check enp7s0v0