Como Aumentar a Memória Virtual do Ubuntu e / ou Trocar para o Matlab?

15

Situação: corrigir Out of Memory erros no Matlab do Ubuntu
Objetivo: alocar alguma memória virtual e / ou Trocar em HDD / SSD externo; a redução de leitura / gravação de 20 GBps para 0,1 GBps, o que é ok!
Terminologia: swap e memória virtual aqui

  

Não, swap e memória virtual são completamente diferentes. Por exemplo, o mapeamento de memória de um arquivo de 1 GB usa um adicional de 1 GB de memória virtual, mas não altera o uso do swap. Trocar é uma forma de loja de apoio. Muitos usos da memória virtual não têm nada a ver com armazenamento de backup. (E tem havido sistemas com memória virtual e sem swap, bem como sistemas com swap, mas sem memória virtual.)

O hardware do consumidor é limitado, portanto, preciso usar mais memória virtual e / ou trocar com meus HDDs externos. Matlab diz sobre a memória de troca (TODO excluindo memória virtual?)

  

Linux Systems - Altere seu espaço de troca usando os comandos mkswap e swapon .

Características do sistema

  • Você pode ver quanto custa por swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Configurações do Matlab

    % https://stackoverflow.com/a/35971040/54964
    com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB
    
    % TODO cannot find ways how to put Matlab use /dev/sda3
    
  • Então você vê que meu Matlab não está usando. Eu recebo Out of Memory erros com grandes matrizes no Matlab. Eu tenho sido malsucedido em reshape 'matrizes para vetores e escrever código paralelo. Então eu quero usar a memória virtual porque eu preciso fazer o trabalho; a taxa não importa.

Pseudocódigo

  1. Script de shell que cria uma troca, inicia o MATLAB e exclui a troca quando o MATLAB sai. ( MichaelHooreman )
  2. Ative a troca no disco rígido externo. Como usar sudo swapon -a aqui?
  3. Inicie o Matlab.
  4. Coloque o Matlab usando o swap.
  5. Excluir troca quando o Matlab sai.

Troca Temporária, Cliente em Execução e Fechamento / Remoção de Troca no script de Micheal

Situação : não pode controlar erros na configuração do ambiente (1), executar o Matlab (2) e fechar o ambiente (3)
Script

#!/usr/bin/env bash

# https://stackoverflow.com/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} # https://unix.stackexchange.com/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}

