過去には、Linuxでメモリ不足の状態に少しうんざりしてきました。この場合、仮想メモリがスワッピングしてディスクアクティビティを占有し始め、マシンの速度が低下します。
MacBook ProにUbuntuをインストールしたところ、8 GBのメモリが搭載されていることに気づき、「それで十分だと思います。スワッピングの問題を回避し、仮想メモリ用のパーティションを予約しないと思います。私はとにかくディスク容量が必要です。」
さて、驚いたことに、仮想メモリのないLinuxでのメモリ不足状態でのユーザーエクスペリエンスは、予想よりもはるかに悪いことがわかりました。
誤って大量の大きなC++ファイルを一度にコンパイルした場合(「make -j6」で簡単に実行できる)、またはプログラムがクラッシュして予期したエラーが発生するのではなく、気付かないうちに誤ってマシンのメモリを消費してしまう場合、代わりに、私のデスクトップ全体が応答を停止し、コンピュータを強制的に再起動する必要があることが動作になっています。時々私は多くの時間を失うか、これのために仕事をします!
私は戻ってパーティションを分割して自分自身に仮想メモリを与えることでそれを修正しますが、いまいましい..今それをする余裕はありません。 Linuxでメモリ不足の状態をより適切に処理するためのヒントはありますか?
私は戻って、パーティションを分割して自分自身に仮想メモリを与えることで修正しますが、いまいましいです。
スワップ専用の完全なパーティションを用意する必要はありません。また、パーティションを再作成する必要もありません。
ファイルとしてスワップを作成するのはとても簡単です。大きな空のファイルを作成して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
大規模なコンパイル(qtwebkitがあなたを見ている)を行うときは、コントロールグループを使用して、死に至るスワッピングやその他の不幸な副作用を防ぎます。私の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状態が発生した場合、強制終了されるプロセスはコンパイルのみです。
また、特定のプロセスがメモリ不足の状況で強制終了される可能性が高いか低いかを示すこともできます。特定のプロセスにoom_score_adj
値を設定することにより、それらが強制終了される優先順位を制御できます。
デフォルトでは、すべてのプロセスのスコアは0であり、スコアは-1000(決して殺さない)から1000(常に最初に殺す)です。
通常、Firefoxは私のマシンで使用しているメモリの最大の原因であるため、代わりにスクリプトから開始します。
#!/bin/sh
echo 900 > /proc/self/oom_score_adj
exec /usr/bin/firefox
これにより、FirefoxはOOMスコア900で起動します。これは、スコアがこれだけ高い唯一のプロセスであるため、システムのメモリが不足するとすぐに強制終了されることを意味します。
同様に、デスクトップ環境を-900のスコアに設定して、殺される可能性が最も低くなるようにします。これは、デフォルトでは、Firefoxがメモリを使い果たし、デスクトップ環境が解放されて解放されるためです。メモリは、Firefoxと他のすべてのプログラムを削除しました。よくない。