Ubuntuの仮想メモリやMatlabのスワップを増やす方法


16

状況:Out of MemoryUbuntuのMatlabの
目標のエラーを修正する:外部HDD / SSDに仮想メモリやスワップを割り当てます。読み取り/書き込みが20 GBpsから0.1 GBpsに減少しました。
用語:ここでスワップと仮想メモリ

いいえ、スワップと仮想メモリは完全に異なります。たとえば、1GBファイルのメモリマッピングでは、追加の1GBの仮想メモリが使用されますが、スワップの使用に変更はありません。スワップは、バッキングストアの一種です。仮想メモリの多くの用途は、バッキングストアとは何の関係もありません。(また、仮想メモリがあり、スワップがないシステム、およびスワップはあるが仮想メモリがないシステムがあります。)

消費者のハードウェアは限られているため、より多くの仮想メモリを使用するか、外部HDDとスワップする必要があります。Matlabはスワップメモリ​​について述べています(仮想メモリを除くTODO?)

Linuxシステム— mkswapおよびswaponコマンドを使用して、スワップ空間を変更します。

システムの特徴

  • あなたはそれをどれだけ持っているか見ることができます swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • Matlabの構成

    % /programming//a/35971040/54964
    com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB
    
    % TODO cannot find ways how to put Matlab use /dev/sda3
    
  • だから、あなたは私のMatlabがそれを使用していないことがわかります。Out of MemoryMatlabで大きな行列のエラーを受け取ります。reshape行列をベクトルに変換し、並列コードを書くことに失敗しました。ですから、作業を完了する必要があるため、仮想メモリを使用します。レートは関係ありません。

