在发布了关于微软在 Windows Server 2025 中可选原生 NVMe 功能的文章后,我们收到了许多请求,希望我们直接比较 Windows Server 2025(支持原生 NVMe)和基于 Linux 的服务器操作系统之间的存储性能。一位特别热情的 Reddit 用户甚至提出请我们喝啤酒!由于显然没有其他合理的选择,我们决定在 Linux 上运行相同的测试。
很久很久以前,在一个遥远的操作系统版本中
Linux 内核自 2012 年 3 月发布的3.3 版本起就支持 NVMe。同样,Windows Server 自 2012 R2 版本(大约在 2013 年 10 月)起也开始支持该协议(非原生支持,通过 SCSI 转换)。十多年过去了,用户仍在争论 Windows 和 Linux 哪个更适合存储,因此我们决定通过对比两者的基准测试结果,为这场争论火上浇油。
由于我们已获得在 Windows Server 2025 上使用非原生和原生存储栈的测试结果,因此我们认为有必要在 Linux 上评估两种存储栈。在 FIO 基准测试中,我们使用了 libaio 和 io_uring,这两种 API 是目前最流行的存储事务 API。虽然 io_uring 更新,并且在异步 I/O 方面进行了诸多改进,但 libaio 因其灵活性和易用性仍然被广泛使用(Didona、Pfefferle、Ioannou、Metzler 和 Trivedi,2022)。本文篇幅有限,无法对两种存储栈进行完整的架构概述,但我们仍将提供测试结果以便进行直接比较。
在 Ubuntu Server 24.04.4 LTS 上测试 NVMe
本次对比测试所用的硬件平台与我们之前发布的Windows Server 2025 原生 NVMe 文章中使用的服务器相同。为了确保最大吞吐量和一致的测试结果,该服务器配备了两颗 128 核 AMD EPYC 9754 CPU、768GB 4800 MT/s DDR5 内存,以及十五块30.72 TB Solidigm P5316 NVMe SSD(采用 PCIe 4.0),并以 JBOD 配置进行连接。
正如我们在之前的文章中提到的,Solidigm P5316 的间接单元大小为 64 KB,这意味着对于较小块大小(例如 4K 测试)的写入性能通常比预期要差。我们再次运行了不同块大小(4K、64K 和 128K)的测试模式,以提供更广泛的读写操作结果。
我们选择 Ubuntu Server 24.04.4 LTS 作为 Linux 示例,是因为它广受欢迎且拥有长期支持。它默认运行在 Linux 内核 6.8 上,虽然这并非最新或最先进的版本,但很可能代表了全球大部分 Linux 安装量。
核心亮点
- Windows Server 2025 原生 NVMe 在四项读取性能基准测试中的三项中胜出。
- 在大多数测试中,Windows Server 的 CPU 使用率较低。
- Ubuntu Server 24.04.4 LTS 在四项写入性能基准测试中的三项中胜出。
| 米制 | 随机 4K | 随机 64K | ||||||
|---|---|---|---|---|---|---|---|---|
| Windows 非原生 | Windows 本机 | Linux libaio | Linux io_uring | Windows 非原生 | Windows 本机 | Linux libaio | Linux io_uring | |
| 随机阅读 | ||||||||
| 带宽(GiB/s) | 6.1 | 10.058 | 9.198 | 9.504 | 74.291 | 91.165 | 77.517 | 77.7 |
| IOPS | 1,598,959 | 2,636,516 | 2,411,000 | 2,491,000 | 1,217,176 | 1,493,637 | 1,270,000 | 1,273,000 |
| 平均延迟(毫秒) | 0.169 | 0.104 | 0.198 | 0.192 | 0.239 | 0.207 | 0.377 | 0.376 |
| CPU 总使用率 (%) | 72.67 | 74.22 | 99.77 | 99.76 | 68.44 | 65.11 | 83.16 | 84.72 |
| 米制 | 顺序 64K | 顺序 128K | ||||||
|---|---|---|---|---|---|---|---|---|
| Windows 非原生 | Windows 本机 | Linux libaio | Linux io_uring | Windows 非原生 | Windows 本机 | Linux libaio | Linux io_uring | |
| 顺序阅读 | ||||||||
| 带宽(GiB/s) | 35.596 | 35.623 | 31.867 | 31.433 | 86.791 | 92.562 | 97.05 | 97 |
| IOPS | 583,192 | 583,638 | 522,000 | 515,000 | 710,978 | 758,252 | 795,000 | 795,000 |
| 平均延迟(毫秒) | 0.809 | 0.812 | 0.919 | 0.932 | 0.613 | 0.608 | 0.603 | 0.604 |
| CPU 总使用率 (%) | 44.89 | 37.11 | 53.94 | 41.74 | 61.56 | 49.56 | 75.14 | 76.90 |
| 米制 | 随机 4K | 随机 64K | ||||||
|---|---|---|---|---|---|---|---|---|
| Windows 非原生 | Windows 本机 | Linux libaio | Linux io_uring | Windows 非原生 | Windows 本机 | Linux libaio | Linux io_uring | |
| 随机写入 | ||||||||
| 带宽(GiB/s) | 1.803 | 1.756 | 1.876 | 1.815 | 7.654 | 7.655 | 7.652 | 7.651 |
| IOPS | 472,725 | 460,383 | 492,000 | 476,000 | 125,391 | 125,406 | 125,000 | 125,000 |
| 平均延迟(毫秒) | 0.992 | 1.028 | 0.974 | 1.007 | 3.814 | 3.816 | 3.827 | 3.828 |
| CPU 总使用率 (%) | 26.00 | 20.67 | 45.76 | 22.80 | 12.22 | 9.33 | 20.07 | 10.90 |
| 米制 | 顺序 64K | 顺序 128K | ||||||
|---|---|---|---|---|---|---|---|---|
| Windows 非原生 | Windows 本机 | Linux libaio | Linux io_uring | Windows 非原生 | Windows 本机 | Linux libaio | Linux io_uring | |
| 顺序写入 | ||||||||
| 带宽(GiB/s) | 44.67 | 50.087 | 52.283 | 52.25 | 50.477 | 50.079 | 52 | 52.083 |
| IOPS | 731,859 | 820,603 | 856,000 | 856,000 | 413,495 | 410,232 | 426,000 | 427,000 |
| 平均延迟(毫秒) | 0.399 | 0.558 | 0.560 | 0.560 | 1.022 | 1.149 | 1.126 | 1.125 |
| CPU 总使用率 (%) | 70.44 | 57.78 | 61.88 | 62.75 | 58.44 | 47.33 | 61.49 | 44.27 |
注意: 由于 Windows Server 2025 和 Ubuntu Server 24.04.4 LTS 的 FIO 报告方式不同,我们的 Linux IOPS 结果四舍五入到千位。带宽、延迟和 CPU 使用率结果在两个平台上均采用一致的四舍五入方式。
数字不说谎
我们立即发现,Ubuntu 并非在所有方面都优于 Windows。虽然 libaio 和 io_uring 在我们的随机读取带宽测试中表现出色,但它们的性能仍不及微软原生 NVMe 协议栈。在我们的 64K 随机读取测试中,Windows NT 内核的性能比 Linux 内核高出约 17%,原生 NVMe 的读取速度达到了 91.165 GiB/s,而 io_uring 的最佳成绩为 77.7 GiB/s。
然而,托瓦兹的技术恐怖并非完全没有希望。在我们的一项读取性能基准测试——顺序 128K 测试中,Ubuntu Server 险胜 Windows Server。在此测试中,Linux 的 libaio 性能最佳,达到 97.05 GiB/s,而 Windows 的原生 NVMe 为 92.562 GiB/s,两者相差约 5%。这表明,在管理大于驱动器间接单元大小的块时,Linux 可能略占优势。
在Linux和Windows系统下,随机写入带宽表现一致,尤其是在64K基准测试中。这些测试的最佳和最差结果仅相差0.05%,表明所有存储堆栈都充分发挥了硬盘的全部性能。
有趣的是,Linux 6.8 内核在 64K 和 128K 块大小的顺序写入带宽测试中取得了胜利。虽然差距并不大,但开源软件栈在这两种情况下都比 Windows Server 的原生 NVMe 高出约 2 GiB/s。
延迟测试结果总体上与吞吐量测试结果一致,随机读取平均值的差异最能体现这一点。遗憾的是,对于 Tux 而言,libaio 和 io_uring 的延迟较高,其中 Windows Server 原生 NVMe(0.207 毫秒)和 libaio(0.377 毫秒)在 64K 次随机读取测试中的最大延迟差异为 0.17 毫秒。
基准测试中最令人震惊的发现或许是 Windows Server 2025 和 Ubuntu Server 24.04.4 LTS 之间 CPU 使用率的巨大差异。在四项随机和顺序读取基准测试中,有三项测试显示 Windows Server 原生 NVMe 的 CPU 使用率最低。最显著的结果出现在 128K 顺序读取基准测试中,Windows 的 CPU 使用率比 Linux 低 27.34%。
在随机写入和顺序写入测试中,使用 libaio 和 io_uring 的 CPU 使用率略有提升,但仍不足以阻止 Windows Server 上的原生 NVMe 在三项基准测试中胜出。值得注意的是,libaio 在 4K 随机写入测试中的 CPU 使用率达到了系统 CPU 的 45.76%,而其他存储方案的 CPU 使用率则徘徊在 20% 左右。
CPU晚宴,优胜者!
我们的测试结果显示,在不同块大小的随机和顺序性能测试中,Windows Server 和 Ubuntu Server 的性能非常接近。在带宽方面,采用原生 NVMe 的 Windows Server 2025 在大多数读取测试中通常优于 Linux,而 Linux 在写入测试中的表现略胜一筹。延迟测试结果也印证了这一点,但真正的亮点在于 Windows Server 2025 在使用原生 NVMe 时的 CPU 效率。
微软显然投入了大量精力,力求打造其最新的存储堆栈,虽然它并非总能胜过 libaio 和 io_uring,但表现可圈可点。尽管这些结果并非适用于所有用例和服务器配置,但当存储性能比操作系统兼容性更为重要时,它们或许能够帮助服务器管理员决定部署 Windows 服务器还是 Linux 服务器。
欢迎在我们的社交平台或SR Discord服务器上留言,告诉我们您对这些测试结果的看法!您是否预料到Windows Server会在我们的测试中表现如此出色?或者您更看好Linux?您是否希望看到更多Linux服务器发行版或内核的测试?我们始终期待您的反馈,而像这样应读者要求进行的测试往往会成为我们最受欢迎的文章。
案例
Didona, D., Pfefferle, J., Ioannou, N., Metzler, B., & Trivedi, A. (2022年6月13日). 理解现代存储API:libaio、SPDK和io_uring的系统研究。SYSTOR '22, 120-121。2026年4月3日检索自https://atlarge-research.com/pdfs/2022-systor-apis.pdf




Amazon