過去には、仮想メモリがスワッピングを開始し、ディスクの活動を占め、システムが遅くなるLinuxのメモリ不足の状況に少し疲れていました。
だから、MacBook ProにUbuntuをインストールしたとき、RAMが8GBであることがわかり、「それで十分だと思います。とにかく必須だ」
驚くべきことに、仮想メモリを持たないLinuxでメモリが不足しているユーザーエクスペリエンスは、私が予想したものよりはるかに悪かったです。
誤って一度に大きすぎるC ++ファイルをコンパイルしたり(「make -j6」を使用して簡単に実行できます)、誤って気づく前にコンピュータのメモリを消費しても、プログラムはエラーのために予想したようにクラッシュしませんが、デスクトップ全体この応答を停止しました。そしてコンピュータを強制的に再起動する必要がありました!時々私はこれをするのに多くの時間を無駄にしたり仕事をしたりします!
戻って再分割して仮想メモリを確保することで問題を解決したいのですが、くそー。 Linuxでメモリ不足の状況をよりきれいに処理する方法はありますか?
答え1
もう一度戻ってパーティションを分割して仮想メモリを解放することで問題を解決しますが、くそ。
スワップ専用の完全パーティションを持つ必要もなく、再パーティションする必要もありません。
交換をファイルとして生成することは非常に簡単です。空の大きなファイルを作成し、mkswapを実行してからスワップを追加します。
# create an big empty 1GB file (or whatever size you like)
dd if=/dev/zero of=/swapfile bs=1M count=1024
# format the file as swap
mkswap /swapfile
# turn it on.
swapon /swapfile
永久に維持するには、fstabに追加してください。
/swapfile swap swap defaults 0 0
答え2
私は大規模なコンパイル(qtwebkit、I'm looking at you)を実行するときにスワップの中断やその他の不幸な副作用を防ぐためにコントロールグループを使用します。私の6Gボックスの場合は、次のようにします。
cgcreate -g memory:emerge
echo "4G" > /sys/fs/cgroup/memory/emerge/memory.limit_in_bytes
echo "4G" > /sys/fs/cgroup/memory/emerge/memory.memsw.limit_in_bytes
cgexec -g memory:emerge tmux
OOM 状況が発生すると終了する唯一のプロセスはコンパイルです。
答え3
メモリが不足している場合は、特定のプロセスが終了する可能性が高いまたは低いとマークすることもできます。特定のプロセスの値を設定すると、そのoom_score_adj
プロセスが終了する優先順位を制御できます。
デフォルトでは、すべてのプロセスのスコアは0で、スコア範囲は-1000(終了しない)から1000(常に最初に終了)までです。
Firefoxは通常私のコンピュータでメモリ使用量の最大の原因であるため、スクリプトを使用してFirefoxを起動します。
#!/bin/sh
echo 900 > /proc/self/oom_score_adj
exec /usr/bin/firefox
これにより、FirefoxはOOMスコア900で始まりました。これはこのように高いスコアを獲得した唯一のプロセスでした。つまり、システムにメモリが不足すると、そのプロセスが終了することを意味します。
同様の操作を実行し、デスクトップ環境を-900に設定すると、デフォルトはFirefoxのメモリ不足時間の半分とデスクトップ環境がメモリを解放してインポートするために終了することを意味するため、終了する可能性が最も少なくなります。 Firefoxや他のすべてのプログラムを終了してください!非常に良いではありません。