擬似コード

  1. スワップを作成し、MATLABを起動し、MATLABの終了時にスワップを削除するシェルスクリプト。(MichaelHooreman
  2. 外付けHDDでスワップを有効にします。sudo swapon -aここでの使用方法は?
  3. Matlabを起動します。
  4. Matlabがスワップを使用するようにします。
  5. Matlabの終了時にスワップを削除します。

Michealのスクリプトでの一時的なスワップ、実行中のクライアント、およびスワップのクローズ/削除

状況:環境のセットアップ(1)、Matlabの実行(2)、環境のクローズ(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}

Transcend 25M3 1 TBを使用したイテレーション1。 ext4

  1. スクリプト開始後のログ

    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. クライアントを実行する

    • コマンド履歴は、スワップメモリ​​(チケット#02075943)でMatlabの最初の起動時に失われ、コマンド履歴の読み取りに問題がありました--。Matlabを再起動するだけで、デフォルト設定があれば問題は解決します。コマンドがprefdir与えられる/home/masi/.matlab/R2016a(デフォルトの場所である/home/{username}/.matlab/R2016a。ファイルは/home/masi/.matlab/R2016a/matlab.prf、再起動後に存在してここに

    • ... [その他のエラー] ...

  3. ターミナルでMatlabを閉じてパスワードをもう一度入力する

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

オープン:エラートラップのより良いエラー処理をここに適用する方法は?ソースの例については、スクリプトを参照してください。スレッドエラー/警告の場合、エラートラップおよびスワップオフの方法

永続的なスワップ=実行中のクライアントからのスワップセットアップの分離

スワップのセットアップ

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

/etc/fstab永続的な変更のために、最後に以下を入力します

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

システム:Linux Ubuntu 16.04 64ビット
Linuxカーネル:4.6
Linuxカーネルオプション:wl
Matlab:2016a
Official Matlab docs:Resolve "Out of Memory" Errors
External HDD:Transcend 1 TB StoreJet 25M3 review、Transcend 2 TB StoreJet 25M3
External HDD filesystem:ext4
外部HDDバッファー:8 MB
関連スレッド:UbuntuでMATLABメモリの制限を増やす方法 (MATLABのmkswap、swaponの使用方法Matlabで物理メモリの増加を減らす方法 Matlabのメモリ不足エラーを解決するにはどうすればよいですか?10800x10800マトリックスのMatlabでメモリ不足エラーを修正する方法は?Matlab r2012bでメモリ制限(全体および連続)を増やすにはどうすればよいですか?Matlab 2009bでアレイブロックを増やしてメモリ不足エラーを解決する方法は?Matlabの小さな変数のこのメモリ不足の問題を解決するにどうすればよいですか?MATLABで「メモリ不足です」。遅いが永続的な解決策?


4
申し訳ありませんが、これは質問に答えていません。しかし、本当にこれが欲しいのですか?スワップから計算を行うには、信じられないほど長い時間がかかります。ラムは毎秒少なくとも20ギガバイトで読み込み、あなたの外付けHDDは、0.1未満Gbpsで読んされます
Anake

1
@Anakeはい、分かります。問題ありません。32/64 GBで計算できる巨大な行列がありますが、現在の8 GBウルトラブックでは計算できません。私はまだ休日に計算を行う必要があります。
レオレオポルトヘルツ준영

1
別の役に立たないコメントごめんなさい。コンピューターを自宅に置いたままにして、SSHオーバーでそれらをhome / uniで実行できますか?
Anake

@Anake現時点ではできません。申し訳ありません。また、Matlabはローカル計算が必要です。また、現時点ではそれを行うのに十分なキーがありません。
レオレオポルトヘルツ준영

このコンテキストでのMATLABの特別な点は何ですか?これは、スワップ領域を増やす方法の
スチールドライバー

回答:


2

OK、あなたがそこに持っているかなりのリスト。インラインで返信させてください

  1. ここでエラートラップのより良いエラー処理を適用する方法は?ソースの例については、スクリプトを参照してください。スレッドエラー/警告の場合のエラートラップおよびスワップオフの方法

私はこのスクリプトのコンセプトがまったく好きではありません。スワップとして使用しようとしている外付けハードドライブがあることは悪い考えです。定期的にこれを行うつもりであれば、パーティションのサイズを変更して適切なスワップパーティションを配置するか、スワップファイルを追加するか、より大きな内部ディスクを購入してください。

  1. マトリックスサイズがスワップサイズを超えた場合に警告を出す方法

数学をやるだけです。プログラムが開始される前にマトリックスのサイズがわかっている場合は、MiBでサイズを計算し、使用可能なスワップと比較します。

  1. Matlabで巨大なマトリックスを計算する際にプログレスバーを持つ方法は?

matlabにはAPIがありますか?これがその質問にふさわしいフォーラムだとは思いません。APIがあったとしても、スワップを介してIOをブロックするので、実際の現実を反映しないぎこちないプログレスバーになります。

  1. イテレーション(2)でビジーな進行状況やswapon -s / swapoffを強制終了するにはどうすればよいですか?

あなたはしません。計算が終わったからといって、オペレーティングシステムが割り当てたリソースで完了したわけではありません。スワップへの書き込みが完了すると、解放されます。メモリを大量に消費したため、多くのアプリケーションが必要なメモリを取得できないため、スワップも使用しています。そのままにして、オペレーティングシステムに任せるだけです。次の実行を実行する前に、キャッシュをクリアします。

echo 3 > /proc/sys/vm/drop_caches 

おそらくそれ以上のことがあります。私はLinux VMの専門家ではありません。SLAB / SLUBアロケーターがどのように機能し、大容量のメモリ要件に合わせてどのように調整するかを調査する価値があります。matlabをメモリにMLOCKできる場合があります。これにより、OSがメモリを強制的に予約するか、起動しないだけで、完了したらロックを解除する必要があります。私はC APIでこれをうまく行うことができますが、再コンパイルできないプロセスの外でそれをどのように行うのかわかりません。

最後に、これはEC2が作成したものです。必要なのは16Gで、m4.4xlargeには1時間あたり0.958ドルで64GのRAMが搭載されているようです。それはカップコーヒーよりも少ない。ジュジュチャームなどを使用してmatlabのインストールのスクリプトを作成し、すべてをサービスとして計算に変換します。

16Gは16 GBですか?

  • はい、通常、接尾辞を省略すると、バイト単位のbase2数を意味します。簡潔にする場合は、16GiBと記述します。

「100 GBを超えるマトリックスが必要です。EC2で実行できるかどうかわかりません。」

キャッシュもクリアする必要がありますecho 3 > /proc/sys/vm/drop_cachesか?

  • はい、常にそうすることは害になりません。LinuxカーネルのDocumentation / sysctl / vm.txtを参照してください。

Matlabをメモリにロックするにはどうすればよいですか?

  • man mlock。それを引用したとき、私は馬鹿げたが。この呼び出しにより、必要なすべてのメモリを割り当てて、スワップアウトされないようにすることができます。仮想メモリは使用されません。それはあなたが望むものではありません。

C APIをMatlabにバインドできると思います。--プロセスに何らかの障害がある場合、スワップをオフにする考えはありますか?

  • ここで率直に言いますが、あなたが提案する方法でスワップファイルをマイクロ管理するというコンセプトはばかげています。オペレーティングシステムの仕事は、リソースを管理し、公平で一貫した方法でリソースを配布することです。より多くのリソースを与えると、適切と思われるようにそれらを使用します。完了したときにそれを伝えることができず、その下からリソースをヤンクすると、OSは完了したことを通知します。

OSにメモリアドレススペースを要求すると、常に成功しない場合があります。これは、再試行できないという意味ではありません。matlabがmallocを2回呼び出すことを理解できないのは、matlabの問題です。

そのため、必要な変更に影響を与えるには、その100Gのスペースが本当に貴重な場合は、メモリマネージャーがメモリフットプリントを削除しないように、オペレーティングシステムにメモリフットプリントをトリミングするよう指示する方法を理解する必要があります提供された追加のスワップスペースを使用する必要性を感じます。その後、その場合にのみ、メモリマネージャにスワップファイルを解放するように依頼できます。

メモリやディスクのようなものを成長させるのは簡単ですが、それらを縮小するのははるかに困難です。縮小により、そのスペースにリソースが割り当てられているすべてのユーザーの再バランスが強制されます。代わりに「100TBのストレージアレイはあるが、今では60TBしか必要ないのに、アレイの動作が停止するのは40TBのディスクを取り外すとどうしてですか?」さて、答えは明らかですよね?

だから私はそれを見るようにここにあなたのオプションがあります。

  1. matlab C APIを調査して、これらの大規模なワーキングセットにメモリを割り当てる方法をより適切に制御できるかどうかを確認してください。

  2. サブマトリックスまたはその他のスパースデータ表現を使用して、現在の計算をリファクタリングします。

  3. 計算と使用を実行するためにそこから線形代数ライブラリの茄多を使用してC / C ++で独自のプログラムを書くmallocか、mmapあなたが必要なアドレス空間を割り当てるために、匿名を。


はい。ただし、十分ではない可能性があり、成功するまで待機して再試行する必要がある場合があります。
ppetraki

1
へえ、あなたのコメントの残りは私のスマートフォンに現れませんでした。そのようなsudoエコーはできませんが、代わりに行います。echo 3 | sudo tee /proc/sys/vm/drop_caches
ppetraki

この回答には正しい意味があるので、私はこの回答を受け入れます。環境を設定するのと同じスクリプトでクライアントを実行すると、エラーが発生しやすくなります。ここではそれについての詳細な議論unix.stackexchange.com/a/298543/16920 - -あなたの体の小さなをクリーンアップすることができればそれは素晴らしいことです。
レオレオポルトヘルツ준영

12

ソフトウェア専用のスワップはできません。できることは、スワップを作成し、MATLABを起動し、MATLABの終了時にスワップを削除するシェルスクリプトを作成することです。

/ tmpディレクトリに10Mbのスワップを作成し、マウントし、Rを開始し(matlabがありません)、Rが終了するのを待って、スワップファイルをアンマウントして削除するスクリプトの例を次に示します。

次のことに注意してください。-スワップファイルはルートによって所有されていないため、警告が表示されます。これは、システムが何らかのソフトウェアを使用している場合、おそらくあなたが実行していない場合に使用し、このファイルを読むことができるからです...私はあなたにそれを修正させます。-[ctrl]-[c]スクリプト、またはログオフなどを行う場合、スワップはマウントされたままになります。私もあなたにそれを修正させます。

#!/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
まあ、それは実際にはMATLAB専用ではありませんが、一時的により多くのRAMを必要とする状況のために。swapon / swapoffにはルート権限が必要であることに注意してください(sudo)
Michael Hooreman

1
はいあなたが持っています。それがルートになる方法です。
マイケルホールマン16

いい答えです。私は個人的にはこれにアプローチし、記憶が食い尽くされる素敵な瞬間のために自分のadd-swap.shスクリプトを保持します
Sergiy Kolodyazhnyy

ここで賞金を授与したのは、それが正しい方法を私に与えたからです。しかし、エラー管理は非常に困難で不完全であるため、答えを受け入れることはできません。これは、セットアップMATLABを実行しているから別にスワップするのがベストです、ここの回答を参照してくださいunix.stackexchange.com/a/298543/16920
レオ・レオポルド・ヘルツ준 영

1

これは、外付けハードドライブを使用してSWAPメモリを拡張する方法です。

  • まず、次を実行して実際のSWAPメモリを書き留めます。

    free -m
    
  • 次に、HDDのフォルダーを手元に用意します。のようなものでなければなりません/media/myhdd

  • 追加する余分なSWAPのサイズを決定します。X GB としましょう。
  • その量であるバイト数を計算します。GBを使用すると、これはY = X * 1024 ^ 3になります。ここで、Yは計算の結果です。
  • ファイルのブロックサイズを選択します(バイト単位)。ここでデフォルトを使用してみましょう:4096(これについてはこちらを参照してください)。
  • ファイルのブロック数を計算します:Z = Y / 4096
  • ターミナルで次のコマンドを使用して、サイズX GBのファイルを作成します。

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • 以下を使用して、ファイルにSWAPを作成します。

    sudo mkswap /media/myhdd/swapfile -f
    
  • 最後に、SWAPを有効にします。

    sudo swapon -p 1000 /media/myhdd/swapfile
    

これでSWAPが増加しました。もう一度確認してくださいfree -m


これを非インタラクティブスクリプトで設定できます(sudo権限が必要です)。

#!/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:可能であれば最適化/修正してください。言ったように、それは私の最初のスクリプトです:)


さて、スワップはすでに遅いですが、USBドライブでスワップすることは想像できません。それは地獄のように遅くなります私見
マイケルホーアマン

要約としてのスクリプトはここで素晴らしいでしょう。
レオレオポルトヘルツ준영

1
スクリプトを作成したことはありませんが、試してみます。

1

少なくとも圧縮RAM(zramカーネルモジュール、カーネルバージョン3.14以降で利用可能)のパフォーマンスをテストします。

archlinux wikiの指示に従う

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

私の推測では、圧縮RAMはディスクI / Oよりも高速であるはずです。

再起動後も変更を保持するには、起動時コマンドを配置し/etc/rc.localて実行しsudo systemctl enable rc-local.serviceます。


メモリサイズとページングレートに対するzramの影響について、スレッドunix.stackexchange.com/q/297752/16920に対する回答を拡張しました。ほとんどの場合、ページングに影響する可能性がありますが、メモリサイズには影響がありません。ただし、runitではsystemd / ...警告が増加しています。zramのエラー率について知ることは素晴らしいことです。
レオレオポルトヘルツ준영

zram0の場合、ファイルorig_data_sizeおよびcompr_data_sizeの/ sys / block / zram0で利用可能な統計がいくつかあります。私はそこに多くのデータを交換していませんが、そこにあるものの比率は約0.35です。その比率では、11 GBのデータが4 GBのRAMに収まる可能性があります。つまり、7 GBのデータがディスクにスワップされていない可能性があります。
JJハカラ

1
あなたには、ブート時のコマンドを配置することができます/etc/rc.localをしてからsudo systemctl enable rc-local.service
JJ Hakala

私はそれが分かったzramHDD / SSD上のスワップには適用されませんのでzram、スレッドを参照してくださいここでは適用されないaskubuntu.com/a/472227/25388を
レオ・レオポルド・ヘルツ준 영

1

zswapHDD / SSDにスワップ部分がある場合に使用します。ThoモジュールにzramはHDD / SSDのスワップ部分がないため、Hakalaの答えは当てはまりません。スレッドzram vs zswap vs zcache Ultimateガイド:説明のためにどれを使用するかを参照してください。zswapスレッド「ZswapをUbuntu 16.04のMatlab計算用に正常にアクティブ化する方法」で説明されているセットアップ

  • 対応する行を次の行に置き換えます /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"
    
  • を実行しますsudo update-grub

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.