Swap on tmpfs (Evidemment une mauvaise idée, mais est-ce possible?)


11

Cette question est née d'une plaisanterie entre collègues sur l'augmentation des performances en déplaçant des fichiers d'échange vers un tmpfs. De toute évidence, même si cela est possible, ce n'est pas une bonne idée. Tout ce que je veux savoir, c'est que cela peut être fait?

Je suis actuellement sur Ubuntu 14.04, mais j'imagine que le processus est similaire pour la plupart des machines Linux / Unix. Voici ce que je fais:

> 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

Donc, sur Linux ou Unix (je suis intéressé par une solution), pouvez-vous configurer le swap sur un fichier / une partition résidant dans RAM? Existe-t-il un moyen de contourner l' Invalid argumenterreur que j'obtiens ci-dessus?

Encore une fois, je tiens à souligner que je ne m'attends pas à ce que ce soit une solution à un problème du monde réel. Juste une expérience amusante, je suppose.


Vous cherchez du zram?
frostschutz

Réponses:


1

Donc, sur Linux ou Unix (je suis intéressé par une solution), pouvez-vous configurer le swap sur un fichier / une partition résidant dans RAM?

Sûr. Sur FreeBSD:

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

Cela montre qu'actuellement, j'ai une partition d'échange cryptée 4G avec une redondance en miroir. J'ajouterai un autre 4G de swap non redondant et non crypté:

Créez d'abord un périphérique "disque de mémoire" 4G soutenu par la RAM md:

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

Dites ensuite swapond'ajouter cela au pool de périphériques de swap disponibles et swapinfoconfirme que j'ai maintenant 8G de swap:

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

Déplacer la coche «réponse acceptée» après 4 ans est une décision difficile. Cette réponse montre qu'il existe un moyen! mdconfig(8)inclut une note qui omettant l' -o reserveoption "est un moyen très simple de paniquer un système". Il note également que le type peut être défini sur swapce qui permet le scénario très amusant d'un système déplaçant des pages de mémoire en swap qui lui-même réside en mémoire! Il existe même une option -o forcepour les nuls comme moi qui veulent omettre les "vérifications de santé mentale supplémentaires". J'ai bien ri en lisant ceci.
vastlysuperiorman

10

Cela ne devrait pas être possible. swaponl'appel système nécessite readpageet bmap(indirectement) des appels mis en œuvre par le système de fichiers:

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

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

Mais aucun d'entre eux n'est implémenté par tmpfs , une telle entrée manque dans la correspondance address_space_operations: http://lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

Pour la même raison, tmpfs ne peut pas contenir de montages en boucle, et ramfs ne fonctionnera pas non plus (il n'a pas d' bmapappel)


3

De cette Q&A /superuser/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem (le site référencé d'origine ne répond pas):

Donc, "Argument invalide" doit être lu comme "Votre système de fichiers ne prend pas en charge le fichier d'échange"

La raison de l'incompatibilité que je soupçonne est une "dépendance circulaire". De cet article: http://www.jamescoyle.net/knowledge/951-the-difference-between-a-tmpfs-and-ramfs-ram-disk :

Ces deux différences entre ramfs et tmpfs rendent les tmpfs beaucoup plus faciles à gérer, mais c'est un inconvénient majeur; tmpfs peut utiliser l'espace SWAP. Si votre système manque de RAM physique, les fichiers de vos partitions tmpfs peuvent être écrits sur des partitions SWAP basées sur disque et devront être lus à partir du disque lors du prochain accès au fichier.

Ce qui serait pratiquement impossible dans votre scénario.

Cela pourrait fonctionner avec ramfs, tho - qui n'a pas ce problème.


Oui - définir une tmpfspartition en tant que swap démarrerait et ferait une boucle sans fin lorsque la machine commence le swap.
dr_

1

Vous pouvez facilement éviter les problèmes avec les fonctions manquantes et passer aux tmpfs, bien qu'un peu indirectement:

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

Combiné avec zswap, cela ressemblait à une excellente solution "d'extension de mémoire" jusqu'à ce que mon RasPi4 se bloque presque complètement (la console ssh a gelé, X a gelé, youtube en chrome a continué à parler pendant plusieurs minutes et a également gelé, mais le système répondait aux pings et au chien de garde n'a pas Lancé via ssh (avant que cela ne se produise) au sommet ne montrait pas non plus quelque chose d'exceptionnel - il semblait y avoir suffisamment de RAM libre et d'espace de swap, En fait, idée similaire avec OpenSolaris (swap à un zvol compressé) conduire à un résultat similaire.


@Jesse_b, cela ferait-il une différence de faire une liaison au lieu d'un montage en boucle sur ce fichier?
rjt

@rjt: Pas sûr. Je n'ai pas écrit la réponse que je viens de modifier.
jesse_b

@unisol, votre fichier d'échange a-t-il dépassé ce qui était prévu? Remplir l'espace disque
rjt

1
Où cela utilise-t-il réellement la RAM? On dirait qu'il crée un fichier sur / tmp / qui persiste lors des redémarrages sur ma machine.
rjt

Il était prévu que vous ayez des tmpfs montés dans / tmp (c'est bon en termes de "rien n'est laissé après le redémarrage" et souvent utilisé dans les configurations intégrées mais dangereux si vous manquez de RAM et désagréable lorsque quelque chose ne rentre pas dans votre / tmp - comme mc déballant plusieurs concerts d'archives). Le sujet de démarrage n'a pas réussi à obtenir le fichier d'échange à l'aide du système de fichiers basé sur la RAM - je crée donc un fichier dedans, le formate dans ce que FS a les capacités nécessaires (c'est-à-dire ext2) et crée un échange sur ce FS. Cerceaux et boucles supplémentaires - mais l'objectif est atteint.
Unisol
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.