アプリケーションのパフォーマンス テスト中に、ある種のメモリ回帰テストを実行したい場合があります。この記事には、perl で記述された 2 つのメモリ回帰スクリプトが含まれています。これらは、テストのために、一定時間、特定量のメモリを占有します。
1.基本的なメモリ回帰スクリプト
このスクリプトを実行するには、次の手順を実行します:
$ perl memtest.pl 100
上記の例は 100 MB のメモリを占有し、入力を待ちます。単純な入力でスクリプトが終了し、メモリが解放されます。このようにして、必要なだけの時間、必要な量のメモリをこのスクリプトに占有させることができます。
最初の引数は、占有するメモリの量 (MB 単位) として取得されます。
注: 重要なシステムではこのスクリプトを実行しないでください。このスクリプトの実行中は注意してください。このスクリプトに大きなメモリ値を与えないでください。与えられたメモリの量が膨大であるか利用できない場合、システムがハングする可能性があります。
「vi memtest.pl」を実行し、次の perl コードをコピーして貼り付けて、このファイルを作成します。
# store and validate the command line parameter
$mb = $ARGV[0];
unless ( defined $mb and $mb =~ /^\d+$/ and $mb >= 1) {
die "Usage: $0 <occupy MB>\nEx: $0 100 - occupies 100 MB memory\n"
}
# convert it to bytes.
$b = $mb * 1024 * 1024;
# open in-memory file, and seek to size specified to get memory from OS.
open MEM, '>', \$memfile;
seek MEM, $b - 1, 0;
print MEM 'A';
close MEM;
printf "$mb MB memory is occupied, press ENTER to release: "; <STDIN>;
# till here the memory is occupied by this program.
undef $memfile;
printf "Memory released"; 2.高度なメモリ回帰スクリプト
このスクリプトを実行するには、次の手順を実行します:
$ perl memtest-adv.pl 250 (or) $ perl memtest-adv.pl 25%
この memtest-adv.pl は基本的なスクリプトと同じように機能しますが、パーセンテージを入力として指定することもできます。システムに合計 2GB の物理メモリがある場合、25% を指定できます。これは、テスト用に 500MB のメモリを占有します。
最初の引数は、MB 単位のメモリ量または占有されるメモリのパーセンテージのいずれかです。パーセンテージは、使用可能なプライマリ メモリの合計に対するパーセンテージを表します。
注: この Perl スクリプトは、指定された量のメモリをほぼ占有します。私たちがテストしたシステムでは、最大で 5MB 以上かかりました。したがって、重要なシステムではこれを使用しないでください。システムがハングする可能性があるため、このスクリプトはテスト システムでのみ使用してください。
「vi memtest-adv.pl」を実行し、次の perl コードをコピーして貼り付けて、このファイルを作成してください。
# calculate memory to be occupied from percentage given
sub find_memto_occupy
{
$pc = $_[0];
die "Wrong percentage given $pc\n" if ($pc > 100);
open MEMINFO, '<', '/proc/meminfo' or die "Unable to open /proc/meminfo to find available memory\n";
my $mem = <MEMINFO>;
if ( $mem =~ /^MemTotal:\s+(\d+)\s.*$/ ) {
$mem = $1;
} else {
die "Unable to find the available memory\n";
}
$mem = ( $mem / 100 ) * $pc;
return int($mem / 1024);
}
# main script
{
$num = $ARGV[0];
unless ( defined $num and $num =~ /^\d+%?$/ and $num >= 1) {
die "Usage: $0 <occupy MB>\nEx: $0 100 - occupies 100 MB memory\n"
}
if ( $num =~ /^(\d+)%$/ ) {
# convert percentage to bytes.
$pc = $1;
$mb = find_memto_occupy($pc);
} else {
$mb = $num;
}
$b = $mb * 1024 * 1024;
open MEM, '>', \$memfile;
seek MEM, $b - 1, 0;
print MEM chr(0);
close MEM;
print "$mb MB memory is occupied, press ENTER to release: "; <STDIN>;
undef $memfile;
print "Memory released";
}