2

サーバーのテストを行っており、すべてのメモリを使用してSolarisサーバーを意図的にクラッシュさせようとしています。サーバーの上限は15GBです(システム/スワップメモリ​​の合計は数百GB)。シェル/Perlスクリプトを使用してこれを行う簡単な方法はありますか?(編集:これは強化された/保護された環境にあるので、私がアクセスできる唯一のツールはPerl [そしてもちろんシェル]です)。

背景:実際にテストされているのは、重要なプロセスの別のサーバーへのフェイルオーバーです。最近、多くのプロセスが「制御不能」になり、すべてのシステムリソースを消費して、サーバーがクラッシュする原因になっています(別の問題)。この状況への応答をテストするために、単純な繰り返し可能なシナリオを作成しようとしています。

4

2 に答える 2

3

/tmp が tmpfs にマウントされていて、クォータを設定していないと仮定すると (つまり、デフォルト構成)、シェル スクリプトを使用してほぼすべてのメモリを使用する方法があります (システムがほとんど使用できないことに注意してください)。 RAM が使い果たされたらすぐに):

#!/bin/ksh

function trapped
{
  echo "Eatswap done"
  rm -f /tmp/eatSwap.*
  exit
}

function showFreeSpace
{
  freeSpace=$(swap -s | sed -e 's/.*, //' -e 's/k.*//')
  echo free space = $freeSpace KB
}

trap trapped 2
counter=0
i=0
showFreeSpace
fs=$freeSpace
while [ $i -lt 10 ]; do
  dd if=/dev/zero of=/tmp/eatSwap.$i bs=$(($fs/10)) count=1024 2>/dev/null || trapped
  sleep 2
  showFreeSpace
  i=$((i+1))
done
echo "done"
sleep 2
rm -f /tmp/eatSwap.*
于 2012-12-11T00:53:56.737 に答える
0

Perl では、文字列と繰り返し演算子を使用して、一定量のメモリを非常に正確に割り当てることができますx$xPerl は文字を 2 バイト表現で格納するため、次の関数はメモリの MBを指すスカラーを返します。

sub allocate_MB {
   my ($x) = @_;
   "0" x ( $x / 2 * 2**(20))
}

(ただし、perl 5.12 を使用する Ubuntu でのみテスト済み)

Perl がこれ以上メモリを割り当てることができない場合、Perl は終了し、そのことを知らせるメッセージが表示されます

シンプルmy @stor; push @stor, allocate_MB(200) while 1はすぐに限界に達するはずです。

于 2012-12-11T00:50:58.070 に答える