2

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

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

4

2 回答 2

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.*
于 2012-12-11T00:53:56.737 回答
0

在 Perl 中,您可以通过字符串和重复运算符非常精确地分配固定数量的内存x。由于 Perl 以两字节表示形式存储字符,因此以下函数将返回一个指向$xMB 内存的标量:

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

(但是,仅在 Ubuntu 上使用 perl 5.12 进行了测试)

当 Perl 无法分配更多内存时,它会死掉并显示一条消息告诉你 so

一个简单的my @stor; push @stor, allocate_MB(200) while 1应该很快达到任何限制。

于 2012-12-11T00:50:58.070 回答