我需要编写一个bash脚本,它会消耗我的ESXi的最大RAM并可能导致内存不足。
我已经检查了here并尝试多次运行给定的脚本,这样我就可以消耗更多500Mb的RAM。
但是我得到了“sh:out of memory”错误(当然),我想知道是否有可能配置分配给我的shell的内存量?
提前感谢您的帮助:)
答案 0 :(得分:5)
来自我之前的回答:https://unix.stackexchange.com/a/254976/30731
如果你有基本的GNU工具(
sh
,grep
,yes
和head
),你可以这样做: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然后使用
cat
:cat
将等待输入完成直到退出,并且通过保持其中一个管道打开,它将使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
),请检查任何初始化脚本以设置行。