For the complete documentation index, see llms.txt. This page is also available as Markdown.

VirtIO-Win 驱动与 MS SQL Server 工作负载的兼容性

影响在高 I/O 负载下运行 MS SQL Server 的 Windows 虚拟机的已知 virtio-win 驱动兼容性问题,包括推荐版本、验证步骤和干净降级流程。

概述

要点

  • virtio-win v0.1.285 以及 v0.1.292 在以下组件中存在竞态条件 vioscsi 以及 viostor 存储驱动,在负载很重的 MS SQL Server 虚拟机上会显现出来

  • v0.1.271 是受影响提交之前的最后一个版本,也是运行数据库负载的 Windows 来宾的推荐版本

  • 症状在以下环境中最明显 Windows Server 2025 在持续并行 I/O 下的来宾

  • 上游修复已于 2026 年 1 月落地;后续包含该修复的 virtio-win 版本也应是安全的——在大范围部署前请先验证构建版本

  • 在更改存储驱动之前,请先为虚拟机创建快照并停止 SQL Server 服务

在 VergeOS 上运行 MS SQL Server 的 Windows 虚拟机,如果来宾使用 virtio-win v0.1.285 或 v0.1.292,就可能产生一串 SQL Server“读重试”日志条目——在某些情况下,持续负载运行数天后还会导致 SQL Server 服务卡死。根本原因是以下组件中的非原子 SRB ID 分配 vioscsi/viostor Storport miniport,它允许当 Windows 将 I/O 并行分发到多个 CPU 时发出重复 ID(上游跟踪为 virtio-win 问题 #1453).

该行为在以下版本上最容易复现 Windows Server 2025 因为其 Storport 实现比早期 Windows Server 版本更激进地并行化 StartIo 。旧版 Windows 来宾同样暴露于该错误,但触发频率更低。

将来宾的 virtio-win 驱动降级到 v0.1.271 是一个稳定的解决方法。针对底层竞态条件的修复已合并到上游并随较新的 virtio-win 构建发布,因此后续包含该修复的版本也应是安全的——在事件处理中途升级前,请先与 VergeOS 支持确认你环境中的哪些构建是已知良好的。

症状

如果你怀疑 VergeOS Windows 虚拟机存在此问题,请在来宾的以下位置查找 应用程序 事件日志和 SQL Server 错误日志:

  • 读重试消息,其中 期望 以及 实际 值相同,例如:

    对文件 '*.mdf' 在偏移量 0x... 处的读取在失败 1 次后成功,错误为:校验和不正确(期望值:0xad4c6778;实际值:0xad4c6778)

    对文件 '*.mdf' 在偏移量 0x... 处的读取在失败 1 次后成功,错误为:页 ID 不正确(期望值 1:29669944;实际值 1:29669944)

  • 未找到 ID 对应的 SRB 来自 vioscsi

  • SQL Server 服务在持续高负载运行数天后卡死

这些消息看起来像是损坏,但通常并不是

SQL Server 报告 重试 结果,第二次尝试成功。 DBCC CHECKDB 通常会返回干净结果——磁盘上的数据库页是完整的。由于重复的 SRB ID,驱动在第一次读取时传递了错误的缓冲区,而第二次读取返回了正确的数据。持续的重试仍然表明存在真实问题,即使未检测到损坏也应予以处理。

前提条件

  • 在 VergeOS 上运行 MS SQL Server(或类似 I/O 密集型数据库负载)的 Windows 虚拟机

  • Windows 来宾的管理权限

  • 在更改任何驱动之前为虚拟机创建的快照

  • virtio-win v0.1.271 ISO 已上传到你的 VergeOS 环境下的 文件。归档 ISO 可从以下位置获取: Fedora People 上的 stable-virtio 归档

识别已安装的 VirtIO 驱动版本

在更改任何内容之前,请先确认来宾当前运行的是哪个 virtio-win 构建版本。

  1. 打开设备管理器

    • 右键开始菜单并选择 设备管理器.

  2. 找到 VirtIO 存储控制器

    • 展开 存储控制器.

    • 右键单击 Red Hat VirtIO SCSI 控制器 (用于 vioscsi)或 Red Hat VirtIO SCSI 直通控制器 / Red Hat VirtIO SCSI 磁盘设备 (用于 viostor)并选择 属性.

  3. 检查驱动版本和日期

    • 切换到 驱动程序 选项卡。

    • 记下 驱动版本 以及 驱动日期 字段。

  4. 与源 ISO 进行交叉比对

    • 驱动版本标记遵循 100.<minor>.<build>.<revision> 格式,其中尾随的修订组件由 virtio-win ISO 版本构建而成。例如,来自 vioscsi 驱动程序 virtio-win 0.1.285 的通常以 .28500; 0.1.271 的通常以 .27100.

    • 如果你不确定已安装驱动是由哪个 ISO 生成的,请在来宾中挂载候选 ISO,并将其 vioscsi.inf / viostor.inf DriverVer 行与设备管理器中显示的值进行比较。

推荐版本

版本
状态

v0.1.271

推荐的解决方法。 受影响提交之前的最后一个版本;已确认在高强度 SQL 负载下稳定。

v0.1.285

避免使用。 包含 vioscsi/viostor SRB ID 竞态;会在繁忙的 SQL 虚拟机上产生读重试错误。

v0.1.292

避免使用。 与 v0.1.285 相同的缺陷。

构建版本 在上游修复之后 (2026 年 1 月及之后)

原则上应是安全的。部署前请先与 VergeOS 支持确认具体构建版本。

稳定版 virtio-win ISO 下载可从以下位置获取: Fedora People stable-virtio 仓库,较旧版本则可从以下位置获取: archive-virtio 目录.

降级到 virtio-win v0.1.271

  1. 在来宾中停止 MS SQL Server 服务

    • 从提升权限的 PowerShell 或“服务”控制台中,停止 SQL Server (MSSQLSERVER) 服务以及任何依赖服务(SQL Agent、全文、Reporting Services 等),以便在更改存储驱动前让 I/O 静止。

  2. 挂载 virtio-win v0.1.271 ISO

    • 在 VergeOS 中,编辑虚拟机并附加 virtio-win-0.1.271.iso 作为 CD/DVD 设备。

    • 确认该 ISO 在 Windows 中可见(通常会显示为下一个可用盘符)。

  3. 卸载当前的 virtio-win 来宾工具

    • 打开 设置 → 应用 → 应用和功能 (或 控制面板中的“程序和功能” 位于来宾中。

    • 找到 Virtio-win-guest-tools 并选择 卸载。按提示操作,如有要求则重启。

    • 如果卸载失败或回滚并报错 0x80070643 (这是删除 virtio-win-guest-tools 时的已知问题),请使用微软的 程序安装和卸载疑难解答 在继续前清理注册信息。

  4. 重启 VM

    • 重启 Windows,以释放所有正在使用的驱动文件。虚拟机仍应能够启动——在安装新包之前,Windows 会保留存储驱动二进制文件。

  5. 从 v0.1.271 ISO 安装 virtio-win-guest-tools

    • 从已挂载的 v0.1.271 ISO 中运行 virtio-win-guest-tools.exe (或 virtio-win-gt-x64.msi)并以管理员身份运行。

    • 使用默认组件选择完成安装程序。这会以 v0.1.271 构建重新安装 vioscsi、viostor、NetKVM 以及来宾代理。

  6. 再次重启虚拟机

    • 重启 Windows,使存储和网络栈在降级后的驱动上重新加载。

  7. 验证新的驱动版本

    • 返回到 设备管理器 → 存储控制器,打开 VirtIO 控制器的 属性 → 驱动程序 选项卡,并确认 驱动版本 现在反映的是 v0.1.271 构建(通常以 .27100).

    • 为任何其他 VirtIO 控制器以及 Red Hat VirtIO 以太网适配器网络适配器.

  8. 启动 MS SQL Server 服务

    • 启动 SQL Server 服务及其依赖项,并确认数据库能正常联机。

  9. 在负载下监控

    • 恢复正常工作负载,并观察 SQL Server 错误日志和 Windows 应用程序日志中是否出现上述读重试消息。持续运行且没有重试即为成功标准。

故障排除

其他资源

反馈

需要帮助吗?

如果你在 Windows MS SQL 虚拟机上看到读重试消息或不稳定现象,并且不确定安装了哪个 virtio-win 版本——或者应该升级到哪个版本——请在生产环境中更改驱动之前联系 VergeOS 支持团队

最后更新于

这有帮助吗?