Настройка и использование ramfs и tmpfs

ramdisk_ubuntuРешил написать маленькую статью о ramfs и tmpfs. Если у вас есть сервера с нормальным количеством RAM и нужно увеличить скорость чтения и записи динамичного контента (в моем случае – это кэширование видео чанков и вообще кэш), это именно то, что вам надо.

Настройка и тест ramfs

Файловая система ramfs использует столько оперативной памяти, сколько позволит система. Если вся оперативка закончилась, а файлы продолжают литься – системе придет конец. Даже если будет указан максимальный размер при монтировании – никаких уведомлений вы не получите если этот лимит будет превышен, память просто будет таять.
Приступаем к практике. Для начала создадим папку и смонтируем ramfs раздел.

root@ubuntu:~# mkdir /mnt/ramfs-folder
root@ubuntu:~# mount -t ramfs ramfs /mnt/ramfs-folder/

Чтобы проверить, где у нас смонтировано ramfs разделы нужно использовать команду mount, так как df ничего не покажет.

root@ubuntu:~# mount -l | tail -1
ramfs on /mnt/ramfs-folder type ramfs (rw)

root@ubuntu:~# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1        7608792 1793796   5405448  25% /
udev              240964       4    240960   1% /dev
tmpfs              50108     292     49816   1% /run
none                5120       0      5120   0% /run/lock
none              250520       0    250520   0% /run/shm

Теперь протестируем скорость записи и чтения. У меня есть файлы по 200М каждый и 489М RAM. Т.е. если скопируем один файл в папку /mnt/ramfs-folder – он попадёт в RAM, а именно в страничный кэш(используется при операциях чтения).

root@ubuntu:~# ls -lh
total 601M
-rw-r--r-- 1 root root 200M May  7 20:45 file1
-rw-r--r-- 1 root root 200M May  7 20:04 file2
-rw-r--r-- 1 root root 200M May  7 20:04 file3

root@ubuntu:~# free -m
             total       used       free     shared    buffers     cached
Mem:           489        276        212          0          4        218
-/+ buffers/cache:         53        436
Swap:          509          0        509

root@ubuntu:~# cp file1 /mnt/ramfs-folder/

root@ubuntu:~# free -m
             total       used       free     shared    buffers     cached
Mem:           489        476         12          0          4        418
-/+ buffers/cache:         53        436
Swap:          509          0        509
 

Как видим, теперь 200М попали в RAM, теперь можно сравнить скорость чтения и записи файлов с диска и с ramfs.

root@ubuntu:~# time cat file1 > /dev/null

real    0m2.925s
user    0m0.000s
sys     0m0.193s
root@ubuntu:~# time cat /mnt/ramfs-folder/file1 > /dev/null

real    0m0.176s
user    0m0.000s
sys     0m0.063s

root@ubuntu:~# dd if=/dev/urandom of=/mnt/ramfs-folder/file4 bs=200M count=1
1+0 records in
1+0 records out
209715200 bytes (210 MB) copied, 21.9599 s, 9.5 MB/s

root@ubuntu:~# dd if=/dev/urandom of=file4 bs=200M count=1
1+0 records in
1+0 records out
209715200 bytes (210 MB) copied, 30.7127 s, 6.8 MB/s

Ну и на последок проверим что будет, если в ramfs папку залить файлов больше чем доступно RAM.

1

Как видно, закончилась память и теперь системе поможет только reboot. Чтобы таких ситуаций не возникло, нужно настроить мониторинг размера ramfs.

Настройка и тест tmpfs

Данная файловая система имеет заранее установленный фиксированный размер и она может размещаться в RAM и swap памяти. Если вся оперативка закончилась, а файлы продолжают литься – будет использоваться swap и уже после того, как swap закончиться системе придет конец. При монтировании нужно указывать желаемый размер файловой системы и если указанный лимит будет привешен – система выдаст соответствующее сообщение.
Приступаем к практике. Для начала создадим папку и смонтируем tmpfs раздел размером 600М.

