これは停止プロセス/ SIGSTOPに関する質問と同じくらい多いです。stress
だから私はシステムのメモリ圧力をシミュレートするために圧力を使用しています。
stress --vm X --vm-bytes YM
これはうまく動作しますが、CPUを大量に消費することがわかりました。
root@ET0021B703EB23:~# ps -aux | grep stress
root 11800 0.0 0.0 2192 232 pts/4 S+ 15:21 0:00 stress --vm 1 --vm-bytes 10M
root 11801 83.5 0.2 12436 2436 pts/4 R+ 15:21 0:03 stress --vm 1 --vm-bytes 10M
今回のテストでは、CPU負荷について心配したくありません。Ctrl+を使用してZ一時停止しましたstress
が、消費されたCPUが減少しましたが、メモリはまだ私が望むように残ります。
root@ET0021B703EB23:~# ps -aux | grep stress
root 9080 0.0 0.0 2760 296 pts/2 S+ 15:18 0:00 grep stress
root 17030 0.0 0.0 2192 172 pts/2 T 14:51 0:00 stress --vm 1 --vm-bytes 10M
root 17031 2.7 0.4 12436 4860 pts/2 T 14:51 0:44 stress --vm 1 --vm-bytes 10M
私が理解しているのは、プロセスを一時停止状態に保つとメモリに残ります。それでは、このアプローチを使用してCPUコストなしでメモリ不足を確実にシミュレートできますか?
私の関心事は、Linuxにメモリの圧迫によって中断されたプロセスを終了したり、メモリへの影響を排除する機能(Androidのlowmemorykillerなど)があるかどうかです。そのようなものが存在するのか、それともこれがうまくいかないのですか?
答え1
私が見つけたこのOracle記事OOM Killerについて(Out Of Memory Killer)は、特に「OOM Killerの設定」の章で質問の半分に答えを提供します。
私はそこから2つの重要なコマンドを抽出しました。
- OOM Killerを無効にする
root@host:~# sysctl vm.overcommit_memory=2
- OOM Killerからプロセスを除外
root@host:~# echo -17 > /proc/<pid>/oom_adj
他の非常に興味深い答えは次のとおりです。1.4存在するこのFAQストレス項目ページには次のように表示されます。
1.4 CPUが破損しているのにRAMが破損しないのはなぜですか?
これは、基本オプションが保守的である場合に圧力がかかるためです。仮想メモリマネージャを強制的にクラッシュさせ、システムを一時的に使用できなくするのは簡単です。したがって、保持しているメモリ量を確認し、適切なオプションを渡してください。 3GB RAMを搭載したデュアルコアIntelシステムでは、合理的な呼び出しは次のとおりです。
stress -m 1 --vm-bytes 2G
しかし、あなたの質問にはまだ答えがありません。私たちに見せてください圧力マニュアル...
-c, --cpu N
sqrt() で回転する N ワーカースレッドを作成します。
上記のオプションが役に立ちます。 0に設定してみてください。ああ、これはうまくいきません! ?
コードを調べた後、このオプションがデフォルトで無効になっていることを確認しました。私も気づいた--vm-項オプションは必要なものです。
デフォルトの動作は次のとおりです。--vmmalloc()/free() で回転しており、CPU を多用します!--vm-項作る圧力プログラムが一時停止します。秒は毎回割り当てられます。無料()。
次のコマンドを試してください(〜128 MBのRAM消費)。
root@host:~# stress --vm 1 --vm-bytes 128000000 --vm-hang 3600
別の端末でテストしてみてください。
root@host:~# top