RAM диск – это виртуальный диск, созданный в свободной области оперативной памяти, который воспринимается операционной системой как отдельный физический диск. За счет, того, что RAM диск хранится в быстрой оперативной памяти, все операции чтения/записи с такого диска выполняются почти мгновенно, даже быстрее, чем при использовании SSD накопителя (у самых производительных SSD скорость передачи данных сейчас составляет около 560МБ/с, в то время как у памяти DDR4 — 12000-25000МБ/с).
Использование RAM диска целесообразно в системах с избытком оперативной памяти. На таком RAM диске можно размещать кэш и временные файлы приложений/системы, временные базы SQL, тем самым можно добиться существенного увеличения производительности приложений.
В операционной системе Windows отсутствуют встроенные средства создания RAM-дисков, поэтому в этих целях приходится использовать сторонние программы (AMD RAMDisk, ImDisk, PassMark OSFMount, StarWind RAM Disk и т.д.).
Однако в Windows Server вы можете создать RAM диск и без использования сторонних программ. Для этого можно воспользоваться драйвером iSCSI.
В первую очередь на сервере нужно установить компонент iSCSI Target Server (входит в состав роли File and Storage Services).
Если у вас включен файервол Windows, необходимо разрешить трафик для службы iSCSI Service.
Чтобы разрешить трафик на loopback интерфейс для iSCSI, нужно в ветке реестра HKLM\Software\Microsoft\iSCSI Target изменить значение DWORD параметра AllowLoopBack на 1. Можно изменить ключ реестра из PowerShell одной командой:
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\iSCSI Target' -Name AllowLoopBack -Value 1
Теперь откройте консоль PowerShell и создайте виртуальный RAM диск размером 5 Гб командой:
New-IscsiVirtualDisk -Path "ramdisk:testRAM.vhdx" -Size 5GB
Теперь нужно создать iSCSI таргет:
New-IscsiServerTarget -TargetName targetRAMDisk -InitiatorIds @("IPAddress:10.1.1.200")
Подключим RAM диск в созданный iSCSI таргет
Add-IscsiVirtualDiskTargetMapping -TargetName targetRAMDisk -DevicePath "ramdisk:testRAM.vhdx"
Теперь нужно запустить консоль iSCSI Initiator через Server Manager
На вкладке Targets укажите IP адрес вашего сервера, нажмите Quick Connect и подключите ваш iSCSI таргет.
Теперь откройте консоль управления дисками и проверьте, что у вас появился новый диск размером 5 Гб. Это и есть тот самый RAM диск. Инициализируйте, разметьте и отформатируйте данный диск. Назначьте ему букву диска.
Теперь вы можете перенести необходимые файлы на RAM диск и перенастроить ПО на использование данного диска.
После перезагрузки сервера RAM диск удаляется (вместе со всем содержимым) и его нужно пересоздавать заново.
В некоторых сторонних программах для создания RAM дисков есть возможность сохранения данных RAM диска в файл на жестком диске. После перезагрузки системы данные извлекаются и помещаются на RAM диск.
Круто!!!!
А можно полностью автоматизировать, исключив работу с GUI ?
Чтобы можно было монтировать RAM диск при запуске через PS….
Подключить ISCSI Target можно так
Get-IscsiTarget | Connect-IscsiTarget
Инициализировать дик и назначить ему букву тоже можно через PowerShell:
Get-Disk | Where partitionstyle -eq 'raw' | Initialize-Disk -PartitionStyle MBR -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel "disk2" -Confirm:$false
Соберите это все в один PS и оттестируйте. Если что получится — поделитесь результатом 🙂
Еще примеры использования командлетов PowerShell для управления локальными дисками: https://winitpro.ru/index.php/2019/01/10/powershell-upravlenie-diskami-i-razdelami/
Благодарю за полезную информацию. Запутался немного с адресом New-IscsiServerTarget -TargetName targetRAMDisk -InitiatorIds @(«IPAddress:10.1.1.200»), пока не понял, что вместо 10.1.1.200 нужно подставит адрес сервера.
есть ли какие-то ньюансы при создании такого RAM диска по описанному сценарию в кластере из двух серверов с общей корзиной дисков, где поднят CSV?
Под какие задачи вы планируете RAM диска в кластере? Он будет независимым на каждой из нод….
под tempdb для SQL сервера
Добрый день!
Слетает диск при ребуте. Причем в инициаторе iSCSI конечный объект остается подключен, вот по кнопке «Устройства» — пусто. Что я делаю не так?
Заранее спасибо за ответ.
В статье указано, что такой RAM диск удаляется при перезегрузке. Если хотите его создавать и монтировать каждый раз при загрузке сервера, нужно из указанных команд реализовать powershell скрипт, который запускается при загрузке ОС.
$env:HostIP = (
Get-NetIPConfiguration |
Where-Object {
$_.IPv4DefaultGateway -ne $null -and
$_.NetAdapter.Status -ne «Disconnected»
}
).IPv4Address.IPAddress
if (Test-Path «Z:») {
Remove-IscsiVirtualDiskTargetMapping -TargetName targetRAMDisk -DevicePath «ramdisk:RAMDRIVE.vhdx»
Remove-IscsiServerTarget -TargetName targetRAMDisk
Remove-IscsiVirtualDisk -Path «ramdisk:RAMDRIVE.vhdx»
}
New-IscsiVirtualDisk -Path «ramdisk:RAMDRIVE.vhdx» -Size 48Gb
New-IscsiServerTarget -TargetName targetRAMDisk -InitiatorIds @(«IPAddress:$env:HostIP»)
Add-IscsiVirtualDiskTargetMapping -TargetName targetRAMDisk -DevicePath «ramdisk:RAMDRIVE.vhdx»
New-IscsiTargetPortal -TargetPortalAddress «$env:HostIP» -TargetPortalPortNumber 3260 -InitiatorPortalAddress «$env:HostIP»
Connect-IscsiTarget -NodeAddress iqn.1991-05.com.microsoft:$env:computername-targetramdisk-target
Get-Disk | Where partitionstyle -eq ‘raw’ | Initialize-Disk -PartitionStyle MBR -PassThru | New-Partition -DriveLetter Z -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel «RAMDRIVE» -Confirm:$false
Винда, правда, 2019.
А на обычной десятке такое нельзя провернуть, только через сторонние утилиты?
Да, можно. Есть куча сторонних утилит: ImDisk, StarWind RAM Disk, OSFMount
Спасибо за ответ, но я имел ввиду нельзя на обычной 10-ке поднять таргет сервер без использвания сторонних утилит? Что-то погуглил, ничего не нашел, частенько вопросы решаются через установку нужных компонентов с помощью PS, а тут гугл молчит. Сейчас воспользовался Asus ROG ramdisk, он даже умеет синхронизировать данные в какой-нить каталог, хотя не тестил еще. Диск создается, файлы положить, прочитать можно, скорости по 16-17к на райзене 5 3600Х
Еще один интересный момент, если пытаться разместить БД MS SQL на таком диске то возникает ошибка(MSSQL понимает, что диск виртуальный и просит разместить ее на томе, где можно получить размер сектора), но возникает только если пытаться разместить БД в директории, если просто в корень бросить, то все норм.