Situación: corrija Out of Memory
errores 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
mkswap
yswapon
.
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 Memory
errores con matrices grandes en Matlab. No he tenido éxito enreshape
incorporar matrices a vectores y escribir código paralelo. Entonces quiero usar memoria virtual porque necesito hacer el trabajo; La tasa no importa.
Pseudocódigo
- Script de shell que crea un intercambio, inicia MATLAB y elimina el intercambio cuando sale de MATLAB. ( MichaelHooreman )
- Habilite el intercambio en HDD externo. ¿Cómo usarlo
sudo swapon -a
aquí? - Comience Matlab.
- Ponga a Matlab usando el intercambio.
- 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
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
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
prefdir
da/home/masi/.matlab/R2016a
cuál es la ubicación predeterminada (/home/{username}/.matlab/R2016a
. El archivo/home/masi/.matlab/R2016a/matlab.prf
existe después del reinicio, aquí .... [otros errores] ...
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/fstab
para 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?
Respuestas:
OK, toda una lista que tienes allí. Déjame responder en línea
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.
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.
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.
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.
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?
"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
?¿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?
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.
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.
refactorizar su cómputo para calcular lo que tiene ahora el uso de sub-matrices o alguna otra representación de datos dispersos.
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
malloc
ommap
el anonimato de asignar espacio de direcciones que necesita.fuente
echo 3 | sudo tee /proc/sys/vm/drop_caches
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.
fuente
Así es como se puede ampliar su memoria SWAP usando un disco duro externo :
En primer lugar, escriba su memoria SWAP real ejecutando:
En segundo lugar, tener a mano la carpeta de su disco duro. Debería ser algo así
/media/myhdd
.Crear un archivo de tamaño X GB utilizando el siguiente comando en un terminal:
Cree el SWAP en el archivo usando:
Finalmente, habilite el SWAP:
Ahora su SWAP ha aumentado. Verifique nuevamente con
free -m
Podemos establecer esto en un script no interactivo (
sudo
poderes necesarios):PD: por favor Optimizar / correcta, si es posible. Como se dijo, es mi primer script :)
fuente
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
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.local
y ejecútelossudo systemctl enable rc-local.service
.fuente
sudo systemctl enable rc-local.service
zram
no es aplicable para el intercambio en el disco duro / SSD por lozram
que no es aplicable aquí, por favor ver el hilo askubuntu.com/a/472227/25388Uso
zswap
si tiene porciones de intercambio en el disco duro / SSD. El módulo nozram
tiene 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ónzswap
como 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
Ejecutar
sudo update-grub
.fuente