Windows WriteFile 性能(SSD 与 HDD)?

Windows WriteFile 性能(SSD 与 HDD)?

这个问题与以下观察相关:

https://social.technet.microsoft.com/Forums/exchange/en-US/09dd046e-8127-4550-8e26-5fba7a5a0743/performance-flaw-in-file-system-decreases-writefile-throughput-towards-0?forum=winserverfiles

这与以快速率将单个大文件写入磁盘有关。

我尝试通过创建基准来做类似的事情,以了解在 SSD 上写入大文件(最小 30 GB)的行为(操作系统为 Windows 7)。测试代码的基础可以在上面的链接中找到(快捷方式在这里:http://www.quicklz.com/write.c)。

下表显示了创建单个 30 GB 文件的结果。块大小(写入磁盘)是 256 KiB 对齐的(在 NTFS 上使用 _aligned_malloc 的 4096 KiB 物理页面大小)。还尝试了更大的块大小(例如 1 GB),但结果相似。第一列是每次迭代中创建的文件大小(每次追加接近 1 GB),第 2-5 列是使用“缓存/缓冲”(默认选项)观察到的 HDD/SSD 写入速度写文件)与“无缓冲/缓存”情况相比(参见创建文件标志FILE_FLAG_NO_BUFFERING)。在 Windows 缓存情况下,操作系统决定何时 FlushFileBuffers(未明确调用)。

+-----------+---------------+--------------+---------------+--------------+
| File Size | Win cache HDD | No cache HDD | Win cache SSD | No cache SSD |
+-----------+---------------+--------------+---------------+--------------+
| 1024 MiB  | 3282 MiB/s    | 205 MiB/s    | 2626 MiB/s    | 187 MiB/s    |
| 2048 MiB  | 2853 MiB/s    | 203 MiB/s    | 2626 MiB/s    | 383 MiB/s    |
| 3072 MiB  | 2861 MiB/s    | 207 MiB/s    | 3132 MiB/s    | 388 MiB/s    |
| 4097 MiB  | 2977 MiB/s    | 198 MiB/s    | 2626 MiB/s    | 393 MiB/s    |
| 5121 MiB  | 2986 MiB/s    | 206 MiB/s    | 2731 MiB/s    | 388 MiB/s    |
| 6145 MiB  | 3282 MiB/s    | 200 MiB/s    | 2626 MiB/s    | 199 MiB/s    |
| 7169 MiB  | 33 MiB/s      | 201 MiB/s    | 215 MiB/s     | 377 MiB/s    |
| 8194 MiB  | 2626 MiB/s    | 201 MiB/s    | 287 MiB/s     | 197 MiB/s    |
| 9218 MiB  | 2626 MiB/s    | 207 MiB/s    | 317 MiB/s     | 345 MiB/s    |
| 10242 MiB | 2853 MiB/s    | 197 MiB/s    | 215 MiB/s     | 181 MiB/s    |
| 11266 MiB | 3122 MiB/s    | 202 MiB/s    | 375 MiB/s     | 343 MiB/s    |
| 12291 MiB | 3282 MiB/s    | 202 MiB/s    | 368 MiB/s     | 209 MiB/s    |
| 13315 MiB | 187 MiB/s     | 199 MiB/s    | 194 MiB/s     | 362 MiB/s    |
| 14339 MiB | 145 MiB/s     | 201 MiB/s    | 329 MiB/s     | 356 MiB/s    |
| 15363 MiB | 140 MiB/s     | 205 MiB/s    | 125 MiB/s     | 195 MiB/s    |
| 16388 MiB | 135 MiB/s     | 195 MiB/s    | 220 MiB/s     | 360 MiB/s    |
| 17412 MiB | 126 MiB/s     | 204 MiB/s    | 279 MiB/s     | 196 MiB/s    |
| 18436 MiB | 124 MiB/s     | 195 MiB/s    | 269 MiB/s     | 103 MiB/s    |
| 19460 MiB | 129 MiB/s     | 199 MiB/s    | 242 MiB/s     | 104 MiB/s    |
| 20485 MiB | 137 MiB/s     | 203 MiB/s    | 189 MiB/s     | 107 MiB/s    |
| 21509 MiB | 128 MiB/s     | 198 MiB/s    | 120 MiB/s     | 116 MiB/s    |
| 22533 MiB | 134 MiB/s     | 202 MiB/s    | 109 MiB/s     | 107 MiB/s    |
| 23557 MiB | 137 MiB/s     | 194 MiB/s    | 112 MiB/s     | 113 MiB/s    |
| 24582 MiB | 135 MiB/s     | 204 MiB/s    | 107 MiB/s     | 102 MiB/s    |
| 25606 MiB | 131 MiB/s     | 194 MiB/s    | 122 MiB/s     | 101 MiB/s    |
| 26630 MiB | 130 MiB/s     | 200 MiB/s    | 151 MiB/s     | 108 MiB/s    |
| 27654 MiB | 139 MiB/s     | 199 MiB/s    | 108 MiB/s     | 117 MiB/s    |
| 28679 MiB | 130 MiB/s     | 206 MiB/s    | 104 MiB/s     | 103 MiB/s    |
| 29703 MiB | 121 MiB/s     | 195 MiB/s    | 105 MiB/s     | 107 MiB/s    |
| 30727 MiB | 132 MiB/s     | 203 MiB/s    | 102 MiB/s     | 104 MiB/s    |
+-----------+---------------+--------------+---------------+--------------+

这里有一些观察:

由于 Windows 缓存,两种 Win Cache 情况(SSD 和 HDD)一开始速度都非常快。然后速度变慢。

在没有缓存的 HDD 情况下,我们可以看到稳定的速率(对于我的 HDD 来说速率还可以,因为它约为 207 MB/s)。

在没有缓存的 SSD 情况下,我们实际上可以看到与 HDD 情况相比更差的速率。

最后回答我的问题:

为什么?

为什么我在 SSD 上不使用缓冲时会获得最差的速率?瓶颈在哪里?Windows 操作系统处理?SSD 本机行为?还是软件和硬件?

我能否实现与 HDD 一样(但更高)的恒定传输速率?假设我的 SSD 具有 340 MB/s 的写入速度,我能否以恒定速率实现此速度?

请让我明白我在这里忽略了什么。

答案1

基本上,大多数现代廉价 SSD 都使用 TLC NAND 闪存,与 MLC 或 SLC NAND 闪存相比,其写入速度实际上相当慢。

但它提供了更高的容量,并且读取速度与其他类型相当,对于“正常”系统随机读/写配置文件来说是完全可以接受的。

一般来说,他们通过添加更快的 NAND 写入缓冲区来增强这种较慢的写入速度,这样在缓冲区填满之前,可以使性能达到接近正常的水平。

一旦缓冲区被填满,对驱动器的所有写入都会受到数据写入较慢的 NAND 的速度限制。

更多信息请阅读TLC NAND SSD:存储制造商不愿宣传的严重问题

您唯一能做的就是仔细查看所购买驱动器的规格,并确保购买不使用 TLC NAND 的驱动器。这些信息可能很难找到,而且“始终快速”的驱动器可能会贵得多。

相关内容