Crear un disco ram en Linux


70

Tengo una máquina con 62 GB de RAM y una troncal de solo 7 GB, así que pensé en crear un disco RAM y compilar allí. No soy un experto en Linux. Encontré instrucciones en Internet para crear el disco RAM:

mkfs -q /dev/ram1 8192

pero cambié el 8192 a 16777216 en un intento de asignar 16 GB de disco RAM.

Tuve el siguiente error:

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

En ese momento me asusté y salí.

sudo dmidecode --type 17 | grep Size

muestra

8x8192MB + 2048MB = 67584 MB

pero duen /devda 804K.

¿Ese es el problema? ¿Puedo superar ese /devtamaño?


15
¿Intentaste tmpfs? Es un sistema de archivos en RAM, no necesita ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

¡Eso funciono! ¡Gracias! Pero hasta ahora, no hay mucha aceleración: creo que las herramientas que estoy usando para construir todavía usan el disco normal. Pondré más cosas en el disco RAM.
Frank

3
Poner las herramientas en el disco de ram no debería hacer mucha diferencia ya que el núcleo las almacenará en caché de todos modos en ram.
t-8ch

1
@goldilocks Es una evidencia anecdótica, pero al compilar nuestros proyectos Java con Maven, hay una aceleración significativa al usar un disco RAM. Sin embargo, supongo que esto se debe más al tiempo de búsqueda que al tiempo de lectura.
SpellingD

1
/ dev / shm, en realidad / run / shm , se puede usar; Casi siempre está ahí.
Camille Goudeseune

Respuestas:


78

La mejor manera de crear un disco RAM en Linux es tmpfs. Es un sistema de archivos que vive en RAM, por lo que no hay necesidad de ext2. Puede crear un tmpfs de 16 Gb de tamaño con:

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

2
en mi sistema, sin nada en absoluto en / mnt, dice: ls: no se puede acceder / mnt / tmpfs: No existe tal archivo o montaje de directorio: punto de montaje / mnt / tmpfs no existe. ¿Es algo de lo que preocuparse? Si simplemente mkdir / mnt / tmpfs, eso no cumple con el propósito (al crear tmpfs en el disco normal; por favor, no hay llamas, soy un principiante aquí).
Frank

9
Necesita un punto de montaje (directorio) como destino, por lo que después de crear este directorio (puede usar cualquier directorio, los contenidos existentes están sombreados) puede montarlo con el comando de la respuesta.
t-8ch

1
tmpfspuede usar el intercambio, que probablemente no desee en un disco RAM puro.
palswim

2
@RomanSusi tmpfs es el tipo de archivo (pasado después de -t). "none" es el dispositivo de respaldo ("disco") que no existe para tmpfs
t-8ch

1
Vale la pena señalar que especificar el tamaño es opcional. Su valor predeterminado es la mitad de RAM. No hay gastos generales al especificar un tamaño más alto, todo lo que hace es establecer un límite, para protegerse de usar accidentalmente toda su RAM y matar el sistema.
sourcejedi

20

Linux es muy eficiente en el uso de RAM. Hay poca sorpresa con la que ves poca o ninguna aceleración tmpfs. Las piezas más grandes para leer en la memoria (y así poder ralentizar el proceso) son las herramientas (compilador, ensamblador, enlazador), y en un largo makeplazo se cargarán en la memoria al inicio y nunca lo abandonarán. Lo que queda es leer en la fuente (la escritura de los resultados no lo ralentizará, a menos que tenga una restricción severa de memoria). Una vez más, los archivos de encabezado comon permanecerán, solo la fuente del usuario requerirá lectura. Y es poco probable que sea más de unos pocos megabytes. La creación de un gran disco RAM (o incluso mucho uso de tmpfs) puede ralentizar las cosas (al restringir la memoria de compilación, los archivos en RAMdisk o tmpfs no pueden ser utilizado directamente desde allí).


1
¡Qué! ¿Cómo no se pueden usar directamente desde allí?
Kazark

Están en RAM, pero no en un formato que sea directamente utilizable.
vonbrand

2
¡De Verdad! ¿Cómo es eso? (Perdón por mi lentitud.)
Kazark

8
@Kazark, para manejar ejecutables en memoria se utilizan estructuras de datos especiales. Como los RAMdisks y tmpfsno son de uso común para almacenar ejecutables (los RAMdisks son un remanente de los viejos tiempos de disquetes insoportablemente lentos y tal, tmpfses para datos temporales estrictos), nadie ha considerado lo suficientemente importante como para agregar los hacks feos necesarios.
vonbrand

