tmpfs

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:38, 18 января 2019.

tmpfs
Полное название Temporary File System
Варианты Содержится в оперативной памяти, а не в постоянной
Загрузочный Нет
Features
Прозрачное сжатие Нет
Транспорантное шифрование Нет
Копирование и запись Да
Другие
Операционная система Unix-подобные ОС

tmpfs — временное файловое хранилище во многих Unix-подобных ОС. Предназначена для монтирования файловой системы, но размещается в ОЗУ вместо ПЗУ. Подобная конструкция является RAM диском. Данная файловая система также предназначенная для быстрого и ненадёжного хранения временных данных.

Хорошо подходит для /tmp и массовой сборки пакетов/образов.

Создание

Предполагает наличие достаточного объёма виртуальной памяти (для активного использования рекомендуется RAM, а своп — желательно на отдельном диске).

Без опции size файловая система конфигурируется на объём, равный половине RAM (при этом эта часть не резервируется, а используется по мере надобности, так что дефолт вполне разумный). С ручным заданием size можно не очень стесняться, поскольку в худшем разе получим свопинг и No space left on device. group: [Источник 1]

В дистрибутивах ALT Linux 4.0 и выше /tmp по умолчанию размещается на tmpfs (с помощью pam_mktemp), поэтому может быть достаточно создать при установке (или добавить позже) своп необходимого[1] объёма, указать в /etc/fstab желаемый размер (size можно указать в %):

tmpfs /tmp tmpfs size=4g,nr_inodes=1m,nosuid 0 0

и перемонтировать ФС:

mount -o remount /tmp

Существует специально обученный пакет livecd-tmpfs, который постарается подобрать при загрузке подходящий размер tmpfs, исходя из доступной памяти и некоторых эвристик (либо конфигурационного файла).

При необходимости временно добавить свопа (например, для сборки крупного пакета) можно воспользоваться swap-файлами:

 dd if=/dev/zero of=/home/swap.img bs=1M count=1024
 chmod 600 /home/swap.img
 mkswap /home/swap.img
 swapon /home/swap.img
 swapon -s
 

ramfs и tmpfs

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

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

# 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 по расписанию.[Источник 2]

Tmpfs и VM

Давайте посмотрим на некоторые наиболее интересные свойства tmpfs. Как было отмечено выше, tmpfs может использовать и RAM, и swap. На первый взгляд, это может показаться не принципиальным, но tmpfs еще известна как файловая система в виртуальной памяти (virtual memory filesystem). При этом ядро Linux "понимает" ресурс "виртуальная память" именно как единое - целое RAM и swap-пространство. Подсистема VM ядра ассигнует эти ресурсы другим подсистемам и управляет этими ресурсами behind-the-scenes (прозрачно в фоне). При этом часто без ведома "подсистемы - заказчика" перемещает страницы опреративной памяти между собственно RAM и swap.

Файловая система tmpfs запрашивает страницы у подсистемы VM для хранения файлов. При этом сама tmpfs не знает, находятся ли эти страницы в swap или в RAM; это - "проблема" VM подсистемы. Исходя из этого, tmpfs знает лишь то, что она использует виртуальную память.

Это не блочное устройство.

В отличие от большинства файловых систем (например, ext3, ext2, XFS, JFS, ReiserFS) tmpfs не является "надстройкой" над блочным устройством. Поскольку tmpfs напрямую "встроена" в VM, ее можно монтировать сразу после создания командой:

# mount tmpfs /mnt/tmpfs -t tmpfs

После выполнения команды создается новую файловая система tmpfs, смонтированная в /mnt/tmpfs и готовая к использованию. Т.е. нет потребности в форматировании командой mkfs tmpfs. Сразу после команды mount файловая система доступна для использования и имеет тип tmpfs. Это отличается от Linux ramdisks; стандартный Linux ramdisks - block devices и требует форматирования перед размещением на нем файлов. Монтируй и используй!

Организация

