Troque tmpfs (obviamente uma má ideia, mas é possível?)

11

Essa pergunta se originou com uma piada entre colegas de trabalho sobre o aumento do desempenho, movendo arquivos de troca para um tmpfs. Claramente, mesmo que isso seja possível, não é uma boa ideia. Tudo o que eu quero saber é: isso pode ser feito?

Atualmente, estou no Ubuntu 14.04, mas imagino que o processo seja semelhante para a maioria das máquinas Linux / Unix. Aqui está o que estou fazendo:

> 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

Então, no linux ou no unix (estou interessado em qualquer solução), você pode configurar o swap em um arquivo / partição que reside no ram? Existe uma maneira de contornar o Invalid argumenterro que estou recebendo acima?

Novamente, só quero enfatizar que não espero que isso seja uma solução para um problema do mundo real. Apenas um experimento divertido, eu acho.

vastlysuperiorman
fonte
Você está procurando zram?
Frostschutz

Respostas:

1

Então, no linux ou no unix (estou interessado em qualquer solução), você pode configurar o swap em um arquivo / partição residente no ram?

Certo. No FreeBSD:

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

Isso mostra que, atualmente, eu tenho uma partição de troca criptografada 4G com redundância espelhada. Adicionarei outro 4G de troca não redundante e não criptografada:

Primeiro, crie um mddispositivo de "disco de memória" ( ) suportado por RAM de 4G :

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

Em seguida, diga swaponpara adicionar isso ao pool de dispositivos de troca disponíveis e swapinfoconfirme que agora tenho 8G de troca:

# 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%
Jim L.
fonte
Mover a marca de seleção "resposta aceita" após 4 anos é uma decisão difícil. Esta resposta mostra que existe um caminho! mdconfig(8)inclui uma observação de que omitir a -o reserveopção "é uma maneira muito fácil de entrar em pânico em um sistema". Ele também observa que o tipo pode ser definido como o swapque permite o cenário muito divertido de um sistema mover páginas de memória para a troca que reside na memória! Existe até uma opção -o forcepara bonecos como eu, que querem omitir "verificações extras de sanidade". Riu muito lendo isso.
vastlysuperiorman
10

Não deveria ser possível. swaponA chamada do sistema requer readpagee bmap(indiretamente) as chamadas sendo implementadas pelo sistema de arquivos:

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

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

Mas nenhum deles é implementado pelo tmpfs ; essa entrada está ausente no correspondente address_space_operations: http://lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

Pelo mesmo motivo, o tmpfs não pode conter montagens de loop e o ramfs também não funciona (não possui bmapchamada)

myaut
fonte
3

Nestas perguntas e respostas, /superuser/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem (o site referenciado original não está respondendo):

Portanto, "Argumento inválido" deve ser lido como "Seu sistema de arquivos não suporta arquivo de troca"

O motivo da incompatibilidade que suspeito é uma "dependência circular". Neste artigo: http://www.jamescoyle.net/knowledge/951-the-difference-between-a-tmpfs-and-ramfs-ram-disk :

Essas duas diferenças entre ramfs e tmpfs tornam o tmpfs muito mais gerenciável, mas essa é uma grande desvantagem; tmpfs pode usar espaço SWAP. Se o seu sistema ficar sem memória RAM física, os arquivos nas partições tmpfs poderão ser gravados em partições SWAP baseadas em disco e deverão ser lidos a partir do disco quando o arquivo for acessado em seguida.

O que seria praticamente impossível no seu cenário.

Ele pode trabalhar com ramfs, tho - que não tem esse problema.

Dan Cornilescu
fonte
Sim - definir uma tmpfspartição como swap iniciaria e executaria um loop infinito quando a máquina iniciar a troca.
Dr_
1

Você pode facilmente evitar problemas com funções ausentes e trocar para tmpfs, embora um pouco indiretamente:

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

Combinado com o zswap, parecia uma ótima solução de "expansão de memória" até o meu RasPi4 congelar quase completamente (o console ssh congelou, o X congelou, o youtube no chrome continuou falando por vários minutos e congelou também, mas o sistema estava respondendo a pings e watchdog didn Lançado via ssh (antes que isso acontecesse) no topo não mostrava nada de extraordinário - parecia haver bastante memória RAM e espaço de troca suficientes. De fato, uma idéia semelhante ao OpenSolaris (troca por um zvol compactado) levar a resultados semelhantes.

unisol
fonte
@ Jessie_b, faria alguma diferença fazer um bind em vez de montar um loop nesse arquivo?
rjt 4/01
@rjt: Não tenho certeza. Não escrevi a resposta, apenas a editei.
jesse_b 4/01
@unisol, o seu arquivo de troca cresceu além do pretendido. Preenchendo espaço em
disco
1
Onde exatamente isso realmente usa RAM? Parece que ele cria um arquivo em / tmp / que persiste nas reinicializações na minha máquina.
rjt 4/01
Pretendia-se que você tivesse tmpfs montados em / tmp (é bom em termos de "nada resta após a reinicialização" e costuma ser usado em configurações incorporadas, mas perigoso se você ficar com pouca RAM e desagradável quando algo não se encaixa em seu / tmp - como mc descompactando vários shows de arquivo). O iniciador de tópicos falhou ao obter o swapfile usando o sistema de arquivos baseado em RAM - então, basta criar um arquivo nele, formatá-lo em qualquer FS que possua os recursos necessários (por exemplo, ext2) e criar uma troca nesse FS. Argolas e loops extras - mas o objetivo é alcançado.
unisol 6/01