Iteração 1 com Transcend 25M3 1 TB com pouco uso berofe em que o sistema de arquivos ext4

  1. Registra depois de iniciar o 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. Executando o cliente

    • Histórico de comandos ido na primeira partida do Matlab na memória swap (ticket # 02075943), com o erro Houve um problema ao ler seu histórico de comandos - - . Apenas reinicie seu Matlab e o problema será resolvido se você tiver configurações padrão. O comando prefdir/home/masi/.matlab/R2016a , que é o local padrão ( /home/{username}/.matlab/R2016a . O arquivo /home/masi/.matlab/R2016a/matlab.prf existe após o reinício, aqui .

    • ... [outros erros] ...

  3. Fechando o Matlab e digitando a senha novamente no Terminal

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

Aberto: Como aplicar o melhor erro de tratamento de erro de trapping aqui? Veja meu script para o exemplo na fonte. Tópico Como fazer o erro de captura e Swapoff se erro / aviso?

Troca Permanente = Configuração de Troca Separada do Cliente em Execução

Configurar o Swap

# https://unix.stackexchange.com/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

Coloque o seguinte no final de /etc/fstab para a alteração permanente

# https://unix.stackexchange.com/a/298212/16920
# https://unix.stackexchange.com/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 do Linux: 4,6
Opções do kernel Linux: wl
Matlab: 2016a
Documentos oficiais do Matlab: Resolver erros de "falta de memória" < br> HDD Externo: Transcenda 1 TB StoreJet 25M3 avaliação , Transcend 2 TB StoreJet 25M3
Sistema de arquivos HDD externo: ext4
Buffer de HDD externo: 8 MB
Tópicos relacionados: Como aumentar a limitação de memória do MATLAB no Ubuntu? (como usar mkswap, swapon para MATLAB?) , Como reduzir o aumento de memória física no Matlab? , Como resolver um erro de falta de memória no Matlab? , Como corrigir erro de falta de memória no Matlab para matriz de 10800x10800? , Como aumentar o limite de memória ( contíguo, bem como global) em Matlab r2012b? , Como aumentar o bloco de matriz e resolver o erro de memória insuficiente no Matlab 2009b? , Como resolver esse problema de falta de memória de uma pequena variável no Matlab? , 'Fora de memória' no Matlab. Uma solução lenta mas permanente?

    
por Léo Léopold Hertz 준영 17.07.2016 / 20:57

5 respostas

2

OK, uma lista bem legal que você tem lá. Deixe-me responder inline

  1. Como aplicar o melhor erro de tratamento de erro de trapping aqui? Veja meu script para o exemplo na fonte. Thread Como fazer o erro de trapping e Swapoff se erro / aviso?.

Eu não gosto do conceito deste script. Que você tenha um disco rígido externo que está tentando usar como swap é apenas uma má ideia. Se você realmente pretende fazer isso regularmente, redimensione suas partições para colocar uma partição swap adequada, adicione um arquivo de swap ou apenas compre um disco interno maior.

  1. Como colocar avisos se o tamanho da matriz exceder o tamanho do swap?

Apenas faça as contas. Se você souber o tamanho da matriz antes do início do programa, calcule o tamanho em MiB e compare-o com o swap disponível.

  1. Como ter uma barra de progresso no cálculo da sua enorme matriz no Matlab?

o matlab tem um direito de API? Eu não acho que este é o fórum certo para essa pergunta. Mesmo se você tivesse uma API, você estaria bloqueando o IO via swap, então seria apenas uma barra de progresso irregular que não reflete a realidade.

  1. Como matar o progresso ocupado e / ou swapon -s / swapoff na iteração (2)?

Você não faz. só porque você terminou com o cálculo não significa que o sistema operacional é feito com os recursos que você alocou. Quando terminar de escrever para trocar, vai liberar. Você consumiu tanta memória que muitos aplicativos não conseguem a memória de que precisam, então estão usando o swap também. Apenas deixe-o ligado e deixe o sistema operacional fazer isso. Antes de executar sua próxima execução, limpe os caches.

echo 3 > /proc/sys/vm/drop_caches 

Há provavelmente mais do que isso, não sou um especialista em VM Linux. Vale a pena investigar como o alocador SLAB / SLUB funciona e como ajustá-lo para seus grandes requisitos de memória. Você pode conseguir MLOCK matlab na memória. Isso força o SO a reservar memória para você, ou simplesmente não inicia, você também precisa desbloqueá-lo quando terminar. Eu posso fazer isso com a API C muito bem, mas eu não sei como você faria isso fora de um processo que não posso recompilar, isso exigiria alguma pesquisa.

Finalmente, este é o tipo de material para o qual o EC2 foi criado. Parece que o 16G é o que você precisa, um m4.4xlarge tem 64G ram @ $ 0.958 por hora. Isso é menos que um copo de café. Script sua instalação de matlab usando um charme juju ou similar e transformar a coisa toda em um cálculo como um serviço.

16G é 16 GB?

  • Sim, normalmente quando deixamos o sufixo, queremos dizer números base2 em unidades de bytes. Se você quiser concisar você escreveria 16GiB.

"Preciso de matrizes com & gt; 100 GB. Não sei se você pode fazer isso com o EC2."

  • O EC2 tem máquinas com até 2 TB de memória principal. Veja por si mesmo. link

Você deve limpar seus caches também por echo 3 > /proc/sys/vm/drop_caches ?

  • Sim, não faz mal sempre fazer isso. Veja Documentação / sysctl / vm.txt no kernel do linux.

Como você pode MLOCK Matlab na memória?

  • %código%. Embora eu tenha brincado quando citei isso. Esta chamada assegura que você pode alocar toda a memória que você quer e evitar que ela seja trocada, nunca usará memória virtual. Não é isso que você quer.

Eu acho que você pode ligar a API C ao Matlab. - Você tem alguma idéia de desativar o swap se houver alguma falha nos processos?

  • Eu vou ser franco aqui, o conceito de micro gerenciamento de arquivos de swap da maneira que você propõe é ridículo. O trabalho do sistema operacional é gerenciar os recursos e distribuí-los de maneira justa & amp; forma consistente. Uma vez que você tenha mais recursos, vai usá-los como achar melhor. Você não consegue dizer quando acaba e tira os recursos de baixo, o sistema operacional informa quando é feito.

Quando peço ao sistema operacional um espaço de endereço de memória, às vezes nem sempre isso é bem-sucedido, isso não significa que não possa tentar novamente. O matlab não consegue chamar o malloc duas vezes é o problema do matlab.

Então, para afetar a mudança que você quer, se esse espaço de 100G é realmente um prêmio , você precisa descobrir como dizer ao sistema operacional para cortar o espaço ocupado pela memória (limpando caches) para iniciantes) para que o gerenciador de memória não sinta a necessidade de usar o espaço adicional de troca que foi fornecido. Então, e só então, você pode pedir ao gerenciador de memória para liberar o arquivo de troca.

