2

我需要编写一个 bash 脚本,它会消耗我的 ESXi 的最大 RAM,并可能产生内存短缺。

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

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

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

预先感谢您的帮助 :)

4

2 回答 2

13

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

如果你有基本的 GNU 工具(headtail)或 Linux 上的 BusyBox,你可以这样做来填充一定数量的空闲内存

</dev/zero head -c BYTES | tail

# Protip: use $((1024**3*7)) to calculate 7GiB easily
</dev/zero head -c $((1024**3*7)) | tail

这是因为 tail 需要将当前行保存在内存中,以防它是最后一行。仅输出空字节且不输出换行符的/dev/zero行将无限长,但仅限headBYTES字节,因此tail将仅使用那么多内存。要获得更精确的数量,您需要检查系统上使用了多少 RAMhead及其tail本身并减去它。

要快速完全用完 RAM,您可以删除限制head部分:

tail /dev/zero

如果您还想添加一个 duration,这可以很容易地完成bash(在 中不起作用sh):

cat <( </dev/zero head -c BYTES) <(sleep SECONDS) | tail

<(command)件事似乎鲜为人知,但通常非常有用,更多信息在这里:http ://tldp.org/LDP/abs/html/process-sub.html

然后使用cat:cat将等待输入完成直到退出,并且通过保持其中一个管道打开,它将保持tail活动状态。

如果您有pv并且想要慢慢增加 RAM 使用量

</dev/zero head -c BYTES | pv -L BYTES_PER_SEC | tail

例如:

</dev/zero head -c $((1024**3)) | pv -L $((1024**2)) | tail

将以每秒 1 兆字节的速度使用多达 1 千兆字节。作为额外的奖励,pv将向您显示当前的使用率和到目前为止的总使用量。当然,这也可以通过以前的变体来完成:

</dev/zero head -c BYTES | pv | tail

只需插入| pv |零件即可显示当前状态(默认情况下吞吐量和总量)。


感谢falstaff贡献了一个更简单、更广泛兼容的变体(比如 BusyBox)。

于 2016-01-12T23:51:51.070 回答
1

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

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

于 2014-01-03T23:13:06.270 回答