77
Intenté ejecutar mi código de rieles desde un sistema de archivos tmpfs (RAM), y no vi ninguna diferencia en absoluto. Realmente esperaba una diferencia notable, pero me decepcionó lo increíble que es Linux.
Khaja Minhajuddin

6

El problema es que el tamaño máximo de un ramdisk, más específicamente del tamaño de la memoria a la que se puede acceder a través del controlador de ramdisk se configura en tiempo de compilación, se puede sobrescribir en el momento del arranque, pero permanece fijo una vez que el núcleo se carga en la memoria. El valor predeterminado probablemente se mide en megabytes. Si recuerdo correctamente, la memoria para un disco ram está reservada justo cuando se carga el controlador, todos los discos ram son del mismo tamaño y hay unos 16 discos ram por defecto. Así que ni siquiera quieres un tamaño de ramdisk de 16G :-)

Como se indicó en la otra respuesta, tmpfs es lo que desea usar. Además, no ganará mucho si tiene todo su sistema operativo en un disco ram / disco / tmpfs. Simplemente copie su builddir a un tmpfs y luego haga su compilación. Es posible que deba asegurarse de que todos los resultados temporales se escriban en una ubicación que también se encuentre en tmpfs.


En realidad, no usan memoria hasta que les escribes cosas. El límite de tiempo de arranque es solo el límite. Incluso después de llenar uno, puede volver a liberar la memoria blockdev --flushbufs.
psusi

@psusi: ¿puede darnos más información al respecto? Solo puedo encontrar declaraciones que mencionen que una vez reclamado por la memoria ramdisk nunca se reclama, por ejemplo, Documentation/blockdev/ramdisk.txten las fuentes del núcleo. Y en mi respuesta: ese archivo también dice que el ramdisk crece a medida que se consume memoria, por lo que no se asigna todo a la vez.
Bananguin

¿Qué tipo de información? Ejecutas el comando y libera el carnero, suponiendo que aún no lo tienes montado de todos modos.
psusi

¿Cómo sabe que el comando hace lo que usted dice que hace? Su página de manual no confirma eso y se puede entender que la documentación en el árbol de fuentes del núcleo contradice su información.
Bananguin

66
Leí el código fuente y lo verifiqué probándolo.
psusi

3

Para hacer un gran disco RAM después del arranque, sin perder el tiempo con los parámetros del kernel, esto parece funcionar. Use tmpfs, cree un archivo, móntelo mediante un bucle y móntelo mediante un sistema de archivos:

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/

Probablemente un poco de penalización de rendimiento al pasar por varias capas diferentes ... pero al menos funciona.


3

Además tmpfsy ramfs, otra opción es el /dev/ram0dispositivo de bloqueo. En versiones recientes de Ubuntu, este dispositivo no existe de forma predeterminada, pero se puede crear a través de modprobe brd.

Este enfoque es más predecible ya que crea un ext4sistema de archivos real y nunca excede el límite que especifique. Pero se requieren más pasos para configurarlo y usa la RAM de manera menos eficiente.

Usando el módulo kernel brd (/ dev / ram0)

Para crear e inicializar un disco RAM de 4GB:

mkdir /ramdisk

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

El rd_nrparámetro especifica cuántos discos RAM crear (de forma predeterminada, crea 16, es decir, /dev/ram0hasta /dev/ram15). El rd_sizeparámetro es el tamaño en kilobytes . La $(( ... ))sintaxis le permite hacer aritmética en el shell.

Para desasignar el disco RAM, desmóntelo y retire el brdmódulo del núcleo:

umount /ramdisk
modprobe -r brd

Crear un dispositivo de bloque dentro ramfs

Alternativamente, puede crear un dispositivo de bloque dentro de 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

El truncatecomando crea un archivo vacío de un tamaño determinado de modo que se inicializa (es decir, consume memoria) a pedido.

Para desasignar el disco RAM, desmóntelo y elimine la imagen del disco:

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

Comparación con tmpfsyramfs

Aunque tmpfsy ramfsson más eficientes que usar un dispositivo de bloque, a continuación se detallan algunos de sus inconvenientes.

tmpfspuede cambiar al disco. Esto es más eficiente, pero puede haber ocasiones en que desee un disco RAM puro:

  • Los archivos con los que está trabajando son confidenciales (por ejemplo, archivos de una partición cifrada).
  • Está realizando pruebas de rendimiento y no desea que la E / S de disco sea un factor (los tiempos de escritura de SSD pueden variar mucho).
  • Está desempacando un archivo grande y no desea desgastar su SSD.