Организовывается в виртуальной памяти (RAM+swap), поэтому:

  1. при отмонтировании, перезагрузке или выключении теряет содержимое полностью;
  2. не озадачивается долетанием данных до пластин в случае использования свопа на дисках — вследствие чего работает в разы быстрее настоящих ФС даже в случае активного использования свопа;
  3. размер tmpfs может превышать размер доступной RAM.

Семантика

Все данные в Tmpfs являются временными, в том смысле, что ни одного файла не будет создано на жёстком диске. После перезагрузки все данные, содержащиеся в Tmpfs, будут утеряны.

Память, используемая для Tmpfs, варьируется в размерах в зависимости от количества размещённых файлов в ней и может быть расширена за счёт swap. Многие Unix дистрибутивы используют Tmpfs по умолчанию для размещения /tmp или для разделения памяти. Это можно увидеть в выводе команды df, например:

 Filesystem            Size  Used Avail Use% Mounted on
 tmpfs                 256M  688K  256M   1%  /tmp

Преимущества tmpfs

Динамически изменяемый размер файловой системы

Размер файловой системы, которая монтируется к /mnt/tmpfs (особенно,в случае с disk-based файловыми системами) первоначально имеет очень мал, но, по мере копирования и создания файлов драйвер tmpfs ассигнует у VM дополнительную память, динамически увеличивая емкость. Справедливо и обратное, при удалении файлов из /mnt/tmpfs драйвер отдает освобождаемую память операционной системе. Большой плюс tmpfs в том, что используется ровно столько памяти, сколько требуется.group: [Источник 3]

Скорость

Другое преимущество tmpfs - ее скорость. Поскольку файловая система tmpfs постоянно загружена в оперативную память, операции записи - чтения происходят почти мгновенно. Даже если интенсивно используется swap, скорость все равно высокая (более того, перемещение в swap означает передачу ресурсов процессам, наиболее нуждающимся в памяти, что способствует повышению общей производительности). Итог - свойство динамически изменять размер и, при необходимости, сбрасываться в swap, дает возможность операционной системе более гибко распоряжаться ресурсами. Файловая система tmpfs прекрасная альтернатива традиционному RAM disk с позиции скорости.

Безинерционность

Говоря о безинертности, можно упомянуть как о плюсе, так о минус тоже, так как данные в tmpfs после перезагрузки будут потеряны (оперативная память энергозависима по своей природе. Даже после перезагрузки, сохранившись в "физической оперативной памяти", информация станет недоступной, так как таблицы виртуальной памяти будут инициализированы иначе). Фактически, tmpfs превосходный резервуар для хранения временных файлов. Традиционно для этих целей используется /tmp и некоторые части дерева /var. Есть даже опция - очищать /tmp при перезагрузке, на что тратится дополнительное время. В случае с tmpfs, такая "опция" - физическое свойство.

Недостатки tmpfs и уход от low VM conditions

Фактом является то, что tmpfs динамически растет и уменьшается. Каковы же последствия, если tmpfs файловая система разрастется так, что поглотит всю виртуальную память? Приемлемое решение еще не найдено. С ядром 2.4.4, произошло бы зависание. С ядром 2.4.6, подсистема VM имеет некоторую защиту, и авария не произойдет. Когда 2.4.6 почувствует точку, за которой ассигнование дополнительной памяти проблематично, дальнейшая запись будет невозможна в tmpfs filesystem. Сначала процессы в системе не смогут ассигновать дополнительную память; система станет уязвимой и непроизводительной. У суперпользователя есть время, чтобы предпринять шаги для выхода из low-VM condition.

Далее, ядро имеет встроенную last-ditch систему освобождения памяти при ее исчерпании; она находит процесс, который наиболее интенсивно потребляет VM ресурсы и уничтожает его. К сожалению, такое решение имеет неприятные последствия, особенно, если в истощении памяти виновата tmpfs. Сама tmpfs уничтожена быть не может, так как она - часть ядра, а не пользовательский процесс. Кроме того, специфика tmpfs такова, что для ядра не существует простого способа выяснить, какой именно процесс "затопляет" tmpfs. В таких случаях ядро по ошибке уничтожает самый большой VM-hog процесс, которым обычно является X server. Определить, что истинной причиной "падения" X было low-VM condition (tmpfs) крайне сложно.

