Como aumentar a memória virtual do Ubuntu e / ou trocar por Matlab?


16

Situação: corrija Out of Memoryerros no Matlab do Ubuntu.
Objetivo: alocar memória virtual e / ou trocar no HDD / SSD externo; a leitura / gravação diminui de 20 GBps para 0,1 GBps, o que é bom!
Terminologia: troca e memória virtual aqui

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

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

Sistemas Linux - Altere seu espaço de troca usando os comandos mkswape swapon.

Características do sistema

  • Você pode ver quanto você tem swapon -s

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

    % /programming//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 Memoryerros com grandes matrizes no Matlab. Não obtive sucesso ao reshapeinserir matrizes para vetores e escrever código paralelo. Então, eu quero usar a memória virtual porque preciso fazer o trabalho; a taxa não importa.

Pseudo-código

  1. O script de shell que cria uma troca, inicia o MATLAB e exclui a troca quando o MATLAB sair. ( MichaelHooreman )
  2. Habilite a troca no disco rígido externo. Como usar sudo swapon -aaqui?
  3. Inicie o Matlab.
  4. Coloque o Matlab use a troca.
  5. Exclua a troca quando o Matlab sair.

Troca temporária, execução de cliente e fechamento / remoção de troca no script de Micheal

Situação : não é possível controlar erros na configuração do ambiente (1), executando o Matlab (2) e fechando o
script do ambiente (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}

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

  1. Logs após 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

    • O histórico de comandos foi iniciado na primeira inicialização do Matlab na memória de troca (ticket # 02075943), com o erro Ocorreu um problema ao ler o histórico de comandos - - . Basta reiniciar o Matlab e o problema será resolvido se você tiver as configurações padrão. O comando prefdirindica /home/masi/.matlab/R2016aqual é o local padrão ( /home/{username}/.matlab/R2016a. O arquivo /home/masi/.matlab/R2016a/matlab.prfexiste 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 tratamento de erros de interceptação de erros aqui? Veja meu script para o exemplo na fonte. Thread Como fazer uma captura e troca de erros se houver erro / aviso?

Troca permanente = instalação de troca separada do cliente em execução

Configurando 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

Coloque o seguinte no final de /etc/fstabpara a mudança 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 bits
do kernel Linux: 4.6
kernel Linux opções: wl
Matlab: 2016a
Matlab Oficial docs: Resolve "falta de memória" erros
External HDD: Transcend 1 TB StoreJet 25m3 revisão , Transcend 2 TB StoreJet 25m3
HDD externo sistema de arquivos: ext4
Buffer externo do disco rígido: 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 da memória física no Matlab? , Como resolver erro de falta de memória no Matlab? , Como corrigir erro de falta de memória no Matlab para a matriz 10800x10800? ,Como aumentar o limite de memória (contíguo e geral) no Matlab r2012b? , Como aumentar o bloco de matriz e resolver o erro de falta de memória no Matlab 2009b? , Como resolver esse problema de falta de memória para uma pequena variável no Matlab? , 'Memória insuficiente' no Matlab. Uma solução lenta mas permanente?


4
Desculpe, isso não está respondendo à pergunta. Mas você tem certeza que quer isso? Fazer cálculos a partir de swap leva incrivelmente tempo. Ram lê em pelo menos 20 GB por segundo, o seu disco rígido externo estará lendo a menos de 0,1 Gbps
Anake

11
@ Cobra Sim, eu sei. Não é um problema. Tenho enormes matrizes que podem ser calculadas com 32/64 GB, mas não com meu ultrabook atual de 8 GB. Eu ainda preciso fazer esse cálculo nos feriados.
Léo Léopold Hertz

11
Outro comentário não útil desculpe. Você poderia deixar um computador ligado em casa para poder fazer o SSH e executá-lo em casa / uni?
Anake

@ Cobra Não é possível, desculpe, no momento. Além disso, o Matlab aqui precisa de computação local. Além disso, não há chaves suficientes para fazê-lo no momento.
Léo Léopold Hertz

O que há de especial no MATLAB nesse contexto? Isso não é apenas uma duplicata de Como aumentar o espaço de troca?
Steeldriver 17/07/16

Respostas:


2

OK, você tem uma lista e tanto. Deixe-me responder em linha

  1. Como aplicar o melhor tratamento de erros de interceptação de erros aqui? Veja meu script para o exemplo na fonte. Thread Como fazer uma captura e troca de erros se houver erro / aviso ?.

Não gosto do conceito desse script. O fato de você ter 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 inserir uma partição de troca adequada, adicione um arquivo de troca ou apenas compre um disco interno maior.

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

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

  1. Como ter uma barra de progresso na computação de sua enorme matriz no Matlab?

O Matlab tem uma API, certo? Eu não acho que este seja o fórum certo para essa pergunta. Mesmo se você tivesse uma API, estará bloqueando o IO via swap, por isso será apenas uma barra de progresso instável que não reflete a realidade.

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

Você não só porque você concluiu o cálculo não significa que o sistema operacional é executado com os recursos que você alocou. Quando terminar de escrever para trocar, será liberado. Você consumiu tanta memória que muitos aplicativos não conseguem obter a memória de que precisam, portanto também estão usando swap. Basta deixá-lo ligado e deixar o sistema operacional funcionar. Antes de executar sua próxima execução, limpe os caches.

echo 3 > /proc/sys/vm/drop_caches 

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

Finalmente, esse é o tipo de material para o qual o EC2 foi criado. Parece que 16G é o que você precisa, um m4.4xlarge tem 64G ram a $ 0.958 por hora. Isso é menos do que uma xícara de café. Script sua instalação do matlab usando um encanto juju ou similar e transforme tudo em uma computação como um serviço.

É 16G 16 GB?

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

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

Você também deve limpar seus caches 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 colocar o MLOCK Matlab na memória?

  • man mlock. Embora eu tenha brincado quando citei isso. Essa chamada garante que você possa alocar toda a memória desejada e evitar que ela seja trocada; ela nunca usará memória virtual. Não é isso que você quer.

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

  • Vou ser franco aqui, o conceito de microgerenciar arquivos de swap da maneira que você propõe é ridículo. O trabalho do sistema operacional é gerenciar recursos e distribuí-los de maneira justa e consistente. Depois de fornecer mais recursos, ele será usado como achar melhor. Você não conta quando termina e arranca recursos por baixo, o sistema operacional informa quando termina.

Quando solicito ao sistema operacional um espaço de endereço de memória, às vezes nem sempre é bem-sucedido, isso não significa que não posso tentar novamente. Que o Matlab não consiga chamar o malloc duas vezes é o problema do Matlab.

Portanto, para afetar a alteração que você deseja, se esses 100G de espaço são realmente muito altos , você precisa descobrir como instruir o sistema operacional a reduzir o consumo de memória (limpando caches para iniciantes) para que o gerenciador de memória não sinta a necessidade de usar o espaço de troca adicional que foi fornecido. Então, e somente então, você pode solicitar ao gerenciador de memória que libere o arquivo de troca.

É fácil cultivar coisas como memória e discos, é muito mais difícil reduzi-las. A redução força o reequilíbrio de cada usuário que possui recursos alocados nesse espaço. Se eu dissesse "Tenho uma matriz de armazenamento de 100 TB, mas agora preciso apenas de 60 TB, por que quando removo 40 TB de disco que a matriz para de funcionar?" Bem, a resposta seria óbvia, certo?

Então, aqui estão as suas opções, a meu ver.

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

  2. refatorar 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 disponíveis para executar a computação e usar mallocou mmapanônimo para alocar o espaço de endereço necessário.


Sim, mas pode não ser suficiente e você pode ter que esperar e tentar novamente antes que ele seja bem-sucedido, se for o caso.
21816 ppetraki

11
heh, o resto do seu comentário não apareceu no meu smartphone. você não pode sudo eco assim, em vez disso. echo 3 | sudo tee /proc/sys/vm/drop_caches
21816 ppetraki

Eu aceito essa resposta porque ela tem o sentido certo em sua resposta. Executar o Cliente no mesmo script que a configuração do ambiente é incrivelmente propenso a erros. Mais discussões sobre isso aqui unix.stackexchange.com/a/298543/16920 - - Seria ótimo se você pudesse limpar pouco seu corpo.
Léo Léopold Hertz

12

Você não pode dedicar a troca por 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 exemplo de script que cria uma troca de 10Mb no diretório / tmp, monta-a, inicia R (não tenho matlab), aguarde R sair, desmonte o arquivo de troca e exclua-o.

Observe que: - você receberá um aviso porque o arquivo de troca não é de propriedade do root. Isso porque o sistema usará se for para algum software, talvez não seja executado por você, e você pode ler sobre esse arquivo ... Eu deixo você consertar. - se você [ctrl] - [c] o script, logoff ou etc., a troca permanecerá montada. Eu deixo você consertar isso 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}

