¿Cómo aumentar la memoria virtual y / o el intercambio de Ubuntu para Matlab?


16

Situación: corrija Out of Memoryerrores en el
objetivo Matlab de Ubuntu : asigne un poco de memoria virtual y / o intercambie en HDD / SSD externo; la lectura / escritura disminuye de 20 GBps a 0.1 GBps, ¡lo cual está bien!
Terminología: intercambio y memoria virtual aquí

No, el intercambio y la memoria virtual son completamente diferentes. Por ejemplo, la asignación de memoria de un archivo de 1 GB utiliza 1 GB adicional de memoria virtual pero no cambia el uso de intercambio. Swap es una forma de tienda de respaldo. Muchos usos de la memoria virtual no tienen nada que ver con la tienda de respaldo. (Y ha habido sistemas con memoria virtual y sin intercambio, así como sistemas con intercambio pero sin memoria virtual).

El hardware del consumidor es limitado, así que necesito usar más memoria virtual y / o intercambiar con mis discos duros externos. Matlab dice acerca de la memoria de intercambio (¿TODO excluyendo la memoria virtual?)

Sistemas Linux: cambie su espacio de intercambio utilizando los comandos mkswapy swapon.

Características del sistema.

  • Puedes ver cuánto lo tienes swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Configuraciones de Matlab

    % /programming//a/35971040/54964
    com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB
    
    % TODO cannot find ways how to put Matlab use /dev/sda3
    
  • Entonces ves que mi Matlab no lo está usando. Recibo Out of Memoryerrores con matrices grandes en Matlab. No he tenido éxito en reshapeincorporar matrices a vectores y escribir código paralelo. Entonces quiero usar memoria virtual porque necesito hacer el trabajo; La tasa no importa.

Pseudocódigo

  1. Script de shell que crea un intercambio, inicia MATLAB y elimina el intercambio cuando sale de MATLAB. ( MichaelHooreman )
  2. Habilite el intercambio en HDD externo. ¿Cómo usarlo sudo swapon -aaquí?
  3. Comience Matlab.
  4. Ponga a Matlab usando el intercambio.
  5. Eliminar intercambio cuando Matlab sale.

Intercambio temporal, ejecución de cliente y cierre / eliminación de intercambio en el script de Micheal

Situación : no se pueden controlar los errores al configurar el entorno (1), ejecutar Matlab (2) y cerrar el
script de entorno (3)

#!/usr/bin/env bash

# /programming//a/69808/54964
set -e 
# TODO How to do swapoff if any error?

SWAP_FILE="/media/masi/SamiSwapVirtual/.swap_file_20.7.2016"
SIZE_MB=16000
TO_RUN="matlab"

dd if="/dev/zero" of=${SWAP_FILE} bs="1M" count=${SIZE_MB} status="progress"
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo chown 0.0 ${SWAP_FILE} # /unix//a/297153/16920
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}

