Scambia su tmpfs (ovviamente una cattiva idea, ma è possibile?)


11

Questa domanda è nata con una battuta tra colleghi sull'aumento delle prestazioni spostando i file di scambio in un tmpfs. Chiaramente anche se questo è possibile, non è una buona idea. Tutto quello che voglio sapere è, si può fare?

Sono attualmente su Ubuntu 14.04, ma immagino che il processo sia simile per la maggior parte delle macchine Linux / Unix. Ecco cosa sto facendo:

> 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

Quindi, su Linux o Unix (sono interessato a qualsiasi soluzione) puoi in qualche modo impostare lo scambio su un file / partizione residente in ram? C'è un modo per aggirare l' Invalid argumenterrore che sto ottenendo sopra?

Ancora una volta, voglio solo sottolineare che non mi aspetto che questa sia una soluzione a un problema del mondo reale. Solo un esperimento divertente, immagino.


Stai cercando zram?
frostschutz,

Risposte:


1

Quindi, su Linux o Unix (sono interessato a qualsiasi soluzione) puoi in qualche modo impostare lo scambio su un file / partizione residente in ram?

Sicuro. Su FreeBSD:

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

Ciò dimostra che attualmente ho una partizione di swap crittografata 4G con ridondanza speculare. Aggiungerò un altro 4G di swap non ridondante e non crittografato:

Innanzitutto creare un mddispositivo "memory disk" ( ) con supporto RAM 4G :

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

Quindi dì swapondi aggiungerlo al pool di dispositivi di scambio disponibili e swapinfoconferma che ora ho 8G di scambio:

# 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%

Spostare il segno di spunta "risposta accettata" dopo 4 anni è una decisione difficile. Questa risposta mostra che c'è un modo! mdconfig(8)include una nota che omettere l' -o reserveopzione "è un modo molto semplice per far prendere il panico da un sistema". Nota anche che il tipo può essere impostato su swapche consente lo scenario molto divertente di un sistema che sposta le pagine di memoria in swap che si trova in memoria! C'è anche un'opzione -o forceper i manichini come me che vogliono omettere "controlli di integrità extra". Ci siamo fatti una bella risata leggendo questo.
vastlysuperiorman,

10

Non dovrebbe essere possibile. swaponla chiamata di sistema richiede readpagee bmap(indirettamente) le chiamate implementate dal filesystem:

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

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

Ma nessuno di questi è implementato da tmpfs , tale voce manca dalla corrispondente address_space_operations: http://lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

Per lo stesso motivo, tmpfs non può contenere loop mount e ramfs non funzionerà neanche (non ha bmapcall)


3

Da questa domanda e risposta /superuser/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem (il sito di riferimento originale non risponde):

Quindi "Argomento non valido" dovrebbe essere letto come "Il tuo filesystem non supporta il file di scambio"

La ragione dell'incompatibilità che sospetto è una "dipendenza circolare". Da questo articolo: http://www.jamescoyle.net/knowledge/951-the-difference-between-a-tmpfs-and-ramfs-ram-disk :

Queste due differenze tra ramfs e tmpfs rendono i tmpfs molto più gestibili, tuttavia questo è uno dei principali svantaggi; tmpfs può usare lo spazio SWAP. Se il sistema esaurisce la RAM fisica, i file nelle partizioni tmpfs potrebbero essere scritti su partizioni SWAP basate su disco e dovranno essere letti dal disco al successivo accesso al file.

Il che sarebbe praticamente impossibile nel tuo scenario.

Si potrebbe lavorare con ramfs, tho - che non ha questo problema.


Sì: l'impostazione di una tmpfspartizione all'avvio dello scambio e del ciclo infinito quando la macchina inizia a scambiare.
dr_

1

Puoi facilmente evitare i problemi con le funzioni mancanti e passare a tmpfs, anche se un po 'indirettamente:

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

In combinazione con zswap sembrava una grande soluzione "expander di memoria" fino a quando il mio RasPi4 si è bloccato quasi completamente (la console ssh si è bloccata, X si è bloccata, YouTube in Chrome ha continuato a parlare per diversi minuti e anche si è bloccato, ma il sistema stava rispondendo a ping e watchdog no fare qualcosa di utile. Lanciato via ssh (prima che accadesse) in cima non mostrava nulla di eccezionale - sembrava che ci fosse abbastanza spazio libero per ram e swap, In effetti, un'idea simile con OpenSolaris (scambia con uno zvol compresso) portare a risultati simili.


@Jesse_b, farebbe alcuna differenza fare un bind invece di un loop mount su quel file?
rjt

@rjt: Non sono sicuro. Non ho scritto la risposta, l'ho appena modificata.
jesse_b,

@unisol, il tuo file di scambio è cresciuto oltre ciò che era previsto. Riempimento spazio su disco
rjt

1
Dove utilizza esattamente la RAM? Sembra che crei un file su / tmp / che persiste attraverso i riavvii sulla mia macchina.
rjt

Era previsto che tu avessi tmpfs montato in / tmp (è buono in termini di "nulla è rimasto dopo il riavvio" e spesso usato in configurazioni integrate ma pericoloso se stai esaurendo la RAM e spiacevole quando qualcosa non si adatta al tuo / tmp - come mc disimballare diversi concerti di archivio). L'argomento di partenza non è riuscito a ottenere il file di scambio utilizzando il file system basato su RAM, quindi ho creato un file al suo interno, formattato in qualunque FS abbia le capacità necessarie (cioè ext2) e creo uno scambio su quel FS. Cerchi e anelli extra - ma l'obiettivo è raggiunto.
unisol
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.