11
Bem, ele não é realmente dedicado ao MATLAB, mas para qualquer situação que precise temporariamente de mais memória RAM. Por favor note que swapon / swapoff precisa direito de raiz (assim: sudo)
Michael Hooreman

11
Sim você tem. É assim que se tornar raiz.
18716 Michael Hooreman

Boa resposta. Pessoalmente, eu abordaria isso e manteria meu próprio script add-swap.sh para esses momentos adoráveis ​​em que a memória é consumida #
Sergiy Kolodyazhnyy

Eu concedi a recompensa aqui porque me fez pensar da maneira correta. No entanto, não posso aceitar a resposta porque o gerenciamento de erros é muito difícil e incompleto. É melhor configurar o swap separadamente da execução do Matlab, veja a resposta aqui unix.stackexchange.com/a/298543/16920
Léo Léopold Hertz

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
    
  • Segundo, tenha em mãos a pasta do seu HDD. Deve ser algo parecido /media/myhdd.

  • Decida o tamanho do SWAP extra que você deseja adicionar. Digamos, X GB.
  • Calcule a quantidade de bytes que a quantidade é. Usando GB, este é: 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 isso 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 comfree -m


Podemos configurar isso em um script não interativo ( sudosão necessários os poderes):

#!/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 foi dito, é o meu primeiro roteiro de todos os tempos :)


