proxmox ve pve AMD显卡直通 网卡驱动 调度器
AMD显卡直通网卡驱动 CPU调度器问题
1. 创建虚拟机时硬盘选择VirtIO SCSI导致windows安装找不到硬盘
需要提前下载VirtIO驱动,并在虚拟机创建完成后,在硬件-添加-CD/DVD驱动器中添加驱动iso
https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
这里提供一个下载链接,经验证可使用
2. 网卡无法正常使用/网速慢/经常掉线
首先确认你使用的网卡是Realtek芯片的,在pve7.2中带有一个古老的驱动r8169,可通过 modinfo r8169
查看,该驱动同时驱动了我安装的2.5G rtl8125网卡与主板自带的rtl8168网卡,并导致rtl8125网卡在拨号时经常失败/网速达不到标准速度,下面给出一种解决方案
(1) 安装编译网卡驱动需要的依赖
apt install pve-headers-$(uname -r)
apt install git dkms build-essential
(2) 下载对应你网卡需求的驱动,最好选择dkms驱动,可以在系统升级后仍能正常使用
rtl8125: https://github.com/awesometic/realtek-r8125-dkms.git
rtl8168: https://github.com/RangeeGmbH/r8168-dkms.git
其中8125驱动可以通过以下方式修改提升网卡性能:修改src下Makefile
ENABLE_MULTIPLE_TX_QUEUE = y
ENABLE_RSS_SUPPORT = y
CONFIG_ASPM = n
即可开启RSS TX/RX多队列支持,并关闭ASPM节能技术,随后通过dkms编译驱动
(3) 检查你编译的驱动是否正确安装,可使用 lsmod | grep r8125
检查,如果有输出则说明驱动加载成功,没有输出请在根目录手动加载模块 modprobe r8125
尝试
最后通过命令 sh -c 'echo blacklist r8169 >> /etc/modprobe.d/blacklist_r8169.conf'
屏蔽r8169驱动,重启pve后即可看见自编译驱动已经正确被网卡加载
3. pve中创建虚拟机的基本参数应如何选择
选择Q35是因为该机型可以实现pcie直通,而win11的安装推荐添加TPM2.0以防止安装错误,BIOS这里选择UEFI,但并不是所有的系统都支持从UEFI启动,如爱快系统就需使用SeaBios才能启动
CPU这里如果需要最佳性能,请设置为host类别,并将CPU权重调高,如调整到1025,CPU的核心数并不完全对应超线程的数量,而是由KVM自行进行权重分配
4. 选择合适的CPU调度器来兼顾宿主机的功耗与性能
首先安装系统监控软件以查看CPU频率和其他系统参数
apt install cpufrequtils lm-sensors
安装好cpufrequtils后可以运行 cpufreq-info
检查当前CPU的调度器
如图可以看到我的CPU调度器是schedutil,而pve安装后的默认调度器一般均为ondemand,你也可以使用下面命令来查看CPU调度器
## 检查 CPU 当前调度器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
## 参考输出
ondemand
接下来我们需要了解当前系统CPU支持哪些调度器,使用下面命令
## 检查 CPU 调度器支持情况
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
## 参考输出
conservative ondemand userspace powersave performance schedutil
这里说明一下各种CPU调度器的区别,推荐使用schedutil调度器,实现功耗和性能的平衡
conservative governor 开启一个 timer,定期去计算各个 CPU 的负载。当CPU 负载超过 80% 时,默认会以 5% 的步伐递增;当 CPU 负载少于 20% 的时候,默认会以 5% 的步伐递减。
ondemand governor 开启一个 timer,定期去计算各个 CPU 的负载。当 CPU 负载超过 80% 时, 就会把 CPU 频率调到最高,其他情况则会根据当前负载按比例计算频率
userspace 用户自定义CPU频率
powersave CPU跑在最低频率
performance CPU一直跑在最高频率
schedutil 利用负载变化回调机制, 把各个 CPU 的 capacity 映射到 CPU 频率,来完成调频动作,capacity 越高,当前 CPU 负载越高,所以频率也调的很高
修改当前CPU调度器:
## 修改 cpufrequtils 配置文件
vim /etc/init.d/cpufrequtils
## 找到 GOVERNOR="ondemand" 修改为以下内容
GOVERNOR="schedutil"
## 让调度器修改生效而不重启系统
systemctl daemon-reload
/etc/init.d/cpufrequtils restart
实时查看当前CPU的频率:
watch -n 0.1 cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
5. AMD显卡直通(以Polaris核心的RX580为例)
这里需要说明,我的电脑为Intel CPU搭配Polaris核心 RX580,并使用了Linux内核5.15版本的pve7.2,如果你的显卡不是以下任意一款,并内核版本不是5.15及以上版本,请慎重使用下面教程
(1) 修改/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"
这里如果是AMD的CPU,则需要把 intel_iommu=on
改为 amd_iommu=on
,并一定不要添加 video=vesafb,simplefb,efifb:off
等屏蔽video的参数,这是由于AMD Crash Bug,后续会进行单独设置
如果你的主板的PCIE IOMMU是合并的(例如1 2槽PCIE会共享带宽),请拆分IOMMU,也就是在 intel_iommu=on
后面添加 pcie_acs_override=downstream
(2) 修改 /etc/modules
vim /etc/modules
在文件底部添加下面四个参数,并保存退出:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
(3) 修改/etc/modprobe.d下面的文件
防止虚拟机崩溃影响宿主机的参数:
echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/iommu_unsafe_interrupts.conf
echo "options kvm ignore_msrs=1 report_ignored_msrs=0" > /etc/modprobe.d/kvm.conf
屏蔽显卡驱动:
echo "blacklist radeon" >> /etc/modprobe.d/pve-blacklist.conf
echo "blacklist nouveau" >> /etc/modprobe.d/pve-blacklist.conf
echo "blacklist nvidia" >> /etc/modprobe.d/pve-blacklist.conf
(4) 添加vendor-reset
AMD显卡直通会出现第一次启动VM之后,如果关闭或重启VM,显卡就会工作不正常、掉驱动甚至不工作,这是由于AMD Reset Bug导致VM关机后显卡不能正确重置,大多数主机开机只能使用一次,第二次尝试使用显卡则会导致VM启动失败/VM宿主机卡死
安装编译vendor-reset驱动需要的依赖(在网卡部分安装过则可以跳过)
apt install pve-headers-$(uname -r)
apt install git dkms build-essential
下载vender-reset驱动并编译
git clone https://github.com/gnif/vendor-reset.git
cd vendor-reset
dkms install .
将驱动添加到modules管理中
echo "vendor-reset" >> /etc/modules
update-initramfs -u
重启后运行
dmesg | grep vendor
如果有输出,则表示安装成功
[ 8.851280] vendor_reset_hook: installed
(5) pve中虚拟机添加显卡设备
在做这一步之前请先将系统安装完成,并且将virtio驱动安装,在安装完成,系统可以正常启动之后再进行下面步骤
可以看见两个设备,一个显卡,一个是显卡带的声卡输出,如果没有声卡输出需求则不需要添加下面的驱动
按上图设置,暂时不开使用主GPU,在开启显卡直通后宿主机会黑屏,这是由于显卡被VFIO抓走了,然后等待开机后使用noVNC控制安装显卡驱动,驱动安装完成并且显示器亮屏之后再关机并勾选主GPU,即可
6. 虚拟机Windows CPU性能问题
在虚拟机Windows中虽然直通了显卡,并且我们按照之前的设置已经将调度器设置为schedutil,但仍会发现由于schedutil调度器的调度模式并不适合win打游戏或者高负载应用使用,而导致的长时间顿卡问题,这里提供一种解决方案。
pve中带有一种名为hookscript的钩子脚本,可以监测到虚拟机的四种状态,分别是pre-start,post-start,pre-stop,post-stop,我们可以通过这种脚本设置windows虚拟机开机时将CPU调度器调整到performance(全核心满频)状态,在windows虚拟机关机的时候调整回schedutil模式。
新建一个文件 /var/lib/vz/snippets/hookscript.sh
,内容如下
#!/usr/bin/env bash
VM_ID=$1;
EXECUTION_PHASE=$2
function change_cpu_freq_performance
{
sed -i "s/GOVERNOR=\"schedutil\"/GOVERNOR=\"performance\"/g" /etc/init.d/cpufrequtils
systemctl daemon-reload
/etc/init.d/cpufrequtils restart
}
function change_cpu_freq_schedutil
{
sed -i "s/GOVERNOR=\"performance\"/GOVERNOR=\"schedutil\"/g" /etc/init.d/cpufrequtils
systemctl daemon-reload
/etc/init.d/cpufrequtils restart
}
if [[ "$EXECUTION_PHASE" == "pre-start" ]]; then
echo "pre_start" >> /root/status
change_cpu_freq_performance;
elif [[ "$EXECUTION_PHASE" == "post-start" ]]; then
echo "post_start" >> /root/status
change_cpu_freq_performance;
elif [[ "$EXECUTION_PHASE" == "pre-stop" ]]; then
echo "pre_stop" >> /root/status
change_cpu_freq_schedutil;
elif [[ "$EXECUTION_PHASE" == "post-stop" ]]; then
echo "post_stop" >> /root/status
change_cpu_freq_schedutil;
fi
然后将这个钩子脚本绑定到对应虚拟机中即可
## 修改 cpufrequtils 配置文件
vim /etc/init.d/cpufrequtils
## 找到 GOVERNOR="ondemand" 修改为以下内容 这是为了防止sed命令不能正确匹配所做的修改
GOVERNOR="schedutil"
# 绑定脚本 将101替换为你虚拟机的编号
qm set 101 --hookscript local:snippets/hookscript.sh
# 解绑脚本
qm set 101 --delete hookscript
更多推荐
所有评论(0)