Решение для Low VM

tmpfs позволяет указать максимальный размер файловой системы при ее монтировании или перемонтировании. Фактически, с ядром 2.4.6 и util-linux-2.11g, такие параметры можно установить только при монтировании, но не перемонтировании (в следующих версиях ядер это может быть уже решено). Установка оптимального лимита на размер tmpfs зависит от ресурсов и режима использования Linux box; идея в том, чтобы предотвратить возможность со стороны tmpfs filesystem истощения ресурсов виртуальной памяти и предотвратить low-VM conditions. Хороший способ найти приемлемый tmpfs upper-bound состоит в использовании top монитора для наблюдения за swap в момент пиковых нагрузок. Установить tmpfs upper-bound немного меньше, чем сумма свободной swap и RAM при пиковой нагрузке.

Создать tmpfs с лимитом на максимальный размер достаточно просто. Например:

# mount tmpfs /dev/shm -t tmpfs -o size=32m

В этом примере монтирование новой tmpfs происходит не к точке /mnt/tmpfs, а к специально созданному /dev/shm. Это каталог, который является официальной точкой монтирования ("official" mountpoint) для tmpfs. Если вы используете devfs, этот каталог будет создан автоматически.

Если требуется ограничить размер файловой системы в оперативной памяти 512 КБ или 1 GB, можно соответственно указать size=512k или size=1g. В дополнение к ограничению размера можно лимитировать число inodes (filesystem objects) через параметр nr_inodes=x. Где x - целое число, возможно, с суффиксом k, m или g для обозначения тысяч, миллионов или миллиардов inodes.

Для автоматического монтирования при загрузке системы допустимо сделать запись в файле /etc/fstab. Например:

tmpfs   /dev/shm        tmpfs   size=32m        0       0

Использование tmpfs

Все, что требуется для использования tmpfs - это ядро 2.4, скомпилированное с поддержкой "Virtual memory file system support (former shm fs)" enabled; эта опция находится в подразделе "File systems" (make menuconfig). Если на вашей системе такое ядро, уже можно монтировать tmpfs filesystems. На предкомпилированных ядрах дистрибутивов это, как правило, сделано всегда. Можно не пользоваться самой tmpfs, но такая поддержка требуется для использования POSIX shared memory. Заметим, для использования System V shared memory поддержка tmpfs в ядре не требуется. POSIX shared memory пока не получила широкого применения.group: [Источник 4]

Реализации

SunOS/Solaris

SunOS 4 включала ранние разработки Tmpfs; она впервые появилась в SunOS 4.0 в конце 1987, вместе с новым ортогональным управлением адресным пространством, что позволяет разместить любой объект в памяти.[Источник 5][Источник 6]

В Solaris /tmp размещалась в Tmpfs, что стало стандартом в Solaris 2.1, вышедшей в ноябре 1994. Вывод команды df в Solaris показывал swap как файловую систему любого Tmpfs раздела:

  # df -k
  Filesystem  kbytes  used   avail capacity  Mounted on
  swap        601592     0  601592     0%    /tmp/test

Linux

Tmpfs стал поддерживаться Linux с версии 2.4. [Источник 7] Статья, описывающая реализации в Linux Tmpfs (так же известная как shmfs) отличается от Linux RAM диска динамическим выделением памяти и перемещением неиспользуемых страниц в swap] RAMfs, наоборот, не использует swap (это может быть как преимуществом, так и недостатком). Вдобавок, MFS и некоторые старые версии RAMfs, не изменяли свой размер динамически, а оставались того размера, как были примонтированы.

Использование Tmpfs, например:

