低リソーステスト を実行したいのですが、そのためには空きメモリの90%をいっぱいにする必要があります。
*nix
システムでこれを行うにはどうすればよいですか?
stress-ng は、POSIXシステムでのcpu/mem/io/hddストレスをシミュレートするワークロードジェネレーターです。この呼び出しはLinux <3.14でうまくいくはずです:
_stress-ng --vm-bytes $(awk '/MemFree/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1
_
Linux> = 3.14の場合、代わりにMemAvailable
を使用して、スワップせずに新しいプロセスで利用可能なメモリを見積もることができます。
_stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1
_
_/proc/meminfo
_呼び出しをfree(1)
/vm_stat(1)
/etcで適合させます。ポータブルが必要な場合。
必要なメモリをmalloc()
にCプログラムを記述し、次にmlock()
を使用してメモリがスワップアウトされないようにすることができます。
次に、プログラムにキーボード入力を待ち、メモリのロックを解除し、メモリを解放して終了します。
VM限られたメモリで実行し、ソフトウェアをテストすることをお勧めします。その場合、ホストマシンのメモリをいっぱいにするよりも効率的なテストになります。
この方法には、メモリ不足の状況が原因でOOMエラーが発生し、OS全体がハングした場合、VMをハングしているだけで、他の有用なプロセスがあるマシンでテストしていないという利点もあります。走っている。
また、テストがCPUまたはIO=集中型)でない場合は、さまざまな低メモリサイズのVMファミリでテストのインスタンスを同時に実行できます。
このHNコメントから: https://news.ycombinator.com/item?id=6695581
/ dev/shmにddなどを入力するだけです。
swapoff -a dd if=/dev/zero of=/dev/shm/fill bs=1k count=1024k
基本的なGNUツール(sh
、grep
、yes
and head
)がある場合、これを行うことができます:
_yes | tr \\n x | head -c $BYTES | grep n
# Protip: use `head -c $((1024*1024*2))` to calculate 2MB easily
_
これは、grepがデータの行全体をRAMでロードするために機能します(ディスクイメージをgrepするときに、かなり残念な方法でこれを学習しました)。yes
によって生成される行は改行は無限に長くなりますが、head
から_$BYTES
_バイトまでに制限されているため、grepはメモリに$ BYTESをロードします。Grep自体は100〜200KBのように使用します。より正確な量のために。
時間制限も追加したい場合は、bash
でこれを非常に簡単に行うことができます(sh
では機能しません)。
_cat <(yes | tr \\n x | head -c $BYTES) <(sleep $NumberOfSeconds) | grep n
_
<(command)
はあまり知られていないようですが、たいていは非常に便利です。詳細については、こちらをご覧ください http://tldp.org/LDP/abs/html/process-sub.html
次に、cat
を使用する場合:cat
は、終了するまで入力の完了を待機し、パイプの1つを開いたままにしておくことで、grepを存続させます。
pv
があり、ゆっくり増やしたい場合RAM使用:
_yes | tr \\n x | head -c $BYTES | pv -L $BYTESPERSEC | grep n
_
例えば:
_yes | tr \\n x | head -c $((1024*1024*1024)) | pv -L $((1024*1024)) | grep n
_
1 GB /秒の速度で最大1 GBを使用します。追加ボーナスとして、pv
は現在の使用率とこれまでの総使用量を表示します。もちろん、これは以前のバリアントでも実行できます。
_yes | tr \\n x | head -c $BYTES | pv | grep n
_
_| pv |
_の部分を挿入するだけで、現在のステータスが表示されます(デフォルトではスループットと合計です。そうでない場合は、man(ual)ページを参照してください)。
なぜ別の答えですか?受け入れられた答えは、パッケージのインストールを推奨しています(パッケージマネージャを必要とせずに、すべてのチップセットにリリースがあるはずです)。トップ投票の回答は、Cプログラムのコンパイルを推奨しています(ターゲットプラットフォーム用にコンパイルするためのコンパイラーまたはツールチェーンをインストールしていませんでした)。 2番目に投票された回答は、VMでアプリケーションを実行することを推奨しています(ええ、USBか何かの上にこの電話の内部sdカードをddして、virtualboxイメージを作成してみましょう); 3番目は、ブートで何かを変更することを提案していますRAM=必要に応じて満たさないシーケンス。4番目は/ dev/shmマウントポイント(1)が存在し、(2)が大きい(再マウントにはrootが必要)である限り)のみ機能します。 5番目は、上記の多くをサンプルコードなしで組み合わせたものです。6番目は素晴らしい答えですが、自分のアプローチを思い付く前にこの答えが見当たらないので、覚えたり入力したりするのが短いため、自分のアプローチを追加すると思いましたmemblob行が実際に問題の核心であることがわからない場合、7番目は再び質問に答えません(代わりにulimitを使用してプロセスを制限します); 8番目はpythonをインストールするように試みます; 9番目はすべてが非常に独創的であり、最後に10番目が彼自身のC++プログラムを作成したため、トップ投票の回答と同じ問題が発生します。
mem=nn[KMG]
カーネルブートパラメータでブート(詳細は linux/Documentation/kernel-parameters.txt を参照してください)。
私のdotfilesで同様のことを行う関数を保持しています。 https://github.com/sagotsky/.dotfiles/blob/master/.functions#L248
function malloc() {
if [[ $# -eq 0 || $1 -eq '-h' || $1 -lt 0 ]] ; then
echo -e "usage: malloc N\n\nAllocate N mb, wait, then release it."
else
N=$(free -m | grep Mem: | awk '{print int($2/10)}')
if [[ $N -gt $1 ]] ;then
N=$1
fi
sh -c "MEMBLOB=\$(dd if=/dev/urandom bs=1MB count=$N) ; sleep 1"
fi
}
簡単なpythonソリューションはどうですか?
#!/usr/bin/env python
import sys
import time
if len(sys.argv) != 2:
print "usage: fillmem <number-of-megabytes>"
sys.exit()
count = int(sys.argv[1])
megabyte = (0,) * (1024 * 1024 / 8)
data = megabyte * count
while True:
time.sleep(1)
Ramfsが存在する場合はどうですか?マウントして大きなファイルにコピーしますか?ない場合/dev/shm
とramfsなし-入力値に基づいて大きなmallocを実行する小さなCプログラムでしょうか?大量のメモリを搭載した32ビットシステムでは、一度に数回実行する必要がある場合があります。
メモリが限られている特定のプロセスをテストする場合は、割り当て可能なメモリの量を制限するために ulimit
を使用することをお勧めします。
これは間違った質問をするケースであり、最も創造的な答えを求めて競合する人々によって狂気に追い込まれているケースだと思います。 OOM状態をシミュレートするだけでよい場合は、メモリをいっぱいにする必要はありません。カスタムアロケーターを使用して、特定の数の割り当て後に失敗するようにします。このアプローチは SQLite に対して十分に機能するようです。
私はそのためにこの小さなC++プログラムを書きました: https://github.com/rmetzger/dynamic-ballooner
この実装の利点は、メモリを解放または再割り当てする必要があるかどうかを定期的にチェックすることです。