08 февраля, 2012

tmpfs vs ramfs

Такая картина ждала меня, на неожиданно пропавшем из эфира сервере:

Kernel panic - not syncing: Out of memory and no killable processes...

После перезагрузки в истори команд нашлась строчка: «mount -t ramfs -o size=256m ramfs /media/ramdisk/». На разделе в памяти размещались данные web-приложения. Интересно, согласно man mount у ramfs нет опции size, точнее у неё вообще нет опций. Действительно:

root@server:~# mount -t ramfs -o size=1m ramfs /media/ramdisk/
root@server:~# dd if=/dev/urandom of=/media/ramdisk/test bs=1024K count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 1.58535 s, 6.6 MB/s
root@baku:~# ls -lh /media/ramdisk/
total 10M
-rw-r--r-- 1 root root 10M Feb  8 18:35 123

ramfs проглатывает любые опции, что может ввести в заблуждение невнимательного администратора. На самом деле ramfs никак не ограничивает размер данных, который вы пытаетесь в неё поместить. Если размер данных достигнет размера оперативной памяти, то на экране вас будет ждать сообщение «Kernel panic - not syncing: Out of memory and no killable processes...» Даже если на компьютере достаточно swap'а, ramfs не будет его использовать.

С tmpfs таких проблем не возникнет. Если опция size, то она считается равной половине объёма оперативной памяти.

root@server:~# mount -t tmpfs -o size=1m ramfs /media/ramdisk/
root@server:~# dd if=/dev/urandom of=/media/ramdisk/123 bs=1024K count=10
dd: writing `/media/ramdisk/123': No space left on device
1+0 records in
0+0 records out
1040384 bytes (1.0 MB) copied, 0.160041 s, 6.5 MB/s

В общем, ramfs стоит использовать только если критично расположение данных именно в памяти (tmpfs может уходить в swap) и размер файлов находится под жестким контролем. В остальных случаях в качестве «быстрого раздела» лучше использовать tmpfs.

В Debian из коробки есть 2 раздела с tmpfs: /lib/init/rw и /dev/shm. Первый используется init-скриптами, второй доступен всем пользователям, является аналогом /tmp. По дефолту размер этих разделов равняется половине оперативной памяти, он может быть изменён с помощью переменных TMPFS_SIZE и SHM_SIZE в файле /etc/default/tmpfs. Первая переменная регулирует размер /lib/init/rw. Размер /dev/shm определяется переменной SHM_SIZE, если она не задана будет использована TMPFS_SIZE, если не задана и она - размер будет равным половине оперативной памяти.

1 комментарий:

  1. Приветствую.
    Хорошую идею подкинул для статьи.
    Спасибо.

    ОтветитьУдалить