mount -t tmpfs -o size=1G,nr_inodes=10k,mode=0700 tmpfs /space

которая будет возрастать до 1 GiB с 10240 инодами в ОЗУ/swap и доступная только владельцу директории /space. Максимальный размер файловой системы может быть изменён "на лету", например:

mount -o remount,size=2G /space

В Tmpfs могут быть размещены любые директории, хранящие временные данные, удаляемые при перезагрузке системы: /var/lock, /var/run, /tmp и др. Кроме того, для уменьшения количества дисковых операций (в целях максимального повышения производительности системы или экономии ресурса твердотельных накопителей) в Tmpfs иногда размещают директории, которые обычно хранят данные между перезагрузками, например, /var/tmp (эта директория нередко очищается, хотя рекомендовано этого не делать или директории кэширования некоторых программ (интернет-браузеров).[Источник 8]

BSD

Tmpfs была реализована в NetBSD версии 4.0, 10 сентября 2005 [Источник 9]

В FreeBSD 7.0 появилась портированная из NetBSD Tmpfs.[Источник 10] В DragonFly BSD, с версии 2.5.1, тоже имеется портированная из NetBSD реализация Tmpfs.

Microsoft Windows

В Windows имеется приблизительный аналог Tmpfs в виде "временных файлов". Файлы, созданные с атрибутом FILE_ATTRIBUTE_TEMPORARY и флагом FILE_FLAG_DELETE_ON_CLOSE размещаются в ОЗУ и записываются на жёсткий диск только если системе не хватает оперативной памяти. Таким образом, "временные файлы" аналогичны Tmpfs, за исключением того, что при нехватке памяти они записываются по указанному при их создании пути, а не в файл подкачки. Этот метод часто используется на серверах с TransmitFile для подготовки контента и его буферизацией перед отправкой клиенту.

Источники

  1. altlinux.org// Altlinux. [2017-2017]. Дата обновления: 04.03.2017. URL: https://www.altlinux.org/Tmpfs (дата обращения 19.08.2017).
  2. Коротенькая памятка о ramfs и tmpfs // okey [2019]. Дата изменения: 08.12.2011. URL: http://www.okey.com.ua/node/3 (Дата обращения: 09.01.2019).
  3. citforum.ru// Руководство по продвинутым файловым системам. [2017-2017]. Дата обновления: 04.03.2017. URL: http://citforum.ru/operating_systems/linux/robbins/fs11.shtml (дата обращения 19.08.2017).
  4. ibm.com // IBM support. [2017-2017]. Дата обновления: 04.03.2017. URL:http://www-01.ibm.com/support/docview.wss?uid=isg3T1023016 (дата обращения 19.08.2017).
  5. solarisinternals.com // Solaris. [2017-2017]. Дата обновления: 04.03.2017. URL:https://www.sun3arc.org/ (дата обращения 19.08.2017).
  6. sun3arc.org // SunOS 4.1 Performance Tuning. [2017-2017]. Дата обновления: 08.03.2017. URL:https://www.sun3arc.org/BootTapes/Sun3/ (дата обращения 19.08.2017).
  7. opennet.ru // Advanced filesystem implementor's guide. [2017-2017]. Дата обновления: 08.03.2017. URL:https://www.opennet.ru/docs/RUS/file-sys/ (дата обращения 19.08.2017).
  8. opennet.ru // Advanced filesystem implementor's guide. [2017-2017]. Дата обновления: 08.03.2017. URL:https://www.opennet.ru/docs/RUS/file-sys/ (дата обращения 19.08.2017).
  9. netbsd-soc.com // NetBSD-SoC. [2017-2017]. Дата обновления: 08.03.2017. URL: http://www.netbsd.org/docs/kernel/porting_netbsd_arm_soc.html (дата обращения 19.08.2017).
  10. freebsd.org // FreeBSD tmpfs manpage. [2017-2017]. Дата обновления: 08.03.2017. URL: https://wiki.freebsd.org/TMPFS (дата обращения 19.08.2017).