如何使用bash脚本生成内存不足

时间:2013-11-25 18:57:11

标签: bash shell esxi

我需要编写一个bash脚本,它会消耗我的ESXi的最大RAM并可能导致内存不足。

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

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

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

提前感谢您的帮助:)

2 个答案:

答案 0 :(得分:5)

来自我之前的回答: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中加载整行数据(在grepping磁盘映像时我以相当不幸的方式学习了这一点)。由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的速度使用高达1 GB的容量。作为额外的奖励,pv将向您显示当前的使用率和到目前为止的总使用量。当然,这也可以通过以前的变体来完成:

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

只需插入| pv |部分即可显示当前状态(吞吐量和总数,默认情况下,我认为 - 否则请查看man(ual)页面。)

答案 1 :(得分:1)

Bash有ulimit命令,可以用来设置bash进程可以使用的虚拟内存的大小以及由它启动的进程。

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