Bem, a troca já é lenta, mas não consigo imaginar a troca na unidade USB. Vai tornar-se lento como IMHO inferno
Michael Hooreman

Um script como um resumo seria ótimo aqui.
Léo Léopold Hertz

11
Eu nunca criei um script, mas vou tentar.

1

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

Seguindo as 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 do disco.

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


Estendi a resposta ao segmento unix.stackexchange.com/q/297752/16920 para o efeito do zram no tamanho da memória e na taxa de paginação. Não consigo encontrar nenhum efeito no tamanho da memória, provavelmente principalmente na paginação. No entanto, o aviso systemd / ... aumentou com o runit. Seria ótimo saber sobre a taxa de erro do zram.
Léo Léopold Hertz

No caso do zram0, existem algumas estatísticas disponíveis em / sys / block / zram0 nos arquivos orig_data_size e compr_data_size . Não tenho muitos dados trocados por lá, mas para o que existe, a proporção é de cerca de 0,35. Com essa proporção, 11 GB de dados podem caber em 4 GB de RAM. Isso pode significar 7 GB de dados não trocados para o disco.
JJ Hakala 23/07

11
Você pode colocar os comandos de tempo de boot em /etc/rc.local e depoissudo systemctl enable rc-local.service
JJ Hakala

Eu descobri que zramnão é aplicável para swap em HDD / SSD assim zramnão é aplicável aqui, consulte o tópico askubuntu.com/a/472227/25388
Léo Léopold Hertz 준영

1

Use zswapse você tiver partes de swap no HDD / SSD. O módulo Tho não zrampossui partes de swap no HDD / SSD, portanto a resposta de Hakala não é aplicável. Consulte o tópico zram vs zswap vs zcache Ultimate guide: quando usar qual deles para obter explicações. Instalação zswapconforme descrito no tópico Como ativar o Zswap com êxito 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"
    
  • Corra sudo update-grub.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.