Creazione di un disco ram su Linux


70

Ho una macchina con 62 GB di RAM e un trunk che è solo 7 GB, quindi ho pensato di creare un disco RAM e compilarlo lì. Non sono un esperto di Linux. Ho trovato istruzioni su Internet per creare il disco RAM:

mkfs -q /dev/ram1 8192

ma ho modificato l'8192 in 16777216 nel tentativo di allocare 16 GB di disco ram.

Ho ricevuto il seguente errore:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

A quel punto mi sono spaventato e salvato.

sudo dmidecode --type 17 | grep Size

Spettacoli

8x8192MB + 2048MB = 67584 MB

ma dusu /dev804K.

È questo il problema? Posso superare quella /devdimensione?


15
Hai provato tmpfs? È un filesystem nella RAM, non è necessario ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
2713

Ha funzionato! Grazie! Ma finora, non molta accelerazione: penso che gli strumenti che sto usando per costruire stiano ancora usando il normale disco. Metterò più roba sul disco ram.
Frank,

3
Mettere gli strumenti stessi sul ramdisk non dovrebbe fare molta differenza poiché il kernel li memorizzerà comunque nella cache di ram.
t-8ch

1
@goldilocks È un'evidenza aneddotica, ma quando si compilano i nostri progetti Java con Maven, c'è un notevole aumento di velocità quando si utilizza un ramdisk. Immagino però che questo sia più dovuto al tempo di ricerca che al tempo di lettura.
OrtografiaD

1
/ dev / shm, in realtà / run / shm , può essere usato; è quasi sempre lì.
Camille Goudeseune,

Risposte:


78

Il modo migliore per creare un disco ram su Linux è tmpfs. È un filesystem che vive in ram, quindi non è necessario ext2. Puoi creare un tmpfs di 16 GB con:

mount -o size=16G -t tmpfs none /mnt/tmpfs

2
sul mio sistema, senza nulla in / mnt, dice: ls: impossibile accedere a / mnt / tmpfs: non esiste un tale file o directory mount: mount point / mnt / tmpfs. È qualcosa di cui preoccuparsi? Se semplicemente mkdir / mnt / tmpfs, questo sconfigge lo scopo (creando tmpfs sul disco normale - per favore niente fiamme, sono un principiante qui).
Frank,

9
È necessario un mountpoint (directory) come destinazione, quindi dopo aver creato questa directory (è possibile utilizzare qualsiasi directory, i contenuti esistenti vengono ombreggiati) è possibile montarlo con il comando dalla risposta.
t-8ch

1
tmpfspuò usare lo swap, che probabilmente non si desidera in un disco RAM puro.
Palswim,

2
@RomanSusi tmpfs è il tipo di file (passato dopo -t). "none" è il dispositivo di backup ("disco") che non esiste per tmpfs
t-8ch

1
Vale la pena notare che specificare la dimensione è facoltativo. L'impostazione predefinita è metà della RAM. Non è necessario specificare una dimensione maggiore, basta impostare un limite per proteggersi dall'uso accidentale di tutta la RAM e dall'uccisione del sistema.
sourcejedi,

20

Linux è molto efficiente nell'uso della RAM. C'è una piccola sorpresa nel vedere poco o nessun aumento di velocità tmpfs. I pezzi più grandi da leggere in memoria (e quindi in grado di rallentare il processo) sono gli strumenti (compilatore, assemblatore, linker), e in breve maketempo verranno caricati in memoria all'avvio e non lo lasceranno mai. Ciò che rimane è la lettura alla fonte (la scrittura dei risultati non ti rallenterà, a meno che non sia fortemente limitata la memoria). Ancora una volta, i file di intestazione comon rimarranno in giro, solo la fonte dell'utente richiederà la lettura. E 'improbabile che sia più di qualche megabyte. La creazione di un disco RAM di grandi dimensioni (o anche un uso eccessivo tmpfs) può rallentare molto bene le cose (rendendo vincolata la memoria di compilazione, i file su RAMdisk o su tmpfs non possono essere utilizzato direttamente da lì).


1
Che cosa! Come possono non essere utilizzati direttamente da lì?
Kazark,

Sono in RAM, ma non in un formato direttamente utilizzabile.
vonbrand,

2
Veramente! Come mai? (Perdonate la mia lentezza.)
Kazark,

8
@Kazark, per gestire gli eseguibili in memoria vengono utilizzate strutture dati speciali. Poiché i dischi RAM e tmpfsnon sono di uso comune per archiviare gli eseguibili (i dischi RAM sono un residuo dei bei vecchi tempi dei floppy disk tmpfsestremamente lenti e simili, sono per dati temporanei rigorosi), nessuno ha ritenuto abbastanza importante aggiungere gli hack brutti richiesti.
vonbrand,

