Powered By Blogger

Saturday, February 13, 2010

Когда память работает на Вас: использование ramfs и tmpfs

Если производительность операций дискового ввода/вывода не соответствует Вашим нуждам, то наиболее дешёвое и наименее затратное по времени решение - это разместить очень часто используемые файлы в оперативной памяти (RAM). Чтение и запись в память значительно быстрее, чем соответствующие операции на дисковой файловой системе. Операции дискового ввода/вывода, как те, что используются при работе с базами данных, позволяют улучшить производительность, если перенести данные в файловую систему, находящуюся в оперативной памяти.

Почему именно оперативная память? Оперативная память быстра. Она работает на скоростях доступа порядка наносекунд. Оперативная память (RAM) не вращается. Дисковые накопители содержат механизмы, которые находятся в движении. Это означает, что операции чтения и записи, требующие поиска, значительно медленнее нежели работа с RAM. Для примера, память DDR3 позволяет перемещать данные со скоростью выше 10ГБ/с. Даже самый быстрый жёсткий диск фирмы Hitachi - UltraStar, работающий на скорости 15000 об/м работает с данными в среднем на скоростях от 119МБ/с до 198МБ/с, а пиковая скорость - максимум 600МБ/с. RAM имеет большее среднее время безотказной работы. Так как RAM не содержит механических частей, то её показатель наработки на отказ гораздо лучше, чем у дисковых накопителей.

В качестве файловых систем, работающих в RAM, в Вашем распоряжении есть tmpfs и ramfs. Давайте посмотрим, как можно настроить файловую систему в RAM и попутно избежать некоторых общих проблем при использовании RAM-ФС.

ramfs

tmpfs и ramfs работают по-разному. ramfs может использовать только системную память, данные о ней не отображаются по команде df -h, она также не имеет ограничений по размеру и не выдаёт сообщений об ошибках при установке опциональных ограничений (т.е., ограничение размера файловой системы, задаваемое при монтировании, как показано ниже - перев.). То обстоятельство, что ramfs не имеет ограничений по размеру и Вы никогда не увидите предупреждающих сообщений при установке опциональных ограничений может показаться противоречивым, но на самом деле это не так. Вы можете ограничить размер файловой системы ramfs, но Вы не получите предупреждения при превышении этого ограничения, равно как сама система не будет делать ничего, чтобы предотвратить превышение ограничения.

Для примера синтаксис команды монтирования новой файловой системы таков:

# mount -t fs_type device mount_dir

Синтаксис команды mount для настройки RAM-ФС размером в 200МБ для БД в каталоге /opt/data будет таким:

# mount -t ramfs -o size=200m ramfs /opt/data

Как говорилось ранее, эта ФС не будет отображена по команде df -h. Единственный способ обнаружить её - команда mount.

# mount

/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
ramfs on /opt/data type ramfs (rw,size=200m)

Если Вы попытаетесь записать на подмонтированную таким образом ФС более 200МБ данных, запись продолжится без каких-либо предупреждений со стороны системы. Предел в 200МБ является избыточным и никак не влияет на реальный размер ФС или на то, сколько данных Вы можете на неё записать. Это является главным недостатком ramfs.

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

Небольшое замечание по поводу ramfs: хоть формально при монтировании ramfs Вы можете указать размер файловой системы, Вам необходимо следить за её заполненностью. И вот почему: размер ramfs увеличивается динамически и система не предотвратит переполнение ФС, как было сказано. Допустим, у Вас 2Гб оперативной памяти, у Вас на /tmp/ram подмонтирована ramfs на 1Гб. Когда данные на Вашей ramfs перевалят за 1Гб, Вы всё ещё сможете дописывать что-то новое в /tmp/ram. Система будет молча выполнять всё, что Вы ей скажете. Однако, когда объём данных превысит объём физической памяти (2Гб в нашем случае), система может зависнуть, т.к. в RAM больше физически нет места для хранения данных. Имейте это ввиду и считайте, что Вас предупредили.

tmpfs

Для операций с реальными данными наиболее предпочтительным выбором является tmpfs, нежели ramfs. В отличие от последней, tmpfs имеет фиксированный размер, данные, хранимые на ней, могут размещаться как в системной памяти, так и в разделе подкачки. При превышении размера ФС система выдаёт сообщения об ошибке превышения размера ФС. Синтаксис монтирования tmpfs похож на уже виденный нами:

# mount -t tmpfs -o size=200mb tmpfs /opt/data

df -h показывает сведения о подмонтированной tmpfs так же, как о любой другой реальной ФС:

# df -h

Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      360G  225G  117G  66% /
/dev/sda1              99M   25M   70M  27% /boot
tmpfs                 200M     0  200M   0% /opt/data

mount показывает следующую информацию:

# mount

/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
tmpfs on /opt/data type tmpfs (rw,size=200m)

Когда объём записываемых на ФС данных превышает размер самой tmpfs, система выдаёт сообщение "No space left on device", предупреждая Вас, что ФС заполнена. tmpfs во всём схожа с обычными дисковыми ФС, за исключением того, что она непостоянна. Вы можете добавить в /etc/fstab соответствующую строку, чтобы tmpfs монтировалась после каждой перезагрузки.

Следует иметь ввиду, что ramfs и tmpfs - непостоянные ФС, которые находятся в памяти. Это значит, что при крахе системы, перезагрузке или останове - не важно по какой причине, все данные, хранящиеся на RAM-ФС, будут безвозвратно утеряны. Поэтому используя tmpfs Вам следует позаботиться о том, чтобы периодически делать дампы данных с tmpfs на постоянный носитель. Помните пословицу: "Безопасный, быстрый, дешёвый; выбирай любые два". Использование RAM-ФС - это быстрое и недорогое решение, но небезопасное.

Оригинал статьи на английском здесь.

ПОСЕТИТЕЛИ

free counters