Производительность Windows WriteFile (SSD против HDD)?

374
Gregory Kontadakis

Этот вопрос связан со следующим наблюдением:

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

Это связано с записью одного большого файла на диск с высокой скоростью.

Я пытаюсь сделать нечто подобное, создав эталон того, как запись большого файла (минимум 30 ГБ) ведет себя на SSD (ОС - Windows 7). Основу тестового кода можно найти по ссылке выше (ярлык здесь: http://www.quicklz.com/write.c ).

Результаты для создания одного файла размером 30 ГБ можно увидеть в следующей таблице. Размер куска (записанного на диск) выровнен по 256 КиБ (используется _aligned_malloc при физическом размере страницы 4096 КиБ в NTFS). Также пробовал больший размер куска (например, 1 ГБ), но результаты были похожи. Первый столбец - это размер файла, создаваемый в каждой итерации (каждый раз добавляется около 1 ГБ), а столбцы 2-5 - это скорости записи, наблюдаемые для HDD / SSD с использованием «кэширования / буферизации» (опция по умолчанию в WriteFile ) по сравнению с «без буферизации». / caching "case (см. флаг CreateFileFILE_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 | +-----------+---------------+--------------+---------------+--------------+ 

Некоторые наблюдения здесь:

Оба кейса Win Cache (SSD и HDD) сначала имеют очень высокую скорость благодаря кэшированию Windows. Тогда ставка снижается.

В случае с жестким диском без кеширования мы видим стабильную скорость (и нормальную скорость для моего жесткого диска, поскольку она составляет около 207 МБ / с).

В случае с SSD без кеширования мы можем увидеть даже худшую скорость по сравнению с HDD.

Итак, наконец, на мой вопрос:

Зачем?

Почему у меня худшие показатели, когда я не использую буферизацию на SSD? Где узкое место? Обработка ОС Windows? SSD родное поведение? Или и программное и аппаратное обеспечение?

Могу ли я добиться постоянной скорости передачи, как у жесткого диска (но выше)? Предполагая, что мой SSD имеет скорость записи 340 МБ / с, могу ли я добиться этого с постоянной скоростью?

Пожалуйста, дайте мне понять, что я здесь игнорирую.

1
Новые твердотельные накопители TLC-NAND используют кэш более быстрого MLC или SLC NAND для буферизации записи в более медленную память TLC. Я предполагаю, что размер буфера составляет приблизительно 16 ГБ в случае с вашими дисками. Mokubai 5 лет назад 0
Спасибо за информацию @Mokubai. Я не был хорошо проинформирован о различных видах NAND. Таким образом, я предполагаю, что не могу достичь постоянной скорости, кроме того, что может обеспечить медленный TLC моего накопителя (даже если я изменю размер чанка на кратные 3 или что-то еще)? Gregory Kontadakis 5 лет назад 0

1 ответ на вопрос

0
Mokubai

По сути, большинство современных дешевых твердотельных накопителей используют флэш-память TLC NAND, которая записывается довольно медленно по сравнению с флэш-памятью MLC или SLC NAND.

Это обеспечивает гораздо более высокую емкость, и скорость чтения сравнима с другими типами, что для «нормальной» системы случайный профиль чтения / записи может быть вполне приемлемым.

Как правило, они увеличивают эту медленную скорость записи, добавляя буфер записи с более быстрым NAND, который может, до тех пор, пока буфер не заполнен, довести производительность почти до нормального уровня.

После того как буфер заполнен, все записи на диск ограничиваются скоростью записи данных в более медленную NAND.

Для получения дополнительной информации читайте твердотельные накопители TLC NAND: производители проблемных хранилищ не дают рекламы

Единственное, что вы можете сделать, - это внимательно изучить спецификации приобретаемых вами накопителей и убедиться, что у вас есть тот, который не использует TLC NAND. Эту информацию может быть трудно найти, и «стабильно быстрые» диски, вероятно, будут значительно дороже.

Похожие вопросы