Решил написать маленькую статью о 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.
Как видно, закончилась память и теперь системе поможет только 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 контента размер которого контролируется мониторинг системой.