我正在进行服务器测试,故意尝试使用所有内存来破坏Solaris服务器。服务器的ulimit为15 GB(总系统/交换内存的数百GB)。有没有使用shell / Perl脚本执行此操作的直接方法? (编辑:这是在一个强化/安全的环境中,所以我唯一可以访问的工具是Perl [和shell当然])。
背景:实际测试的是将基本流程故障转移到另一台服务器。最近我们一直在使许多进程“失控”并消耗所有系统资源,从而导致服务器崩溃(单独的问题)。我正在尝试创建一个简单的可重复场景来测试对这种情况的响应。
答案 0 :(得分:3)
假设/ tmp安装在tmpfs上并且你没有设置配额(即默认配置),这里是一种使用shell脚本几乎所有内存的方法(请注意你的系统将是你的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.*
答案 1 :(得分:0)
在Perl中,您可以通过字符串和重复运算符x
非常精确地分配固定数量的内存。由于Perl以双字节表示形式存储字符,因此以下函数将返回指向$x
MB内存的标量:
sub allocate_MB {
my ($x) = @_;
"0" x ( $x / 2 * 2**(20))
}
(但是,仅在Ubuntu上使用perl 5.12测试)
当Perl无法分配更多内存时,它将以message telling you so消亡。
简单的my @stor; push @stor, allocate_MB(200) while 1
应该很快达到任何限制。