2013-11-25 68 views
2

我需要编写一个bash脚本,该脚本会消耗我的ESXi的最大内存,并可能会产生内存不足。如何使用bash脚本生成内存不足

我已经检查了here并尝试多次运行给定的脚本,以便我可以消耗更多的500Mb的RAM。

但是我得到一个“sh:内存不足”的错误(当然),我想知道是否有可能配置分配给我的shell的内存量?

  • 注1:另一个要求是我不能进入虚拟机运行一个贪婪的任务。
  • 注2:我试图用巨大的RAM创建贪婪的新虚拟机的脚本,但是我无法进入存在内存不足的ESXi状态。
  • 注意3:我不能使用C编译器,我只有非常有限的Python库。

预先感谢您的帮助:)

+0

制作一个ramdisk(https://wiki.debian.org/ramfs)并填入一个大文件。 – thom

+0

不幸的是,我的ESXi服务器上没有“mount”命令。 –

+0

ESXi不是基于我可以修改的内核... –

回答

1

Bash有ulimit命令,它可以用来设定可通过一个bash过程中使用的虚拟内存的大小和启动的进程它。

有两个限制,一个硬限制和一个软限制。您可以降低两个限制,但只能将软限制提高到硬限制。 ulimit -S -v unlimited将虚拟内存大小设置为无限制(如果硬限制允许)。 如果设置了硬限制(请参见ulimit -H -v),请检查设置它的行的任何初始化脚本。

4

从我早期的答案:https://unix.stackexchange.com/a/254976/30731

如果你有基本的GNU工具(shgrepyeshead),你可以这样做:

yes | tr \\n x | head -c $BYTES | grep n 
# Protip: use `head -c $((1024*1024*2))` to calculate 2MB easily 

这工作,因为grep的负载RAM中的整行数据(我在擦除磁盘映像时以一种相当不幸的方式学到了这一点)。由yes替代换行符生成的行将会无限长,但受限于head$BYTES字节,因此grep将在内存中加载$ BYTES。 Grep本身对我来说就像100-200KB一样使用,您可能需要将其减去更精确的数量。

如果你也想加入一个时间限制,这可以很容易地在bash完成(不会sh工作):

cat <(yes | tr \\n x | head -c $BYTES) <(sleep $SECONDS) | grep n 

<(command)事情似乎鲜为人知,但往往是非常有用的在这里就可以了,更多的信息:http://tldp.org/LDP/abs/html/process-sub.html

那么对于使用catcat将等待输入,完成后退出,并保持开放的管道之一,它会不断的grep活着。

如果你有pv,想慢慢增加RAM使用:

yes | tr \\n x | head -c $BYTES | pv -L $BYTESPERSEC | grep n 

例如:

yes | tr \\n x | head -c $((1024*1024*1024)) | pv -L $((1024*1024)) | grep n 

将以每秒1MB的速度最多使用一千兆字节。作为额外的奖励,pv将向您显示目前的使用率和总使用率。当然,这也与之前的变种来完成:

yes | tr \\n x | head -c $BYTES | pv | grep n 

只需插入| pv |部分将显示您当前的状态(吞吐量和总,在默认情况下,我认为 - 否则看到的人(UAL)页)。

+1

这似乎不适用于busybox grep。我发现这个解决方案,但它只是消耗内存(这正是我所期待的)'tail/dev/zero' – falstaff

+0

@falstaff在Debian上使用GNU工具也适用于我。似乎你的解决方案更通用,很好找!你介意我的解决方案是否包含在我的答案中? – Luc