Iteración 1 con Transcend 25M3 1 TB con poco uso berofe donde sistema de archivos ext4

  1. Registros después de comenzar el script

    sh start_matlab_with_swap.sh 
    16000+0 records in
    16000+0 records out
    16777216000 bytes (17 GB, 16 GiB) copied, 134.489 s, 125 MB/s
    Setting up swapspace version 1, size = 15.6 GiB (16777211904 bytes)
    no label, UUID=48c2835b-4499-4534-aa49-0648e15bd5d9
    [sudo] password for masi: 
    swapon /media/masi/SamiWeek/tmp/swap_file_18.7.2016
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: insecure file owner 1000, 0 (root) suggested.
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: found swap signature: version 1d, page-size 4, same byte order
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: pagesize=4096, swapsize=16777216000, devsize=16777216000
    Swap enabled. Press enter to continue
    start_matlab_with_swap.sh: 11: read: arg count
    
  2. Ejecutando el cliente

    • El historial de comandos desapareció en el primer inicio de Matlab en la memoria de intercambio (ticket # 02075943), con el error Hubo un problema al leer su historial de comandos - - . Simplemente reinicie su Matlab y el problema se resolverá si tiene la configuración predeterminada. El comando prefdirda /home/masi/.matlab/R2016acuál es la ubicación predeterminada ( /home/{username}/.matlab/R2016a. El archivo /home/masi/.matlab/R2016a/matlab.prfexiste después del reinicio, aquí .

    • ... [otros errores] ...

  3. Cerrando Matlab y escribiendo la contraseña nuevamente en la Terminal

    [sudo] password for masi: 
    swapoff /media/masi/SamiWeek/tmp/swap_file_18.7.2016
    [ bugs here! ]
    

Abierto: Cómo aplicar la mejor gestión de errores de captura de errores aquí? Vea mi script para el ejemplo en la fuente. Enhebrar Cómo hacer Errores de captura y si swapoff error / advertencia?

De intercambio permanente = El programa de intercambio independiente del cliente en marcha

Configurar Swap

# /unix//q/297767/16920
masi@masi:~$ sudo fallocate -l 20G /mnt/.swapfile

masi@masi:~$ sudo mkswap /mnt/.swapfile 
Setting up swapspace version 1, size = 20 GiB (21474832384 bytes)
no label, UUID=45df9e48-1760-47e8-84d7-7a14f56bbd72

masi@masi:~$ sudo swapon /mnt/.swapfile
swapon: /mnt/.swapfile: insecure permissions 0644, 0600 suggested.

masi@masi:~$ sudo chmod 600 /mnt/.swapfile

masi@masi:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7925        1494         175         196        6255        5892
Swap:         28610           0       28610

Ponga lo siguiente al final de /etc/fstabpara el cambio permanente

# /unix//a/298212/16920
# /unix//a/298543/16920

# If swap is on SSD, trim blocks each time at startup.
#/mnt/.swapfile  none    swap    defaults,discard      0        0

# If swap on External HDD, just use sw.
/media/masi/SamiWeek/.swapfile  none    swap    sw      0        0

Sistema: Linux Ubuntu 16.04 64 bit
Kernel de Linux: 4.6
Opciones de kernel de Linux: wl
Matlab: 2016a
Documentos oficiales de Matlab: Resolver errores de "memoria
insuficiente " HDD externo: Transcend 1 TB StoreJet 25M3 revisión , Transcend 2 TB StoreJet 25M3 Sistema
de archivos HDD externo: ext4
tampón externa de disco duro: 8 MB
temas relacionados: ¿Cómo aumentar la limitación de memoria MATLAB en ubuntu? (¿Cómo usar mkswap, swapon para MATLAB?) , ¿Cómo reducir el aumento de memoria física en Matlab? , Cómo resolver error de memoria en Matlab? , Cómo arreglar error de memoria en Matlab para 10800x10800 matriz? ,¿Cómo aumento el límite de memoria (contigua y general) en Matlab r2012b? , Cómo aumentar la matriz del bloque y resolver fuera de error de memoria en Matlab 2009b? , De cómo resolver este problema de memoria Fuera de una pequeña variable en Matlab? , 'Fuera de memoria' en Matlab. Un lento pero una solución permanente?


44
Lo siento, esto no responde la pregunta. ¿Pero estás seguro de que quieres esto? Hacer cálculos desde el intercambio lleva mucho tiempo. Ram lee al menos 20 GB por segundo, su HDD externo leerá a menos de 0.1 GBps
Anake

1
@Anake Sí, lo sé. No es un problema. Tengo enormes matrices que se pueden calcular con 32/64 GB pero no con mi ultrabook actual de 8 GB. Todavía necesito hacer el cálculo en vacaciones.
Léo Léopold Hertz 준영

1
Otro comentario no útil lo siento. ¿Podría dejar un equipo en el en casa, así que usted podría SSH y ejecutar más de ellos en casa / uni?
Anake

@Anake No es posible, lo siento, por el momento. Además, Matlab aquí necesita computación local. Además, no tienen suficientes claves para hacerlo en este momento.
Léo Léopold Hertz 준영

¿Qué tiene de especial MATLAB en este contexto? No se trata simplemente de un duplicado de Cómo aumentar el espacio de intercambio?
steeldriver

Respuestas:


2

OK, toda una lista que tienes allí. Déjame responder en línea

  1. ¿Cómo aplicar el mejor manejo de errores de captura de errores aquí? Vea mi script para el ejemplo en la fuente. Thread How to Do Error-trapping and Swapoff if Error / Warning ?.

No me gusta el concepto de este guión en absoluto. Que tenga un disco duro externo que esté intentando usar como intercambio es solo una mala idea. Si realmente la intención de hacer esto sobre una base regular, entonces cambiar el tamaño de las particiones para poner una partición de intercambio apropiada en, añadir un archivo de intercambio, o simplemente comprar un disco interno más grande.

  1. ¿Cómo poner advertencias si el tamaño de la matriz excede el tamaño de intercambio?

Sólo hacer hacer los cálculos. Si conoce el tamaño de la matriz antes de que comience el programa, calcule el tamaño en MiB y compárelo con el intercambio disponible.

  1. ¿Cómo tener una barra de progreso en el cálculo de su enorme matriz en Matlab?

matlab tiene una API ¿verdad? No creo que este sea el foro adecuado para esa pregunta. Incluso si tuviera una API, estará bloqueando IO a través del intercambio, por lo que solo será una barra de progreso desigual que en realidad no refleja la realidad.

  1. Cómo matar el progreso ocupado y / o swapon -s / swapoff en la iteración (2)?

No lo hace. sólo porque haya terminado con el cálculo no significa que el sistema operativo se realiza con los recursos que asignan. Cuando llega la escritura llevando a cabo al canje, que va a liberar. Has consumido tanta memoria que muchas aplicaciones no pueden obtener la memoria que necesitan, por lo que también están usando el intercambio. Solo déjalo encendido y deja que el sistema operativo haga lo suyo. Antes de realizar su próxima ejecución, borre los cachés.

echo 3 > /proc/sys/vm/drop_caches 

Probablemente hay más que eso, no soy un experto en Linux VM. Valdría la pena investigar cómo funciona el asignador SLAB / SLUB y cómo ajustarlo para sus grandes requisitos de memoria. Es posible que pueda MLOQUEAR matlab en la memoria. Eso obliga al sistema operativo a reservar memoria para usted, o simplemente no se inicia, también debe desbloquearlo cuando haya terminado. Puedo hacer esto con la API de C muy bien, pero no estoy seguro de cómo lo harías fuera de un proceso que no puedo volver a compilar, que requeriría un poco de investigación.

Finalmente, este es el tipo de material para el que se creó EC2. Parece que 16G es lo que necesita, un m4.4xlarge tiene 64G de ram a $ 0.958 por hora. Eso es menos que una taza de café. Crea una secuencia de comandos para la instalación de matlab usando un amuleto juju o similar y convierte todo en un cómputo como servicio.

¿16G es 16 GB?

  • Sí, normalmente cuando dejamos el sufijo nos referimos a números de base2 en unidades de bytes. Si quieres concisar, escribirías 16GiB.

"Necesito matrices que sean> 100 GB. No sé si puedes hacerlo con EC2".

¿Deberías limpiar tus cachés también echo 3 > /proc/sys/vm/drop_caches?

  • Sí, no está de más hacer eso siempre. Consulte Documentation / sysctl / vm.txt en el kernel de Linux.

¿Cómo puedes MLOQUEAR a Matlab en la memoria?

  • man mlock. Aunque me burlé cuando lo cité. Esta llamada asegura que puede asignar toda la memoria que desee y evitar que se intercambie, nunca usará memoria virtual. Eso no es lo que quieres.

Creo que puedes vincular C API a Matlab. - - ¿Tiene alguna idea de desactivar el intercambio si hay algún fallo en los procesos?

  • Voy a ser franco aquí, el concepto de microgestión de archivos de intercambio de la manera que propones es ridículo. El trabajo del sistema operativo es administrar los recursos y distribuirlos de manera justa y consistente. Una vez que le des más recursos, los usará como mejor le parezca. No puedes decirlo cuando hayas terminado y sacar recursos de debajo, el sistema operativo te dice cuándo está hecho.

Cuando le pido al sistema operativo un espacio de direcciones de memoria, a veces no siempre tiene éxito, eso no significa que no pueda volver a intentarlo. Que matlab no puede resolver llamar a malloc dos veces es el problema de matlab.

Entonces, para afectar el cambio que desea, si esos 100G de espacio son realmente importantes, entonces necesita descubrir cómo decirle al sistema operativo que recorte su huella de memoria (limpiando cachés para principiantes) para que el administrador de memoria no lo haga. siente la necesidad de usar el espacio de intercambio adicional que se proporcionó. Entonces, y solo entonces, puede pedirle al administrador de memoria que libere el archivo de intercambio.

Es fácil hacer crecer cosas como la memoria y los discos, es mucho más difícil reducirlos. La reducción obliga a un reequilibrio de cada usuario que tiene recursos asignados en ese espacio. Si en su lugar dije "Tengo una matriz de almacenamiento de 100 TB pero ahora solo necesito 60 TB, ¿por qué cuando elimino 40 TB de disco la matriz deja de funcionar?" Bueno, la respuesta sería obvia ¿verdad?

Así que aquí están tus opciones tal como las veo.

  1. investigar la API C MATLAB para ver si usted puede conseguir un mejor control sobre cómo se asigna memoria para estos conjuntos de trabajo masivas.

  2. refactorizar su cómputo para calcular lo que tiene ahora el uso de sub-matrices o alguna otra representación de datos dispersos.

  3. escribir su propio programa en C / C ++ utilizando la gran cantidad de bibliotecas de álgebra lineal por ahí para realizar el cálculo y el uso malloco mmapel anonimato de asignar espacio de direcciones que necesita.


Sí, pero puede que no sea suficiente y puede que tenga que esperar y volver a intentarlo antes de que tenga éxito, si alguna vez lo hace.
ppetraki

1
je, el resto de tu comentario no apareció en mi teléfono inteligente. no puedes sudo hacer eco así, en su lugar hazlo. echo 3 | sudo tee /proc/sys/vm/drop_caches
ppetraki

Acepto esta respuesta porque tiene el sentido correcto en su respuesta. Ejecutar Client en el mismo script que configurar el entorno es muy propenso a errores. Más discusión al respecto aquí unix.stackexchange.com/a/298543/16920 - - Sería genial si pudieras limpiar tu cuerpo un poco.
Léo Léopold Hertz 준영

12

No puede dedicar el intercambio de un software. Lo que puede hacer es crear un script de shell que cree un intercambio, inicie MATLAB y elimine el intercambio cuando se cierre MATLAB.

Aquí hay un script de ejemplo que crea un intercambio de 10Mb en el directorio / tmp, lo monta, inicia R (no tengo matlab), espera a que R salga, desmonta el archivo de intercambio y lo elimina.

Tenga en cuenta que: - tendrá una advertencia porque el archivo de intercambio no es propiedad de root. Eso es porque el sistema utilizará si por cualquier software, tal vez no corrió por usted, y se puede leer en este archivo ... dejo a solucionarlo. - si [ctrl] - [c] el script, o cierra sesión, etc., el intercambio permanecerá montado. Te dejo arreglarlo también.

#!/usr/bin/env bash

SWAP_FILE=/tmp/my_swap_file
SIZE_MB=10
TO_RUN="R"

dd if=/dev/zero of=${SWAP_FILE} bs=1M count=${SIZE_MB}
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}

