Коротенькая памятка о ramfs и tmpfs

Аватар пользователя Алексей

В этой коротенькой заметке мне хотелось бы рассказать о незаслуженно неиспользуемой возможности *nix систем, как использование оперативной памяти в качестве хранилища данных. Опытным администраторам я ничего нового не открою, конечно же, но кому-то, я надеюсь, эта статья поможет решить проблему излишней нагрузки на диск.

Хочу сразу предупредить, что данные, размещённые в оперативной памяти ВСЕГДА УНИЧТОЖАЮТСЯ при перезагрузке сервера и хранить там важную информацию (без дублирования) ни в коем случае нельзя.


RAMFS Random Access Memory Filing System
TMPFS Temporary File System / Temporary File Storage

Файловые системы RAMFS и TMPFS предназначены для того, чтобы использовать часть физической памяти сервера как обычный дисковый раздел, в котором можно сохранять данные (чтение и запись). Поскольку данные размещены в памяти, то чтение или запись происходят во много раз быстрее, чем с обычного HDD диска.

Процесс монтирования файловых систем RAMFS и TMPFS практически одинаков на всех современных дистрибутивах Linux. Я буду приводить примеры на основании RHEL / CentOS, но в остальных дистрибутивах они так же должны работать.

# mount -t tmpfs -o size=300m tmpfs /tmp/phpsession
Этой нехитрой командой мы каталог, в котором хранятся сессии PHP (в моей конфигурации сервера), разместили в оперативной памяти и задали максимальный размер хранимых данных в 300 Мб, чем немного (в зависимости от загруженности сервера скорее всего и много) разгрузили дисковую подсистему.

Для RAMFS команда монтирования практически ничем не отличается:
# mount -t ramfs -o size=300m ramfs /tmp//ChatRam

Не забудьте, до монтирования Вам нужно создать каталог командой mkdir.
Например:
# mkdir /tmp/phpsession

При всей своей схожести RAMFS и TMPFS имеют и достаточно существенные различия.
Размер RAMFS увеличивается по мере поступления данных. Например, Ваш сервер имеет объём памяти 2 Gb и Вы выделили 256 Mb для RAMFS. Процесс который пишет данные обязан контролировать размер данных, так как при превышении размера в 256 Mb система не остановит Вас и Вы продолжите писать в память данные до тех пор, пока вся оперативная память не будет испчерпана и сервер не упадёт из-за нехватки оперативной памяти.
Поведение TMPFS более похоже на поведение привычного нам жёсткого диска. Размер превышен никогда не будет и увидеть подобное сообщение "No space left on device" не составит труда.

Но есть одно маленькое но. В отличии от TMPFS, RAMFS никогда не может быть вымещена в swap. И в этом есть свой плюс, так как память в swap мало чем отличается от жёсткого диска.

Хочу ещё раз напомнить, что RAMFS и TMPFS размещают данные в оперативной памяти и в случае перезагрузки или падения сервера все данные будут утеряны. Если Вы собираетесь хранить там достаточно важную информацию, то озаботьтесь синхронизацией данных на жёсткий диск. Например используя rsync по расписанию.

PS. Просмотр смонтированных устройств (разделов) и размонтирование.
Просмотреть смонтированные устройства/диски/каталоги можно командой
# mount

Размонтировать можно командой umount:
# umount /tmp/ChatRam

Tags: 

2 Comments

tmpfs хорошая вещь, но при

tmpfs хорошая вещь, но при паре миллионов сессий (и flat модели хранения файлов сессий, конечно) ext4 просто захлёбывается на операциях просмотра каталога. На вполне умеренно нагруженном хостинге load average доходит до 50-70... И совершенно неважно в данном случае, на диске файловая система или в памяти.
Хранение сессий в memcached вполне спасает, хотя и тут есть пара не сразу очевидных моментов ;)

Я не думаю, что

человек, у которого есть нагрузка в пару миллионов сессий будет читать этот минигайд ;о)