使用Solaris中的所有系统内存

时间:2012-12-10 18:31:20

标签: perl shell memory solaris

我正在进行服务器测试,故意尝试使用所有内存来破坏Solaris服务器。服务器的ulimit为15 GB(总系统/交换内存的数百GB)。有没有使用shell / Perl脚本执行此操作的直接方法? (编辑:这是在一个强化/安全的环境中,所以我唯一可以访问的工具是Perl [和shell当然])。

背景:实际测试的是将基本流程故障转移到另一台服务器。最近我们一直在使许多进程“失控”并消耗所有系统资源,从而导致服务器崩溃(单独的问题)。我正在尝试创建一个简单的可重复场景来测试对这种情况的响应。

2 个答案:

答案 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应该很快达到任何限制。