7
Ho provato a far funzionare il mio codice rails da un filesystem tmpfs (RAM) e non ho notato alcuna differenza. Speravo davvero una notevole differenza, ma sono rimasto deluso da quanto sia fantastico Linux.
Khaja Minhajuddin

6

Il problema è che la dimensione massima di un ramdisk, in particolare la dimensione della memoria a cui è possibile accedere tramite il driver ramdisk è configurata in fase di compilazione, può essere sovrascritta all'avvio, ma rimane fissa una volta che il kernel è stato caricato in memoria. Il valore predefinito è probabilmente misurato in Megabyte. Se ricordo bene che la memoria di un ramdisk è riservata proprio quando il driver è caricato, tutti i ramdisk hanno le stesse dimensioni e ci sono circa 16 ramdisk di default. Quindi nemmeno tu vuoi una dimensione di ramdisk di 16G :-)

Come affermato nell'altra risposta, tmpfs è ciò che si desidera utilizzare. Inoltre, non vincerai molto avendo l'intero sistema operativo in un ramdisk / tmpfs. Basta copiare il tuo builddir su un tmpfs ed eseguire la compilazione. Potrebbe essere necessario assicurarsi che tutti i risultati temporanei vengano scritti in una posizione presente anche nel file tmpfs.


In realtà non usano memoria fino a quando non scrivi loro qualcosa. Il limite del tempo di avvio è solo il limite. Anche dopo averne riempito uno puoi liberare il backup della memoria blockdev --flushbufs.
psusi,

@psusi: puoi darci maggiori informazioni a riguardo? Posso solo trovare dichiarazioni che menzionano che una volta rivendicato dalla memoria ramdisk non viene mai recuperato, ad esempio nei Documentation/blockdev/ramdisk.txtsorgenti del kernel. E sulla mia risposta: quel file dice anche che il ramdisk cresce man mano che la memoria viene consumata, quindi non viene allocata tutta in una volta.
Bananguin

Che tipo di informazioni? Esegui il comando e libera il ram, supponendo che non lo abbia comunque montato.
psusi

Come fai a sapere che il comando fa quello che dici che fa? La sua pagina man non lo conferma e la documentazione nella struttura dei sorgenti del kernel può essere intesa in contraddizione con le tue informazioni.
Bananguin

6
Ho letto il codice sorgente e l'ho verificato provandolo.
psusi

3

Per creare un disco ram di grandi dimensioni dopo l'avvio, senza problemi con i parametri del kernel, questo sembra funzionare. Usa tmpfs, crea un file, montalo tramite loop e montalo tramite un filesystem:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

Probabilmente un po 'di penalità per le prestazioni che attraversano più livelli diversi ... ma almeno funziona.


3

Inoltre tmpfse ramfs, un'altra opzione è il /dev/ram0dispositivo a blocchi. Nelle recenti versioni di Ubuntu, questo dispositivo non esiste per impostazione predefinita, ma può essere creato tramite modprobe brd.

Questo approccio è più prevedibile poiché crea un vero ext4filesystem e non supera mai il limite specificato. Ma ci vogliono più passaggi per configurare e usa la RAM in modo meno efficiente.

Uso del modulo del kernel brd (/ dev / ram0)

Per creare e inizializzare un disco RAM da 4 GB:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

Il rd_nrparametro consente di specificare il numero di dischi RAM da creare (per impostazione predefinita, crea 16, ovvero /dev/ram0attraverso /dev/ram15). Il rd_sizeparametro è la dimensione in kilobyte . La $(( ... ))sintassi consente di eseguire l'aritmetica nella shell.

Per deallocare il disco RAM, smontalo e rimuovi il brdmodulo del kernel:

umount /ramdisk
modprobe -r brd

Creazione di un dispositivo a blocchi all'interno ramfs

In alternativa, puoi creare un dispositivo a blocchi all'interno di ramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

Il truncatecomando crea un file vuoto di una determinata dimensione in modo che sia inizializzato (cioè consuma memoria) su richiesta.

Per deallocare il disco RAM, smontarlo ed eliminare l'immagine del disco:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

Confronto con tmpfseramfs

Sebbene tmpfse ramfssiano più efficienti dell'uso di un dispositivo a blocchi, di seguito sono riportati alcuni dei lati negativi.

