Situação: corrija Out of Memory
erros 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
mkswap
eswapon
.
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 Memory
erros com grandes matrizes no Matlab. Não obtive sucesso aoreshape
inserir 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
- O script de shell que cria uma troca, inicia o MATLAB e exclui a troca quando o MATLAB sair. ( MichaelHooreman )
- Habilite a troca no disco rígido externo. Como usar
sudo swapon -a
aqui? - Inicie o Matlab.
- Coloque o Matlab use a troca.
- 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
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
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
prefdir
indica/home/masi/.matlab/R2016a
qual é 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] ...
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/fstab
para 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?
Respostas:
OK, você tem uma lista e tanto. Deixe-me responder em linha
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.
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.
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.
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.
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?
"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
?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?
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.
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.
refatorar sua computação para calcular o que você tem agora usando sub-matrizes ou alguma outra representação de dados esparsos.
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
malloc
oummap
anônimo para alocar o espaço de endereço necessário.fonte
echo 3 | sudo tee /proc/sys/vm/drop_caches
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.
fonte
É assim que você pode expandir sua memória SWAP usando um disco rígido externo :
Primeiro, anote sua memória SWAP real executando:
Segundo, tenha em mãos a pasta do seu HDD. Deve ser algo parecido
/media/myhdd
.Crie um arquivo de tamanho X GB usando o seguinte comando em um terminal:
Crie o SWAP no arquivo usando:
Por fim, ative o SWAP:
Agora seu SWAP aumentou. Verifique novamente com
free -m
Podemos configurar isso em um script não interativo (
sudo
são necessários os poderes):PS: otimize / corrija, se possível. Como foi dito, é o meu primeiro roteiro de todos os tempos :)
fonte
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
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.local
e executesudo systemctl enable rc-local.service
.fonte
sudo systemctl enable rc-local.service
zram
não é aplicável para swap em HDD / SSD assimzram
não é aplicável aqui, consulte o tópico askubuntu.com/a/472227/25388Use
zswap
se você tiver partes de swap no HDD / SSD. O módulo Tho nãozram
possui 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çãozswap
conforme 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
Corra
sudo update-grub
.fonte