CPUコストを差し引いたメモリ圧力をシミュレートするためにプロセス(「ストレス」)を中断できますか?

CPUコストを差し引いたメモリ圧力をシミュレートするためにプロセス(「ストレス」)を中断できますか?

これは停止プロセス/ 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つの重要なコマンドを抽出しました。

  1. OOM Killerを無効にするroot@host:~# sysctl vm.overcommit_memory=2
  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

おすすめ記事