tmpfspuò passare al disco. Questo è più efficiente, ma a volte potresti volere un disco RAM puro:

  • I file con cui stai lavorando sono sensibili (ad es. File da una partizione crittografata).
  • Stai eseguendo test delle prestazioni e non vuoi che l'I / O del disco sia un fattore (i tempi di scrittura SSD possono variare molto).
  • Stai scompattando un file di grandi dimensioni e non vuoi consumare il tuo SSD.

ramfsè facile da configurare, recupera spazio una volta eliminati i file e utilizza la RAM in modo più efficiente (il sistema non memorizza i file perché sa che sono nella RAM). Ma ha i suoi lati negativi e sorprese:

  • L' dfutilità non segnala l'utilizzo dello spazio:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • Non esiste un parametro limite di dimensioni. Se si inserisce troppo nel ramdisk, il sistema si bloccherà.

  • I file sparsi possono diventare sparsi quando meno te lo aspetti. Questa mattina ho copiato un'immagine VM (150G, ma 49G utilizzata su disco) su ramfs(ho 128G di RAM). Ha funzionato Ma quando ho copiato dalla per la destinazione, il mio sistema è diventato insensibile. L' utilità apparentemente ha riempito i buchi in lettura , ma non in scrittura.ramfscp

Entrambi tmpfse ramfspossono comportarsi diversamente da un vero ext4filesystem. La creazione di un dispositivo a blocchi nella RAM e l'inizializzazione con ext4questo evita questo.

Per un confronto più approfondito: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

OP la quantità di RAM è espressa in MB. Quindi tutto ciò che serve per entrare è il 16384. E poi voilà saresti in affari.


1
No. "Se fs-size non ha un suffisso, viene interpretato come potenza di due kilobyte." - uomomkfs.ext2
sourcejedi

1

Puoi montare un ramfsfilesystem, copiare il tuo progetto in esso e lavorare da lì. Ciò garantisce che i file di input vengano caricati nella RAM e non verranno riletti dall'unità disco molto più lenta. Tuttavia, come hai scoperto, questa non è generalmente una strategia utile. Ottieni già lo stesso vantaggio.

Ramfs è un file system molto semplice che esporta i meccanismi di memorizzazione nella cache del disco di Linux (cache delle pagine e cache dentry) come file system basato su RAM ridimensionabile dinamicamente.

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Puoi già fidarti che i tuoi file di input sono memorizzati nella cache nella RAM, la prima volta che vengono letti. Anche i file di output vengono memorizzati nella cache, in modo da non aspettare che vengano scritti su disco.

Non esiste un limite artificiale alla quantità di cache, alla durata della memorizzazione nella cache, ecc. Le cache iniziano a essere eliminate solo dopo aver riempito la RAM. La cache che viene rilasciata per prima viene scelta da algoritmi elaborati in modo terrificante. La prima approssimazione è che la descriviamo come meno utilizzata di recente. Vedi Quali algoritmi di sostituzione della pagina vengono utilizzati nel kernel Linux per la cache dei file del sistema operativo?

Nota il tuo editor di testo fsync()salverà esplicitamente i file su disco.

Se si eseguono test di un programma che coinvolge fsync(), eseguirli in un file system come ramfspotrebbe accelerarli. Un'altra strategia è provare e disabilitare fsync()con eatmydata/ nosync.so.

Alcuni altri sistemi operativi potrebbero avere limiti specifici, che possono essere bypassati utilizzando un ramdisk. Ad un'estremità, la mancanza di qualsiasi file di cache è il motivo per cui ramdisk erano popolari su DOS .

tmpfs

tmpfsfunziona allo stesso modo ramfs, tranne per il fatto che può usare lo spazio di swap se ne hai uno. Ad esempio, se hai bisogno di RAM per qualcos'altro, gli algoritmi utilizzati di recente possono selezionare blocchi di dati da tmpfs e scambiarli su disco.

La maggior parte delle persone si attacca tmpfsperché consente anche di limitare le dimensioni totali e mostra lo spazio utilizzato correttamente, ad es. Nel dfcomando. Non sono sicuro del perché questa differenza esista. Il limite di dimensione tmpfsti protegge dal riempire accidentalmente l'intera RAM e dall'uccidere sostanzialmente il tuo sistema. L'impostazione predefinita è metà della RAM.

Altri motivi per cui le scritture possono rallentare

Quanto sopra è una semplificazione su misura per il tuo caso. Le scritture su file nel tuo caso non dovrebbero dover attendere il disco. Tuttavia ci sono alcuni casi di scritture che lo fanno. Vedi l'eccellente post sul blog Perché a volte le scritture bufferizzate sono bloccate . Il caso più sorprendente è una recente modifica a Linux chiamata "scritture di pagine stabili".

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.