配置服务端
在服务端的配置操作,包括针对文件描述符限制、SELinux状态、audit服务、网卡SR-IOV直通到虚拟机以及网卡中断绑核的配置。
- 在服务器中配置扩展文件描述符。
- 打开文件。
vi /etc/security/limits.conf
- 按“i”进入编辑模式,在文件中新增如下内容,为所有用户(*)设置软限制(soft)和硬限制(hard),文件描述符数量均为102400。
* soft nofile 102400 * hard nofile 102400
- 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
- 退出SSH终端。
logout
重新登录SSH终端后,使修改主机名生效。
- 打开文件。
- SELinux可能会限制应用的访问权限,因此需要关闭SELinux,以确保应用能够正常工作。关闭SELinux可能会降低系统的安全性,使系统更容易受到潜在的安全问题和攻击。在关闭之前,您应该仔细评估潜在的风险。
- 临时关闭SELinux。
临时关闭SELinux方式,重启服务器后失效。
1
setenforce 0
- 永久关闭SELinux。
永久关闭SELinux方式,需要重启服务器才能生效。
- 执行如下命令修改配置文件,关闭SELinux。
1 2
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config cat /etc/selinux/config
如下图所示,显示“SELINUX=disabled”即表示修改成功。
- 关闭SELinux后,重启服务器,在虚拟机中也需要关闭SElinux,修改完成后需要重启虚拟机。
- 执行如下命令修改配置文件,关闭SELinux。
- 临时关闭SELinux。
- 关闭audit服务。
- 打开文件。
vim /boot/efi/EFI/openEuler/grub.cfg
- 按“i”进入编辑模式,在对应操作系统版本的内核启动命令行中新增“audit=0”,修改后如下图所示。
- 按“Esc”键,输入:wq!,按“Enter”保存并退出编辑。
- 重启服务器,使配置生效。
- 打开文件。
- 将网卡通过VF直通的方式直通虚拟机。
在服务器中,将网卡通过VF直通的方式直通虚拟机,使虚拟机可以和外部网络进行通信,测试HTTPress时,客户端可以在别的服务器中执行命令,连接到本服务器的Nginx服务中。
- 给网卡创建3个VF。请根据实际需要创建VF个数。
echo 3 > /sys/class/net/enp7s0/device/sriov_numvfs
- 获取网卡的bus-info。
ethtool -i enp7s0
- 查询网卡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。
- 物理网卡创建了3个VF之后,查看物理网卡和虚拟网卡的bus信息。
cd /sys/class/net/enp7s0 cd /device ls
查看virtfn2的NUMA亲和性。
cd virtfn2 cat numa_node
可以看到网卡VF的NUMA亲和性和创建VF的物理网卡节点一致,都亲和NUMA node0。
- 查看网卡VF的PCI编号。
- 方式一:
cd virtfn0 realpath .
cd virtfn1 realpath .
cd virtfn2 realpath .
- 方式二:
ethtool -i enp7s0v0
ethtool -i enp7s0v1
ethtool -i enp7s0v2
可以发现其PCI编号是按照规律进行递增的。
- 方式一:
- 通过ip a可以查看创建出来的3个网卡VF,命名为enp7s0v0,enp7s0v1和enp7s0v2。
ip a
- 关闭虚拟机。
virsh shutdown <虚拟机名称>
- 修改虚拟机的配置文件,将以下内容复制到虚拟机的配置文件的<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>
- 启动虚拟机,查看配置是否生效。
virsh start <虚拟机名称>
启动虚拟机完成后,通过ip a命令查看网卡。
ip a
如果被直通的虚拟网卡节点没有在回显中显示,说明该虚拟网卡VF直通虚拟机成功。
- 给网卡创建3个VF。请根据实际需要创建VF个数。
- 网卡中断绑核。
需要将网卡中断绑核到网卡所亲和的node上。在本例中,虚拟网卡enp7s0v0的VF亲和NUMA node0。
- 在服务器“/home”目录下创建一个名为irq_server.sh的绑核脚本文件。
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
使用举例
- 运行下述命令,默认将网段为192.168的网卡的队列深度设置为48,即将网卡绑定到CPU的前48个核上。
sh irq.sh
- 读取网卡绑核信息。
sh irq.sh check eth1
eth1为网卡名称,请根据实际情况修改。
- 将eth1队列深度修改为24,并循环绑定到'0 1 2 3'四个核上。支持连续绑核,例如连续绑核至'1-3,6,7-9'。
sh irq.sh bind eth1 24 '0 1 2 3'
- 运行下述命令,默认将网段为192.168的网卡的队列深度设置为48,即将网卡绑定到CPU的前48个核上。
- 执行网卡中断绑核命令。
sh irq_server.sh bind enp7s0v0 4 '32-35'
- 确认网卡中断绑核成功。
sh irq_server.sh check enp7s0v0
- 在服务器“/home”目录下创建一个名为irq_server.sh的绑核脚本文件。
父主题: 配置部署环境