root@ubuntu:~# mkdir /mnt/tmpfs-folder
root@ubuntu:~# mount -t tmpfs -o size=600M tmpfs /mnt/tmpfs-folder/
root@ubuntu:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       7.3G  2.3G  4.6G  34% /
udev            236M  4.0K  236M   1% /dev
tmpfs            49M  292K   49M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            245M     0  245M   0% /run/shm
tmpfs           600M     0  600M   0% /mnt/tmpfs-folder

В данном случае df покажет смонтированную tmpfs файловую систему.
Напомню, что у нас есть файлы по 200М каждый, 489М RAM и 509М swap. Т.е. если скопируем файл в папку /mnt/tmpfs-folder – он попадёт в RAM, а если RAM будет забит, но лимит не превышен – мы попадем в swap. Проверяем.

root@ubuntu:~# ls -lh
total 1.2G
-rw-r--r-- 1 root root 200M May  7 20:45 file1
-rw-r--r-- 1 root root 200M May  7 20:04 file2
-rw-r--r-- 1 root root 200M May  7 20:04 file3
-rw-r--r-- 1 root root 200M May  7 21:37 file4
-rw-r--r-- 1 root root 200M May  7 22:07 file5
-rw-r--r-- 1 root root 200M May  7 22:08 file6

root@ubuntu:~# free -m
             total       used       free     shared    buffers     cached
Mem:           489        105        383          0         10         42
-/+ buffers/cache:         52        436
Swap:          509          0        509

root@ubuntu:~# cp -v file* /mnt/tmpfs-folder/
`file1' -> `/mnt/tmpfs-folder/file1'
`file2' -> `/mnt/tmpfs-folder/file2'
`file3' -> `/mnt/tmpfs-folder/file3'
`file4' -> `/mnt/tmpfs-folder/file4'
cp: writing `/mnt/tmpfs-folder/file4': No space left on device
cp: failed to extend `/mnt/tmpfs-folder/file4': No space left on device
`file5' -> `/mnt/tmpfs-folder/file5'
cp: writing `/mnt/tmpfs-folder/file5': No space left on device
cp: failed to extend `/mnt/tmpfs-folder/file5': No space left on device
`file6' -> `/mnt/tmpfs-folder/file6'
cp: writing `/mnt/tmpfs-folder/file6': No space left on device
cp: failed to extend `/mnt/tmpfs-folder/file6': No space left on device

root@ubuntu:~# free -m
             total       used       free     shared    buffers     cached
Mem:           489        464         24          0          0        353
-/+ buffers/cache:        110        378
Swap:          509        249        260

Как видим, когда закончилось зарезервированное место в tmpfs мы получили «No space left on device» сообщение. Когда закончился RAM, мы попали в swap.
Теперь протестируем скорость записи и чтения.

root@ubuntu:~# time cat file2 > /dev/null

real    0m2.840s
user    0m0.000s
sys     0m0.284s

root@ubuntu:~# time cat /mnt/tmpfs-folder/file1 > /dev/null

real    0m0.108s
user    0m0.005s
sys     0m0.041s

root@ubuntu:~# dd if=/dev/urandom of=/mnt/tmpfs-folder/file4 bs=200M count=1
1+0 records in
1+0 records out
209715200 bytes (210 MB) copied, 24.8063 s, 8.5 MB/s

root@ubuntu:~# dd if=/dev/urandom of=file9 bs=200M count=1
1+0 records in
1+0 records out
209715200 bytes (210 MB) copied, 29.7212 s, 7.6 MB/s

 

Ну и на последок проверим что будет, если в tmpfs папку залить файлов больше чем доступно RAM и swap вместе взятых – картина та же, сначала закончиться RAM, потом swap, потом нужен будет reboot. По этому нужно мониторить и tmpfs и swap или ставить размер tmpfs меньшим чем размер RAM-a.

Заключение

Обе файловые системы ramfs и tmpfs являются энергозависимыми(volatile). Иными словами, если в системе произойдет сбой, она будет перезагружена или будет выключена по какой-либо причине, данные, хранящиеся в любой из этих файловых систем будут уничтожены. По этому, не советую здесь хранить важных данных.
В нашей системе видостриминга используется ramfs для кэширования VOD контента размер которого контролируется мониторинг системой.

Автор: admin, 8 мая 2015
Рубрики: Linux
Метки:

Написать комментарий

Последние статьи

Яндекс.Метрика
?>