суббота, 13 декабря 2008 г.

RAM-диски в Solaris, часть I

RAM-Диски в Solaris - вещь достаточно известная. Например, всем известен факт, что установка Solaris происходит через посредство RAM-диска.

Для непосвященных цитирую фрагмент man:

man ramdisk

Devices ramdisk(7D)

NAME
ramdisk - RAM disk device driver

SYNOPSIS
ramdisk@0:diskname

DESCRIPTION
The ramdisk driver supports numerous ramdisk devices that
are created by the system during the boot process (see
boot(1M)) or during normal system operation (see
ramdiskadm(1M) for more information).

DEVICE SPECIAL FILES
Each ramdisk can be accessed either as a block device or as
a raw device. When accessed as a block device, the normal
buffering mechanism is used when reading from and
writing to the device, without regard to physical disk
records. Accessing the ramdisk as a raw device enables
direct transmission between the disk and the read or write

[дальше поскипано, читайте мануалы сами ;)]

Оппоненты могут заметить, что в конце мануала прямо сказано:

A ramdisk may not be the best possible use of system memory.
Accordingly, use ramdisks only when absolutely necessary.

Но, к примеру - оперативная память сейчас стоит практически как грязь, есть машины с изобилием памяти - не редкость уже сервера начального уровня с 32 Гб и более RAM.

Посему, в некоторых случаях, к примеру, можно и использовать такую штуку.

Как мы это делаем? "Всегда правой!" ;)

man ramdiskadm

System Administration Commands ramdiskadm(1M)

NAME
ramdiskadm - administer ramdisk pseudo device

SYNOPSIS
/usr/sbin/ramdiskadm -a name size [g | m | k | b]

/usr/sbin/ramdiskadm -d name

/usr/sbin/ramdiskadm

DESCRIPTION
The ramdiskadm command administers ramdisk(7D), the ramdisk
driver. Use ramdiskadm to create a new named ramdisk device,
delete an existing named ramdisk, or list information about
existing ramdisks.

Ramdisks created using ramdiskadm are not persistent across
reboots.

[дальше поскипано, читайте мануалы сами ;)]

Проверим?

Создадим диск:

root @ athena / # ramdiskadm -a ram1 512m
/dev/ramdisk/ram1

Сформатируем его в UFS:

root @ athena / # newfs /dev/ramdisk/ram1
/dev/rramdisk/ram1: Unable to find Media type. Proceeding with system determined parameters.
newfs: construct a new file system /dev/rramdisk/ram1: (y/n)? y
/dev/rramdisk/ram1: 1048200 sectors in 1747 cylinders of 1 tracks, 600 sectors
511.8MB in 110 cyl groups (16 c/g, 4.69MB/g, 2240 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
32, 9632, 19232, 28832, 38432, 48032, 57632, 67232, 76832, 86432,
960032, 969632, 979232, 988832, 998432, 1008032, 1017632, 1027232, 1036832,
1046432

Смонтируем и посмотрим:

root @ athena / # mount /dev/ramdisk/ram1 /mnt
root @ athena / # df -h /mnt
Filesystem size used avail capacity Mounted on
/dev/ramdisk/ram1 480M 1.0M 431M 1% /mnt

Поиграемся:

root @ athena / # mkfile 256m /mnt/file.ufs
root @ athena / # ls -al /mnt
total 262290
drwxr-xr-x 3 root root 512 Dec 13 14:32 .
drwxr-xr-x 31 root root 1024 Dec 13 13:33 ..
-rw------T 1 root root 268435456 Dec 13 14:32 file.ufs
drwx------ 2 root root 8192 Dec 13 14:30 lost+found

Что ж, весьма быстро создается файл. RAM есть RAM.

Посмотрим, что у нас в устройствах (платформа SPARC):

root @ athena / # ramdiskadm
Block Device Size Removable
/dev/ramdisk/root 89702400 No
/dev/ramdisk/ram1 536870912 Yes

Надо же, кроме removable ram-диска создан еще неудаляемый root-диск.

Попробуем посмотреть, что на нем:

root @ athena / # mount /dev/ramdisk/root /mnt

panic[cpu0]/thread=300013bf5a0: BAD TRAP: type=31 rp=2a100815140 addr=51002000 mmu_fsr=0

mount: trap type = 0x31
addr=0x51002000
pid=735, pc=0x126a8d0, sp=0x2a1008149e1, tstate=0x4480001607, context=0x415
g1-g7: 0, 0, 1, 0, 1, 0, 300013bf5a0

000002a100814e60 unix:die+9c (31, 2a100815140, 51002000, 0, 2a100814f20, c11ec000)
........

Опачки, паника. Упала система. Так, не трогаем больше. :) Спасибо, что хоть sync выполнила.

