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 du
en /dev
da 804K
.
¿Ese es el problema? ¿Puedo superar ese /dev
tamaño?
mount -o size=16G -t tmpfs none /mnt/tmpfs
Respuestas:
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:
fuente
tmpfs
puede usar el intercambio, que probablemente no desee en un disco RAM puro.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 largomake
plazo 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 detmpfs
) puede ralentizar las cosas (al restringir la memoria de compilación, los archivos en RAMdisk otmpfs
no pueden ser utilizado directamente desde allí).fuente
tmpfs
no son de uso común para almacenar ejecutables (los RAMdisks son un remanente de los viejos tiempos de disquetes insoportablemente lentos y tal,tmpfs
es para datos temporales estrictos), nadie ha considerado lo suficientemente importante como para agregar los hacks feos necesarios.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.
fuente
blockdev --flushbufs
.Documentation/blockdev/ramdisk.txt
en 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.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:
Probablemente un poco de penalización de rendimiento al pasar por varias capas diferentes ... pero al menos funciona.
fuente
Además
tmpfs
yramfs
, otra opción es el/dev/ram0
dispositivo de bloqueo. En versiones recientes de Ubuntu, este dispositivo no existe de forma predeterminada, pero se puede crear a través demodprobe brd
.Este enfoque es más predecible ya que crea un
ext4
sistema 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:
El
rd_nr
parámetro especifica cuántos discos RAM crear (de forma predeterminada, crea 16, es decir,/dev/ram0
hasta/dev/ram15
). Elrd_size
pará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
brd
módulo del núcleo:Crear un dispositivo de bloque dentro
ramfs
Alternativamente, puede crear un dispositivo de bloque dentro de
ramfs
:El
truncate
comando 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:
Comparación con
tmpfs
yramfs
Aunque
tmpfs
yramfs
son más eficientes que usar un dispositivo de bloque, a continuación se detallan algunos de sus inconvenientes.tmpfs
puede cambiar al disco. Esto es más eficiente, pero puede haber ocasiones en que desee un disco RAM puro:ramfs
es 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
df
utilidad no informa el uso del espacio: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 elramfs
hasta el destino, mi sistema dejó de responder. Lacp
utilidad aparentemente llenó los agujeros en la lectura , pero no en la escritura.Ambos
tmpfs
yramfs
pueden comportarse de manera diferente a unext4
sistema de archivos real . La creación de un dispositivo de bloque en la memoria RAM y la inicialización conext4
evita esto.Para una comparación más profunda: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
fuente
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.
fuente
mkfs.ext2
Puede montar un
ramfs
sistema 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.- 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 comoramfs
puede acelerarlas. Otra estrategia es intentar deshabilitarfsync()
coneatmydata
/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
tmpfs
funciona igual queramfs
, 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 eldf
comando. No estoy seguro de por qué existe esta diferencia. El límite de tamaño lotmpfs
protege 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".
fuente