リソースの少ないテストをいくつか行いたいので、そのために空きメモリの90%をいっぱいにする必要があります。
*nix
システムでこれを行うにはどうすればよいですか?
リソースの少ないテストをいくつか行いたいので、そのために空きメモリの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
/ / etcを使用/proc/meminfo
して呼び出しを調整します。ポータブルが必要な場合。free(1)
vm_stat(1)
stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.98;}' < /proc/meminfo)k --vm-keep -m 1
--vm 1 and --vm-keep
を提供することは非常に重要です。単純に--vm-bytes
何もしないので、必要なだけのメモリを割り当てることができると思い込まれます。256Gのメモリを割り当てて自分自身の健全性をチェックしようとするまで、私はこれに少し困りました。これは答えの欠陥ではなく、正しいフラグを提供しますが、追加の注意が必要です。
-m 1
。ストレスのマンページによると、次の-m N
略です--vm N
:スポーンN
ワーカーの回転malloc()/free()
Cプログラムをmalloc()
必要なメモリに書き込んでmlock()
から、メモリがスワップアウトされるのを防ぐために使用できます。
次に、プログラムにキーボード入力を待機させ、メモリのロックを解除し、メモリを解放して終了します。
calloc
同じ問題IIRCに遭遇します。すべてのメモリは、同じ読み取り専用のゼロ化されたページを指すだけです。書き込みを試みるまで、実際には割り当てられません(読み取り専用であるため機能しません)。私が知っていることを本当に確信する唯一の方法はmemset
、バッファ全体を実行することです。詳細については、次の回答を参照してくださいstackoverflow.com/a/2688522/713554
メモリが限られている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
pv
インストールされている、それは数を見ることができます:dd if=/dev/zero bs=1024 |pv -b -B 1024 | dd of=/dev/shm/fill bs=1024
あなたは、基本的なGNUツール持っている(場合はsh
、をgrep
、yes
と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
毎秒1MBの速度で最大1ギガバイトを使用します。追加ボーナスとして、pv
現在の使用率とこれまでの合計使用量が表示されます。もちろん、これは以前のバリアントでも実行できます。
yes | tr \\n x | head -c $BYTES | pv | grep n
| pv |
パーツを挿入するだけで、現在のステータスが表示されます(デフォルトでは、スループットと合計、そうでない場合はman(ual)ページを参照してください)。
なぜ別の答えですか?受け入れられた答えは、パッケージのインストールを推奨しています(パッケージマネージャーを必要とせずにすべてのチップセットのリリースがあるはずです)。上位の回答では、Cプログラムのコンパイルを推奨しています(ターゲットプラットフォーム用にコンパイルするためのコンパイラまたはツールチェーンがインストールされていませんでした)。2番目に上位に選ばれた回答では、VMでアプリケーションを実行することを推奨しています(そう、この電話の内部SDカードをusbなどでddし、virtualboxイメージを作成します)。3番目は、ブートシーケンスで、必要に応じてRAMを一杯にしないものを変更することを提案しています。4番目は/ dev / shmマウントポイント(1)が存在し、(2)が大きい場合にのみ機能します(再マウントにはルートが必要です)。5番目は、サンプルコードなしで上記の多くを組み合わせています。6番目は素晴らしい答えですが、私は自分のアプローチを考え出す前にこの答えを見ませんでした、だから、私は自分で追加しようと思った。それは、memblob行が実際に問題の核心であることがわからない場合、覚えたり入力したりするのが短いからだ。7番目もまた質問に答えません(代わりにulimitを使用してプロセスを制限します)。8番目は、pythonのインストールを試みます。9人目は私たちは皆非常に創造的ではないと考え、最後に10人目は彼自身のC ++プログラムを作成しました。
set -e
ので、私は何かを学んだだけです:)
私は、ドットファイルで似たようなことをする関数を保持しています。 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)
sysctl vm.swappiness=0
vm.min_free_kbytesを1024程度の小さな値に設定し、さらに設定することができます。私は試していませんが、これはスワップアウトの迅速さを制御する方法であるとドキュメントは述べています...あなたのマシンでOOM状態を引き起こすポイントまで、実際にそれをかなり遅くすることができます。kernel.org/doc/Documentation/sysctl/vm.txtおよびkernel.org/doc/gorman/html/understand/understand005.htmlを
限られたメモリで特定のプロセスをテストしたい場合ulimit
は、割り当て可能なメモリの量を制限するために使用した方が良いかもしれません。
man setrlimit
:RLIMIT_RSS Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM). This limit only has effect in Linux 2.4.x, x < 30, and there only affects calls to madvise(2) specifying MADV_WILLNEED.
そのためにこの小さなC ++プログラムを作成しました:https : //github.com/rmetzger/dynamic-ballooner
この実装の利点は、メモリを解放または再割り当てする必要があるかどうかを定期的にチェックすることです。