Ладно, пойдем на систему x86 тогда и там проведем второй опыт.

root @ ktulhu / # ramdiskadm -a ram1 512m
ramdiskadm: couldn't create ramdisk "ram1": Resource temporarily unavailable

Так, сколько хотим мы памяти не можем забирать. Не выделяется. Уменьшим размер:

root @ ktulhu / # ramdiskadm -a ram1 384m
/dev/ramdisk/ram1

Ради спортивного интереса создадим файловую систему другого типа:

root @ ktulhu / # zpool create rampool1 /dev/ramdisk/ram1
root @ ktulhu / # zfs list rampool1
NAME USED AVAIL REFER MOUNTPOINT
rampool1 91K 346M 1K /rampool1

Посмотрим тип и свойства файловой системы:

root @ ktulhu / # fstyp /dev/ramdisk/ram1
zfs
root @ ktulhu / # fstyp -v /dev/ramdisk/ram1
zfs
version=10
name='rampool1'
state=0
txg=4
pool_guid=6334748904190478592
hostid=114097444
hostname='ktulhu'
top_guid=4892403041050478913
guid=4892403041050478913
vdev_tree
type='disk'
id=0
guid=4892403041050478913
path='/dev/ramdisk/ram1'
phys_path='/pseudo/ramdisk@1024:ram1'
whole_disk=0
metaslab_array=14
metaslab_shift=21
ashift=9
asize=397934592
is_log=0

Замечательно, RAM-диск с ZFS!

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

Поиграемся теперь с ним:

root @ ktulhu / # ramdiskadm
Block Device Size Removable
/dev/ramdisk/ram1 402653184 Yes

Так, никаких дополнительных дисков на x86 нет.

root @ ktulhu / # mkfile -v 256m /rampool/file.zfs
/rampool/file.zfs 268435456 bytes

root @ ktulhu / # ls -al /rampool
total 262191
drwxr-xr-x 2 root root 3 Dec 13 14:48 .
drwxr-xr-x 30 root root 40 Dec 13 14:46 ..
-rw------T 1 root root 268435456 Dec 13 14:48 file.zfs

Очень быстро создается. ZFS и сама-то по себе очень шустрая, а в памяти просто беспредельно быстро файловые операции происходит (понятное дело, что до определенных пределов - но при объемах "сотни мегабайт" все хорошо ;)).

Окей, дабы не портить систему, удалим пул и подумаем:

root @ ktulhu / # zpool destroy rampool
root @ ktulhu / # zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 13.7G 59.2G 37.5K /rpool
rpool/ROOT 7.66G 59.2G 18K /rpool/ROOT
rpool/ROOT/zfsBE 7.66G 59.2G 7.66G /
rpool/dump 2.00G 59.2G 2.00G -
rpool/swap 4.00G 63.0G 138M -

Первое. Если использовать RAM-диски, возникает, например, желание создавать их автоматически, в момент загрузки системы. Скажем, с автоматическим копированием содержимого некоторых точек монтирования в память и с обратной записью на диск при shutdown. Это можно сделать сравнительно просто, написав несложный SMF-сервис. Причем можно будет легко делать RAM-диски как с UFS, так и с ZFS - и пользоваться всеми преимуществами последней.

Второе. Для чего это использовать? Это уже администратор пусть думает :). Ясное дело, что не для размещения Oracle redo logs. Но некоторые применения достаточно очевидны. Там, где нужна скорость доступа и типовые операции с файловыми системами.

Говоря простым языком - инструмент есть, он работает, он тривиален. А где его применить - уже сами решайте.