1
Bueno, en realidad no está dedicado a MATLAB, pero para cualquier situación que necesite temporalmente más RAM. Tenga en cuenta que swapon / swapoff necesita en este raíz (así: sudo)
Michael Hooreman

1
Si tu tienes. Así es como convertirse en root.
Michael Hooreman

Buena respuesta. Personalmente, abordaría esto y mantener mi propio script add-swap.sh para estos momentos encantadores cuando la memoria se come
Sergiy Kolodyazhnyy

Me concedieron la generosidad aquí porque me hizo que la forma correcta. Sin embargo no puedo aceptar la respuesta, porque la gestión de errores es muy difícil e incompleta. Lo mejor es configurar el intercambio por separado de ejecutar Matlab, consulte la respuesta aquí unix.stackexchange.com/a/298543/16920
Léo Léopold Hertz 준영

1

Así es como se puede ampliar su memoria SWAP usando un disco duro externo :

  • En primer lugar, escriba su memoria SWAP real ejecutando:

    free -m
    
  • En segundo lugar, tener a mano la carpeta de su disco duro. Debería ser algo así /media/myhdd.

  • Decidir el tamaño de SWAP adicional que desee agregar. Digamos, X GB.
  • Calcular la cantidad de bytes que es la cantidad. Usando GB, esto es: Y = X * 1024 ^ 3 , donde Y es el resultado del cálculo.
  • Elige el tamaño de bloque del archivo (que es en bytes). Vamos a usar el valor por defecto aquí: 4096 (Ver más sobre este aquí ).
  • Calcular el número de bloques en el archivo tendrá que: Z = S / 4096
  • Crear un archivo de tamaño X GB utilizando el siguiente comando en un terminal:

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • Cree el SWAP en el archivo usando:

    sudo mkswap /media/myhdd/swapfile -f
    
  • Finalmente, habilite el SWAP:

    sudo swapon -p 1000 /media/myhdd/swapfile
    

