Я хотел бы использовать неиспользуемую оперативную память другой машины в качестве пространства подкачки для моей основной установки Linux. Мне просто было интересно узнать о производительности сетевых RAM-дисков по сравнению с локальными (медленными) механическими жесткими дисками.
Файл подкачки находится в tmpfs
точке монтирования и доступен через samba
. Однако каждый раз, когда я пытаюсь выполнить:
swapon /mnt/ramswap/swapfile
Я получил:
swapon: /mnt/ramswap/swapfile: swapon failed: Invalid argument
и в dmesg
я прочитал:
[ 9569.806483] swapon: swapfile has holes
Я пробовал выделить файл подкачки с помощью dd if=/dev/zero of=swapfile bs=1024 (but also =4096 and =1048576)
и с помощью truncate -s 2G
(оба сопровождались mkswap swapfile
), но результат всегда один и тот же.
Вэта почта(датируется 2002 годом) кто-то говорит, что использование файла подкачки через NFS/SMB невозможно в Linux. Это утверждение все еще актуально? И если да, то в чем причина такого выбора и есть ли обходной путь, чтобы это работало?
решение1
Я знаю, что это уже немного старая тема, но я только что столкнулся с этой проблемой и обнаружил, что можно использовать раздел подкачки NFS, используя устройство обратной связи ядра:
Создайте пустой файл (заполните нулями из /dev/zero):
root@machine:/# dd if=/dev/zero of=/swap bs=1024 count=1048576
Сделайте петлевое устройство:
root@machine:/# losetup /dev/loop0 /swap
Сделайте его пригодным для обмена:
root@machine:/# mkswap /dev/loop0
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=931d6e04-78ec-41fd-ab2c-22522ac2711d
Теперь используйте это:
root@machine:/# swapon /dev/loop0
Сделать изменение постоянным
Напишите скрипт, чтобы сделать этот обмен постоянным. /etc/init.d/swap может выглядеть так:
#!/bin/sh
set -e
case "$1" in
start)
losetup /dev/loop0 /swap
swapon /dev/loop0
;;
stop)
swapoff /dev/loop0
losetup -d /dev/loop0
;;
restart)
swapoff /dev/loop0
swapon /dev/loop0
;;
*)
echo "Usage: swap { start | stop | restart }" >&2
exit 1
;;
esac
exit 0
Сделайте файл исполняемым:
root@machine:/# chmod +x /etc/init.d/swap
Включить:
root@machine:/# update-rc.d swap defaults
Источник:http://www.emanuelis.eu/2010/06/21/how-to-swap-to-nfs-mount/
решение2
Процитирую страницу руководства...
Это связано с реализацией файла подкачки в ядре, предполагающей возможность записи в файл напрямую, без помощи файловой системы.
Невозможно напрямую записать данные в смонтированный NFS-файл, минуя файловую систему, поэтому вы получаете это немного запутанное сообщение об ошибке.
Как заметил @MattH, для этого можно использовать iSCSI, но вопрос в том, стоит ли оно того вообще. В конце концов, оперативная память довольно дешева.
решение3
Если бы вы могли сделать это так, как вы описываете, я должен отметить, что вы не используете неиспользуемую оперативную память другой машины. Файлы подкачки — это файловая поддержка для локальной более быстрой оперативной памяти. Вы бы использовали дисковое пространство другой машины.
Вы не можете этого сделать, потому что в Linux есть специальный тип раздела для подкачки, он должен быть на локальном диске, а не на сетевом ресурсе. Windows не делает этого таким образом, он просто использует файл в существующей файловой системе. Если я правильно помню, этот файл также должен быть на локальном диске. Так что он не может быть на NFS или SMB.
Однако я думаю, что вы можете сделать это с помощью iSCSI. Если вы смонтируете iSCSI-цель локально и предоставите в ней раздел подкачки, это может сработать. Хорошая ли это идея? Нет. Я думаю, что это ужасная идея по соображениям производительности и надежности. Скорее всего, Linux зависнет, если сеть выйдет из строя и ему понадобится доступ к разделу подкачки. Вы должны получить лучшую производительность с помощью AoE. Но опять же, одна проблема с сетью или другой машиной, и вас ждет ухабистая дорога.
Просто купите больше оперативной памяти или, если больше не помещается, приобретите SSD и создайте на нем раздел подкачки.
EDIT: Хорошо, вы можете это сделать. Все еще не рекомендуется, но это один из способов добиться этого в теории.
- Создайте tmpfs или ramfs на удаленном хосте.
- Отформатируйте tmpfs или ramfs как ext4.
- Создайте на нем файл образа диска raw (dd или truncate подойдут).
- Экспортируйте образ диска с помощью iscsi или AoE.
- На локальном компьютере Linux подключите цель. Затем создайте своп на цели с помощью mkswap.
- Тогда поменяй местами.
Удачи!
решение4
Я делюсь оперативной памятью другой машины через своп через NBD
хост/сервер
Настройте ramfs (если необходимо, если нет, просто перейдите к nbd)
sudo mkdir /mnt/ram
sudo mount -t tmpfs -o size=16G tmpfs /mnt/ram
Файл конфигурации /etc/nbd-server/config
:
[generic]
user = nbd
group = nbd
[swap]
exportname = /mnt/ram/swap
copyonwrite = false
prerun = truncate -s 16G /mnt/ram/swap && mkswap /mnt/ram/swap
Начать НБД
sudo systemctl start nbd
клиент
sudo nbd-client 192.168.1.3 -name swap /dev/nbd0
sudo swapon /dev/nbd0