ramfses fácil de configurar, recupera espacio una vez que elimina los archivos y usa la RAM de manera más eficiente (el sistema no almacena los archivos en el búfer porque sabe que están en la RAM). Pero tiene sus propios inconvenientes y sorpresas:

  • La dfutilidad no informa el uso del espacio:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • No hay parámetro de límite de tamaño. Si coloca demasiado en el disco RAM, su sistema se bloqueará.

  • Los archivos dispersos pueden volverse dispersos cuando menos lo esperas. Esta mañana, copié una imagen de VM (150G, pero 49G utilizada en el disco) a ramfs(tengo 128G de RAM). Eso funciono. Pero cuando he copiado desde el ramfshasta el destino, mi sistema dejó de responder. La cputilidad aparentemente llenó los agujeros en la lectura , pero no en la escritura.

Ambos tmpfsy ramfspueden comportarse de manera diferente a un ext4sistema de archivos real . La creación de un dispositivo de bloque en la memoria RAM y la inicialización con ext4evita esto.

Para una comparación más profunda: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

OP la cantidad de RAM se expresa en MB. Entonces, todo lo que necesita para ingresar allí es 16384. Y listo, estaría en el negocio.


1
No. "Si fs-size no tiene un sufijo, se interpreta como potencia de dos kilobytes". - hombremkfs.ext2
sourcejedi

1

Puede montar un ramfssistema de archivos, copiar su proyecto en él y trabajar desde allí. Esto garantiza que sus archivos de entrada se carguen en la RAM y no se volverán a leer desde la unidad de disco mucho más lenta. Sin embargo, como descubrió, esto generalmente no es una estrategia útil. Ya obtienes exactamente el mismo beneficio.

Ramfs es un sistema de archivos muy simple que exporta los mecanismos de almacenamiento en caché de disco de Linux (el caché de página y el caché de rechazo) como un sistema de archivos basado en RAM que se puede cambiar dinámicamente.

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

Ya puede confiar en que sus archivos de entrada se almacenan en caché en la RAM, la primera vez que se leen. Sus archivos de salida también se almacenan en caché, de modo que no espere a que se escriban en el disco.

No hay un límite artificial sobre cuánto puede almacenar en caché, cuánto tiempo permanece en caché, etc. Las cachés solo comienzan a eliminarse una vez que ha llenado la RAM. El caché que se cae primero se elige mediante algoritmos terriblemente elaborados. La primera aproximación es que la describimos como Menos utilizada recientemente. Consulte ¿Qué algoritmos de reemplazo de página se usan en el kernel de Linux para el caché de archivos del sistema operativo?

Tenga en cuenta que su editor de texto guardará explícitamente los fsync()archivos en el disco.

Si ejecuta pruebas de un programa que involucra fsync(), ejecutarlas en un sistema de archivos como ramfspuede acelerarlas. Otra estrategia es intentar deshabilitar fsync()con eatmydata/ nosync.so.

Algunos otros sistemas operativos pueden tener limitaciones específicas, que pueden pasarse por alto utilizando un disco RAM. En un extremo, la falta de cualquier archivo de caché es la razón por discos ram fueron populares en DOS .

tmpfs

tmpfsfunciona igual que ramfs, excepto que puede usar espacio de intercambio si tiene uno. Es decir, si necesita RAM para otra cosa, los algoritmos menos utilizados recientemente pueden seleccionar bloques de datos de tmpfs y cambiarlos al disco.

La mayoría de las personas se apegan tmpfs, porque también le permite limitar el tamaño total y muestra el espacio utilizado correctamente, por ejemplo, en el dfcomando. No estoy seguro de por qué existe esta diferencia. El límite de tamaño lo tmpfsprotege de llenar accidentalmente toda su RAM y básicamente de matar su sistema. Su valor predeterminado es la mitad de su RAM.

Otras razones por las que las escrituras pueden ralentizarse

Lo anterior es una simplificación adaptada a su caso. Las escrituras en archivos en su caso no deberían necesitar esperar al disco. Sin embargo, hay algunos casos de escrituras que sí. Vea la excelente publicación de blog Por qué las escrituras almacenadas en búfer a veces se estancan . El caso más sorprendente es un cambio reciente a Linux llamado "escritura de página estable".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.