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ошибку, которую я получаю выше?

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


Вы ищете 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вызова)


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), и создаю своп в этой ФС. Дополнительные обручи и петли - но цель достигнута.
— УНИСОЛ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.