Привет, Хабр! Уже много лет я читаю замечательные посты, и, кажется, наконец нашел чем сам могу поделиться с сообществом.
Сегодня я хотел бы рассказать про технологию создания программного гибридного локального диска на основе SSD и HDD. Впервые я заинтересовался этой технологией когда купил себе новый процессор от Ryzen и прочитал статью про AMD StoreMI, но к сожалению поддержка данного продукта прекратилась, а покупать FuzeDrive или PrimoCache не хотелось.
upd. оказывается AMD выпустили вторую версию StoreMI, хотя еще недавно заявляли что прекращают поддержку. Напомню, что StoreMI работает только при наличии материнской платы с чипсетом AMD X570, B550, 400 серии, X399 или TRX40.
В серверных версиях windows существует весьма интересная технология Tiered Storage Spaces, которая позволяет легко объединять один или несколько SSD и HDD в общий пул - логический диск, на котором часто используемые “горячие” данные будут незаметно для пользователя переноситься на SSD, а “холодные” данные, к которым пользователь обращается не так часто, будут при этом храниться на HDD. Про настройку данной технологии на серверных продуктах можно почитать тут по ссылке, также уже существует несколько статей на Хабре. Но, как оказалось, данная технология присутствует также и на настольной версии windows, правда настраивается она только через командную строку так как нет GUI. Для упрощения этого процесса существует репозиторий со скриптами, которые позволяют автоматизировать процесс создания tier storage.
Для хранения важных данных не рекомендуется использовать конфигурации windows storage spaces с выключенным mirroring. Mirroring позволяет создать массив RAID c функцией коррекции ошибок, которая должна помочь сохранить данные в случае поломки одного из дисков, но для этого необходимы дополнительные диски, объем которых не получится использовать для хранения данных.
Перейдем к делу
Для начала советую запустить PowerShell от имени администратора и использовать команду
Get-PhysicalDisk
Параметр CanPool
должен соответствовать True
около всех ваших SSD и HDD, которые вы хотите добавить в пул. Если по запросу команды Get-PhysicalDisk
у одного из ваших накопителей, которые вы хотите добавить в пул будет состояние False, то необходимо при помощи утилиты diskpart запущенной от имени администратора выполнить команды:
list disk #выбрать номер нужного диска, для примера диск 2
select disk 2
clear
А затем в Powershell запущенной от имени администратора выполнить команду:
Reset-PhysicalDisk ST2000DM008-2FR102
где ST2000DM008-2FR102 - это параметр friendly name диска, который вы хотите вернуть в состояние True
. Обратите внимание, что диски, у которых значение CanPool
равно True
будут отформатированы в процессе выполнения скрипта, и, если вы не хотите добавлять их в пул, то необходимо заранее отсоединить эти диски, либо переписать скрипт.
Затем просто клонируйте репозиторий, и запустите запустите скрипт new-storage-space.ps1
Во время выполнения закройте окна, которые будут предлагать вам отформатировать диск, и ждите завершения скрипта.
По поводу того, что будет, если один из дисков пула отвалится. Я пытался просто отключать SSD на выключенном компьютере и, к сожалению, до тех пор пока я его не присоединил SSD обратно и не перезагрузил компьютер, локальный диск не был виден в системе (думал может хотя бы данные, которые были на HDD отображаться будут, но нет).
А что там по скорости?
Автор репозитория указал следующие скорости при тестировании системы:
Также интересным мне показалось сравнение из этого видео на youtube.
Я сам не производил тестирования на чтение, но сравнивал скорость записи на чистый 2 Тб HDD Seagate BarraCuda 7200 rpm и 256 MB cache, и tier storage space из этого же HDD диска и SSD Crucial BX500 на 240 Гб.
При копировании больших файлов (установленный stalker anomaly, который почти полностью состоит из больших файлов .db размером примерно в 1 Гб) storage tier изначально копировал на скорости чуть более 400 Мб/сек, но затем, скорость копирования опускалась до 110 Мб/сек, что даже меньше чем скорость записи на HDD без storage tier (160 Мб/сек на тех же файлах).
К сожалению, в тот момент когда я производил тесты я не думал что буду писать статью и не догадался использовать snipping tool а просто делал фото на телефон.
Зато, при копировании порядка 10 Гб стандартных фоток (размер одной примерно 4-5 Мб) storage tier практически стабильно имел скорость порядка 260 Мб/сек против скачущих 180 Мб/сек у HDD.
Для того чтобы посмотреть какой процент данных на самом деле сейчас находится именно на SSD диске нужно в PowerShell с правами администратора запустить:
defrag D: /g /h /#
Наиболее интересными для нас тут являются параметры Percent of total I/Os serviced from the Performance tier - процент данных, которые при чтении были считаны именно с SSD. Также в таблице можно увидеть зависимость процента данных, которые будут взяты с высокопроизводительного накопителя от минимальной требуемой емкости SSD диска.
Для создания задачи автоматической оптимизации используется команда
Get-ScheduledTask -TaskName "Storage Tiers Optimization" | Start-ScheduledTask
Модификация скрипта
После произведенных тестов мне захотелось изменить несколько вещей. Первое - отдельно изменять процент неиспользуемого места на дисках, так как даже 1 процент от 2 Тб диска это 20 Гб. (объяснение почему нельзя использовать весь диск можно найти тут). По итогу экспериментальным путем при моих параметрах удалось добиться всего 0.13 процента неиспользуемого места на жестком диске.
Во-вторых, я пытался изменить размер параметра WriteCacheSize для увеличения скорости записи данных на tiered storage, но к сожалению даже установив размер в 20 Гб, скорость записи совершенно не отличалась от дефолтного параметра AutoWriteCacheSize (при котором размер WriteCacheSize равен 1 Гб).
Также я нашел информацию, что можно использовать параметр представленный ниже для увеличения скорости, но это может быть небезопасно с точки зрения хранения данных.
Set-StoragePool -FriendlyName "SSHD Storage Pool" -IsPowerProtected $True
Все мои изменения для удобства я залил в свой репозиторий на github.
Выводы
Как я уже отметил выше, не стоит хранить важные данные, если вы используете схожую с моей конфигурацию 1 SSD 1 HDD (без использования Mirroring). Но для хранения не особо нужных тестовых виртуальных машин, игр, фильмов, и другой локальной файловой помойки такое решение подходит отлично. Загрузка игр заметно ускоряется, и обычно со второго запуска скорость на глаз не отличима от запуска с SSD.