Ahora su SWAP ha aumentado. Verifique nuevamente confree -m


Podemos establecer esto en un script no interactivo ( sudopoderes necesarios):

#!/bin/bash

### Inputs ###

swap_GB=$(expr 1) # Enter here size of the swap memory to create, in GB.
swap_bs=$(expr 4096) # Enter here block size, in bytes (must be a multiple of 8).
HDD_folder="/media/myhdd/" # Enter absolute path of HDD inside the brackets.

### Swap creation ###

swap_size=$(expr $swap_GB \* 1024 \* 1024 \* 1024 / $swap_bs)
dd if=/dev/zero of=${HDD_folder}"/swapfile" bs=$swap_bs count=$swap_size
mkswap ${HDD_folder}"/swapfile" -f
swapon -p 1000 ${HDD_folder}"/swapfile"

### EOF ###

PD: por favor Optimizar / correcta, si es posible. Como se dijo, es mi primer script :)


Bueno, el intercambio ya es lento, pero no puedo imaginar tener un intercambio en la unidad USB. Se volverá lento como el infierno en mi humilde opinión
Michael Hooreman

Una secuencia de comandos como un resumen sería genial aquí.
Léo Léopold Hertz 준영

1
Nunca he creado un script, pero lo intentaré.

1

Lo haría al menos prueba de lo bien comprimido RAM (zram módulo del kernel, disponible desde la versión del kernel 3.14) lleva a cabo.

