J'ai une machine avec 62 Go de RAM et une malle de 7 Go seulement, alors j'ai pensé créer un disque RAM et la compiler à cet endroit. Je ne suis pas un expert Linux. J'ai trouvé des instructions sur Internet pour créer le disque RAM:
mkfs -q /dev/ram1 8192
mais j'ai changé le 8192 en 16777216 dans une tentative d'allouer 16 Go de disque RAM.
J'ai eu l'erreur suivante:
mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n)
À quel point je me suis effrayé et renfloué.
sudo dmidecode --type 17 | grep Size
montre
8x8192MB + 2048MB = 67584 MB
mais du
sur /dev
donne 804K
.
Est-ce le problème? Puis-je surmonter cette /dev
taille?
mount -o size=16G -t tmpfs none /mnt/tmpfs
Réponses:
Le meilleur moyen de créer un disque virtuel sur Linux est tmpfs. Il s’agit d’un système de fichiers hébergé par un ram, il n’est donc pas nécessaire d’ext2. Vous pouvez créer un fichier tmpfs de 16 Go avec:
la source
tmpfs
peut utiliser swap, ce que vous ne voulez probablement pas dans un disque RAM pur.Linux est très efficace dans l'utilisation de la RAM. Il n’ya guère de surprise que vous ne constatiez que peu, voire aucune accélération
tmpfs
. Les plus gros éléments à lire en mémoire (et donc capables de ralentir le processus) sont les outils (compilateur, assembleur, éditeur de liens), etmake
ils seront chargés en mémoire au démarrage et ne le quitteront jamais. Ce qui reste est en train de lire dans le source (l'écriture des résultats ne vous ralentira pas, à moins que la mémoire ne soit sérieusement contrainte). Encore une fois, les fichiers d’en-tête resteront, seule la source de l’utilisateur devra être lue. Et il est peu probable que ce soit plus que quelques mégaoctets. Créer un grand disque RAM (ou même beaucoup d’utilisationtmpfs
) peut très bien ralentir les choses (en rendant la mémoire de construction contrainte, les fichiers sur le disque RAM ou surtmpfs
ne peuvent pas être utilisé directement à partir de là).la source
tmpfs
ne sont pas utilisés couramment pour stocker des exécutables (les RAMdisks sont un vestige du bon vieux temps des disquettes extrêmement lentes et ainsi de suite,tmpfs
pour des données temporaires très strictes), personne n’a jugé suffisamment important d’ajouter les horribles hacks nécessaires.Le problème est que la taille maximale d'un disque mémoire, plus précisément de la taille de la mémoire accessible via le pilote du disque mémoire, est configurée à la compilation, elle peut être écrasée à la première heure, mais reste fixe une fois le noyau chargé en mémoire. La valeur par défaut est probablement mesurée en mégaoctets. Si je me souviens bien, la mémoire d’un disque RAM est réservée correctement lorsque le pilote est chargé. Tous les disques RAM ont la même taille et il en existe 16 par défaut. Donc, même vous ne voulez pas une taille de disque mémoire de 16 Go :-)
Comme indiqué dans l’autre réponse, tmpfs est ce que vous voulez utiliser. De plus, vous ne gagnerez pas beaucoup en ayant votre système d'exploitation complet dans un disque virtuel / tmpfs. Copiez simplement votre builddir dans un fichier tmpfs et compilez-le ensuite. Vous devrez peut-être vous assurer que tous les résultats temporaires sont également écrits dans un emplacement situé dans les fichiers tmpfs.
la source
blockdev --flushbufs
.Documentation/blockdev/ramdisk.txt
dans les sources du noyau. Et sur ma réponse: ce fichier indique également que le disque mémoire augmente à mesure que la mémoire est utilisée, de sorte qu'il ne soit pas alloué en une seule fois.Cela semble fonctionner si vous créez un grand disque virtuel après le démarrage, sans modifier les paramètres du noyau. Utilisez tmpfs, créez un fichier, montez-le via une boucle et montez-le via un système de fichiers:
Probablement un peu de performance en passant par plusieurs couches différentes ... mais au moins ça marche.
la source
Par ailleurs
tmpfs
etramfs
, une autre option est le/dev/ram0
dispositif de bloc. Sur les versions récentes d'Ubuntu, ce périphérique n'existe pas par défaut, mais peut être créé viamodprobe brd
.Cette approche est plus prévisible, car elle crée un
ext4
système de fichiers réel et ne dépasse jamais la limite spécifiée. Mais la configuration nécessite plus d’étapes et la mémoire vive est utilisée moins efficacement.Utilisation du module de noyau brd (/ dev / ram0)
Pour créer et initialiser un disque RAM de 4 Go:
Le
rd_nr
paramètre spécifie le nombre de disques RAM à créer (par défaut, il en crée 16, c'est-/dev/ram0
à- dire par le biais/dev/ram15
). Lerd_size
paramètre est la taille en kilo-octets . La$(( ... ))
syntaxe vous permet de faire de l'arithmétique dans le shell.Pour désallouer le disque RAM, démontez-le et retirez le
brd
module du noyau:Créer un périphérique bloc à l'intérieur
ramfs
Sinon, vous pouvez créer un périphérique bloc à l'intérieur de
ramfs
:La
truncate
commande crée un fichier vide d’une taille donnée de sorte qu’il soit initialisé (c’est-à-dire qu’il consomme de la mémoire) à la demande.Pour désallouer le disque RAM, démontez-le et supprimez l’image disque:
Comparaison avec
tmpfs
etramfs
Bien
tmpfs
etramfs
sont plus efficaces que d' utiliser un dispositif de bloc, ci - dessous quelques - unes de leurs inconvénients.tmpfs
peut permuter sur le disque. Ceci est plus efficace, mais vous voudrez peut-être parfois un disque purement RAM:ramfs
est facile à configurer, récupère de l’espace une fois les fichiers supprimés et utilise la RAM plus efficacement (le système ne met pas les fichiers en mémoire tampon, car il sait qu’ils sont dans la RAM). Mais il a ses propres inconvénients et surprises:L'
df
utilitaire ne rapporte pas l'utilisation de l'espace:Il n'y a pas de paramètre de limite de taille. Si vous mettez trop dans le disque mémoire, votre système se bloquera.
Les fichiers fragmentés peuvent devenir épargnés lorsque vous vous y attendez le moins. Ce matin, j'ai copié une image de machine virtuelle (150G, mais 49G utilisée sur le disque) vers
ramfs
(j'ai 128G de RAM). Ça a marché. Mais quand j'ai copié de laramfs
à la destination, mon système est devenu insensible. L'cp
utilitaire a apparemment comblé les lacunes en lecture , mais pas en écriture.Les deux
tmpfs
etramfs
peuvent se comporter différemment d'un vraiext4
système de fichiers. Créer un périphérique bloc dans la RAM et l’initialiser avecext4
évite cela.Pour une comparaison plus approfondie: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
la source
OP la quantité de RAM est exprimée en MB. Donc tout ce dont vous avez besoin pour entrer est le 16384. Et voila, vous seriez dans les affaires
la source
mkfs.ext2
Vous pouvez monter un
ramfs
système de fichiers, y copier votre projet et y travailler. Cela garantit que vos fichiers d'entrée sont chargés dans la RAM et qu'ils ne seront pas relus à partir du lecteur de disque beaucoup plus lent. Cependant, comme vous l'avez découvert, cette stratégie n'est généralement pas utile. Vous obtenez déjà exactement le même avantage.- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt
Vous pouvez déjà avoir confiance que vos fichiers d’entrée sont mis en cache dans la RAM, lors de leur première lecture. Vos fichiers de sortie sont également mis en cache afin que vous n'attendiez pas qu'ils soient écrits sur le disque.
Il n'y a pas de limite artificielle à la quantité de mémoire cache que vous pouvez mettre en cache, combien de temps elle reste en cache, etc. Le cache qui est déposé en premier est choisi par des algorithmes extrêmement élaborés. La première approximation est que nous décrivons comme moins récemment utilisé. Voir Quels algorithmes de remplacement de page sont utilisés dans le noyau Linux pour le cache de fichiers du système d'exploitation?
Notez que votre éditeur de texte
fsync()
enregistrera explicitement les fichiers sur le disque.Si vous exécutez des tests d'un programme impliquant
fsync()
, leur exécution dans un système de fichiers commeramfs
peut les accélérer. Une autre stratégie consiste à essayer de désactiverfsync()
aveceatmydata
/nosync.so
.Certains autres systèmes d'exploitation peuvent avoir des limitations spécifiques, qui peuvent être contournées à l'aide d'un disque mémoire. À une extrémité, l'absence de toute mise en cache de fichiers est pourquoi ramdisks étaient populaires sur DOS .
tmpfs
tmpfs
fonctionne de la même manière queramfs
, sauf qu’il peut utiliser l’espace de permutation si vous en avez un. Par exemple, si vous avez besoin de RAM pour autre chose, les algorithmes les moins récemment utilisés peuvent sélectionner des blocs de données dans tmpfs et les échanger sur le disque.La plupart des gens s'en tiennent à cela
tmpfs
, car cela vous permet également de limiter la taille totale et d'afficher l'espace utilisé correctement, par exemple dans ladf
commande. Je ne sais pas pourquoi cette différence existe. La limite de tailletmpfs
vous évite de remplir accidentellement toute votre RAM et de tuer votre système. La valeur par défaut est la moitié de votre RAM.Autres raisons pour lesquelles les écritures peuvent ralentir
Ce qui précède est une simplification adaptée à votre cas. Les écritures dans les fichiers de votre cas ne devraient pas avoir besoin d'attendre le disque. Cependant, il y a quelques cas d'écritures qui le font. Voir l'excellent article de blog Pourquoi les écritures tamponnées sont parfois bloquées . Le cas le plus surprenant est une modification récente de Linux appelée "écritures de pages stables".
la source