Swap on tmpfs (очевидно, плохая идея, но возможно ли это?)

11

Этот вопрос возник из-за шутки между коллегами по поводу увеличения производительности за счет перемещения файлов подкачки в tmpfs. Очевидно, что даже если это возможно, это не очень хорошая идея. Все, что я хочу знать, это можно ли сделать?

Я в настоящее время на Ubuntu 14.04, но я думаю, что процесс похож на большинстве машин Linux / Unix. Вот что я делаю:

> mkdir /mnt/tmp
> mount -t tmpfs -o size=10m tmpfs /mnt/tmp
> dd if=/dev/zero of=/mnt/tmp/swapfile bs=1024 count=10240
> chmod 600 /mnt/tmp/swapfile
> mkswap /mnt/tmp/swapfile
# So far, so good!

> swapon /mnt/tmp/swapfile
swapon: /mnt/tmp/swapfile: swapon failed: Invalid argument

Итак, на Linux или Unix (я заинтересован в любом решении), вы можете как-то настроить swap на файл / раздел, находящийся в ram? Есть ли способ обойти Invalid argumentошибку, которую я получаю выше?

Опять же, просто хочу подчеркнуть, что я не ожидаю, что это решение реальной проблемы. Я думаю, это просто веселый эксперимент.

vastlysuperiorman
источник
Вы ищете Zram?
frostschutz

Ответы:

1

Итак, на Linux или Unix (я заинтересован в любом решении) вы можете как-то настроить swap на файл / раздел, расположенный в ram?

Конечно. На FreeBSD:

# swapinfo -h
Device          1024-blocks     Used    Avail Capacity
/dev/mirror/swap.eli     4194300       0B     4.0G     0%

Это показывает, что в настоящее время у меня есть зашифрованный раздел подкачки 4G с зеркальной избыточностью. Я добавлю еще 4G без резервирования, без шифрования:

Сначала создайте 4G RAM-устройство ( md) с памятью :

# mdconfig -a -t malloc -s 4g; mdconfig -lv
md0
md0     malloc   4096M  -

Затем скажите swaponдобавить это в пул доступных устройств подкачки и swapinfoподтвердите, что у меня теперь 8G подкачки:

# swapon /dev/md0; swapinfo -h
Device          1024-blocks     Used    Avail Capacity
/dev/mirror/swap.eli     4194300       0B     4.0G     0%
/dev/md0            4194304       0B     4.0G     0%
Total               8388604       0B     8.0G     0%
Джим Л.
источник
Перемещение флажка «принятый ответ» через 4 года является трудным решением. Этот ответ показывает, что есть способ! mdconfig(8)содержит примечание, в котором опущена -o reserveопция «это очень простой способ запаниковать систему». Он также отмечает, что тип может быть установлен, swapчто позволяет очень интересный сценарий системы, перемещающей страницы памяти в подкачку, которая сама находится в памяти! Есть даже опция -o forceдля таких чайников, как я, которые хотят опустить «дополнительные проверки работоспособности». Посмеялся над этим.
Чрезвычайно суперменов
10

Это не должно быть возможно. swaponСистемный вызов требует readpageи bmap(косвенно) вызовов, осуществляемых файловой системой:

http://lxr.free-electrons.com/source/mm/swapfile.c?v=4.0#L2412

if (!mapping->a_ops->readpage) {
    error = -EINVAL;
    goto bad_swap;
}   

Но ни один из них не реализован tmpfs , такая запись отсутствует в соответствующем address_space_operations: http://lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

По той же причине tmpfs не может держать циклическое монтирование, и ramfs также не будет работать (у него нет bmapвызова)

myaut
источник
3

Из этой Q & A /superuser/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem (оригинальный ссылочный сайт не отвечает):

Поэтому «Неверный аргумент» следует читать как «Ваша файловая система не поддерживает файл подкачки»

Я подозреваю, что причиной несовместимости является «круговая зависимость». Из этой статьи: http://www.jamescoyle.net/knowledge/951-the-difference-between-a-tmpfs-and-ramfs-ram-disk :

Эти два различия между ramfs и tmpfs делают tmpfs намного более управляемым, однако это является одним из основных недостатков; tmpfs может использовать пространство SWAP. Если в вашей системе не хватает физической памяти, файлы в ваших разделах tmpfs могут быть записаны в разделы SWAP на основе диска, и их нужно будет прочитать с диска при следующем обращении к файлу.

Что было бы практически невозможно в вашем сценарии.

Это может сработать ramfs, хотя - у которого нет этой проблемы.

Дэн Корнилеску
источник
Да - установка tmpfsраздела в качестве раздела подкачки будет запускать и бесконечный цикл, когда машина начнет подкачку.
Dr_
1

Вы можете легко избежать проблем с отсутствующими функциями и перейти к tmpfs, хотя и немного косвенно:

dd if=/dev/zero bs=1M of=/tmp/swapfs count=128
chmod 0600 /tmp/swapfs
mkfs.ext2 /tmp/swapfs
mount -o loop /tmp/swapfs /mnt
dd if=/dev/zero bs=1M of=/mnt/swap
mkswap /mnt/swap
swapon /mnt/swap

В сочетании с zswap это выглядело как отличное решение для расширения памяти, пока мой RasPi4 почти не завис ничего полезного. Запущенный через ssh (до того, как это произошло) поверх не показал ничего выдающегося - казалось, было достаточно свободного места в оперативной памяти и подкачке. Фактически, аналогичная идея с OpenSolaris (подкачка к сжатому zvol) привести к аналогичному результату.

УНИСОЛ
источник
@Jesse_b, будет ли иметь какое-то значение создание привязки вместо монтирования цикла в этом файле?
RJT
@rjt: не уверен. Я не написал ответ, я просто отредактировал его.
jesse_b
@unisol, ваш файл подкачки вырос за пределы того, что предполагалось. Заполнение дискового пространства
rjt
1
Где именно это на самом деле использовать оперативную память? Похоже, он создает файл в / tmp /, который сохраняется при перезагрузке на моей машине.
RJT
Предполагалось, что у вас есть tmpfs, смонтированный в / tmp (это хорошо с точки зрения «ничего не осталось после перезагрузки» и часто используется во встроенных установках, но опасно, если у вас мало оперативной памяти, и неприятно, когда что-то не подходит к вашему / tmp) - как mc распаковывает несколько концертов архива). Создателю темы не удалось получить файл подкачки с использованием файловой системы на основе ОЗУ - поэтому я просто создаю в нем файл, форматирую его в любую ФС, обладающую необходимыми возможностями (например, ext2), и создаю своп в этой ФС. Дополнительные обручи и петли - но цель достигнута.
УНИСОЛ