Siguiendo las instrucciones del wiki archlinux

modprobe zram
echo lz4 > /sys/block/zram0/comp_algorithm
echo 4G > /sys/block/zram0/disksize
mkswap --label zram0 /dev/zram0
swapon --priority 100 /dev/zram0

Supongo que la RAM comprimida debería ser más rápida que la E / S de disco.

Para mantener el cambio también después del reinicio, coloque los comandos de tiempo de arranque /etc/rc.localy ejecútelos sudo systemctl enable rc-local.service.


Extendí la respuesta al hilo unix.stackexchange.com/q/297752/16920 para el efecto de zram en el tamaño de la memoria y la velocidad de paginación. No puedo encontrar ningún efecto en el tamaño de la memoria, probablemente principalmente en la paginación. Sin embargo, la advertencia systemd / ... ha aumentado con runit. Sería genial saber acerca de la tasa de error de zram.
Léo Léopold Hertz 준영

En el caso de zram0, hay algunas estadísticas disponibles en / sys / block / zram0 en los archivos orig_data_size y compr_data_size . No tengo muchos datos intercambiados allí, pero para lo que hay, la relación es de aproximadamente 0,35. Con esa relación, 11 GB de datos podrían caber en 4 GB de RAM. Eso podría significar 7 GB de datos no intercambiados al disco.
JJ Hakala

1
Puede colocar comandos de tiempo de arranque en /etc/rc.local y luegosudo systemctl enable rc-local.service
JJ Hakala

Me di cuenta de que zramno es aplicable para el intercambio en el disco duro / SSD por lo zramque no es aplicable aquí, por favor ver el hilo askubuntu.com/a/472227/25388
Léo Léopold Hertz 준영

1

Uso zswapsi tiene porciones de intercambio en el disco duro / SSD. El módulo no zramtiene partes de intercambio en HDD / SSD, por lo que la respuesta de Hakala no es aplicable. Vea el hilo zram vs zswap vs zcache Ultimate guía: cuándo usar cuál para explicaciones. Configuración zswapcomo se describe en el hilo ¿Cómo activar Zswap con éxito para la computación de Matlab en Ubuntu 16.04?

  • Reemplace la línea correspondiente con la siguiente línea en /etc/default/grub

    # https://wiki.archlinux.org/index.php/Zswap
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=1 zswap.max_pool_percent=25 zswap.compressor=lzo"
    
  • Ejecutar sudo update-grub.

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.