这个问题与以下观察相关:
这与以快速率将单个大文件写入磁盘有关。
我尝试通过创建基准来做类似的事情,以了解在 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 的驱动器。这些信息可能很难找到,而且“始终快速”的驱动器可能会贵得多。