É fácil desenvolver coisas como memória e discos, é muito mais difícil reduzi-las. O encolhimento força um reequilíbrio de todos os usuários que possuem recursos alocados nesse espaço. Se eu dissesse "Eu tenho uma matriz de armazenamento de 100 TB, mas agora eu só preciso de 60 TB, por que é quando eu removo 40 TB de disco que a matriz pára de funcionar?" Bem, a resposta seria óbvia, certo?

Então aqui estão suas opções como eu vejo.

  1. investigue a API matlab C para ver se você pode obter melhor controle sobre como a memória é alocada para esses conjuntos de trabalho massivos.

  2. refatorie sua computação para calcular o que você tem agora usando sub-matrizes ou alguma outra representação de dados esparsos.

  3. escreva seu próprio programa em C / C ++ usando a infinidade de bibliotecas de álgebra linear para executar o cálculo e use man mlock ou malloc anonymous para alocar o espaço de endereço que você precisa.

por ppetraki 20.07.2016 / 20:53
12

Você não pode dedicar swap para um software. O que você pode fazer é criar um script de shell que crie uma troca, inicie o MATLAB e exclua a troca quando o MATLAB sair.

Aqui está um script de exemplo que cria uma troca de 10Mb no diretório / tmp, monta, inicia R (não tenho matlab), espera R sai, desmonta o arquivo de swap e o apaga.

Por favor, note que: - você terá um aviso porque o arquivo de troca não é de propriedade do root. Isso porque o sistema irá usar se para qualquer software, talvez não seja executado por você, e você pode ler sobre este arquivo ... Eu deixo você consertá-lo. - se você [ctrl] - [c] o script, ou logoff, ou etc., a troca permanecerá montada. Eu deixo você consertar também.

#!/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}
    
por Michael Hooreman 17.07.2016 / 21:04
1

É assim que você pode expandir sua memória SWAP usando um disco rígido externo :

  • Primeiro, anote sua memória SWAP real executando:

    free -m
    
  • Em segundo lugar, tenha em mãos a pasta do seu disco rígido. Deve ser algo como /media/myhdd .

  • Decida o tamanho do SWAP extra que você deseja adicionar. Digamos que X GB.
  • Calcule a quantidade de bytes que a quantidade é. Usando GB, isto é: Y = X * 1024 ^ 3 , onde Y é o resultado do seu cálculo.
  • Escolha o tamanho do bloco do arquivo (é em bytes). Vamos usar o padrão aqui: 4096 (Veja mais sobre este aqui ).
  • Calcule o número de blocos que o arquivo terá: Z = Y / 4096
  • Crie um arquivo de tamanho X GB usando o seguinte comando em um terminal:

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • Crie o SWAP no arquivo usando:

    sudo mkswap /media/myhdd/swapfile -f
    
  • Por fim, ative o SWAP:

    sudo swapon -p 1000 /media/myhdd/swapfile
    

Agora seu SWAP aumentou. Verifique novamente com free -m

Podemos configurar isso em um script não interativo ( sudo powers necessário):

#!/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 ###

PS: otimize / corrija, se possível. Como disse, é meu primeiro roteiro:)

    
por user308164 20.07.2016 / 20:20
1

Eu, pelo menos, testaria quão bem compactada a RAM (módulo zram do kernel, disponível desde a versão 3.14 do kernel).

Seguindo instruções do wiki do 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

Meu palpite é que a RAM compactada deve ser mais rápida que a E / S de disco.

Para manter a alteração também após a reinicialização, coloque os comandos de tempo de inicialização em /etc/rc.local e execute sudo systemctl enable rc-local.service .

    
por J.J. Hakala 20.07.2016 / 00:04
1

Use zswap se você tiver partes de troca no HDD / SSD. O módulo zram é sem partes swap no HDD / SSD, então a resposta de Hakala não é aplicável. Veja o tópico zram vs zswap vs zcache Guia final: quando usar qual para explicações. Setup zswap como descrito no tópico Como ativar o Zswap com sucesso para o Matlab Computation no Ubuntu 16.04?

  • Substitua a linha correspondente pela seguinte linha em /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"
    
  • Execute sudo update-grub .

por Léo Léopold Hertz 준영 13.04.2017 / 14:25