如何填满90%的空闲内存?

如何填满90%的空闲内存?

我想做一些低资源测试为此,我需要将 90% 的可用内存填满。

我怎样才能在*nix系统上做到这一点?

答案1

压力NG是一个工作负载生成器,可模拟 POSIX 系统上的 cpu/mem/io/hdd 压力。这个调用应该可以在 Linux < 3.14 上实现:

stress-ng --vm-bytes $(awk '/MemFree/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

对于 Linux >= 3.14,您可以使用MemAvailable以下方法来估计新进程的可用内存而不进行交换:

stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1

/proc/meminfo使用free(1)/ /etc调整调用vm_stat(1)。如果你需要它便携式。另请参阅参考 wiki 的stress-ng进一步的使用示例。

答案2

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

head -c BYTES /dev/zero | tail
head -c 5000m /dev/zero | tail #~5GB, portable
head -c 5G    /dev/zero | tail #5GiB on GNU (not busybox)

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

就快点RAM 完全耗尽,您可以删除限制head部分:

tail /dev/zero

如果你也想添加持续时间bash,这可以很容易地在(在 中不起作用)中完成sh

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

<(command)告诉解释器运行command并使其输出显示为文件,因此echo <(true)将输出文件处理器,例如 /dev/fd/63,因此对于 cat 来说,它看起来像是传递了两个文件,更多信息如下:http://tldp.org/LDP/abs/html/process-sub.html

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

如果你有pv并且想要缓慢增加 RAM 使用量:

head -c TOTAL /dev/zero | pv -L BYTES_PER_SEC | tail
head -c 1000m /dev/zero | pv -L 10m | tail

后者将以每秒 10 兆字节的速率使用多达 1 GB 的数据。作为额外的奖励,pv显示当前使用率和迄今为止的总使用量。当然,这也可以通过以前的变体来完成:

head -c 500m /dev/zero | pv | tail

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

兼容性提示和替代方案
如果您没有/dev/zero设备,标准yestr工具可能会替代:(yes | tr \\n x | head -c BYTES | tail输出yes无限量的“是”,tr替代换行符,使所有内容都变成一大行,而尾部需要将所有内容保留在内存中)。
另一种更简单的替代方案是使用dddd if=/dev/zero bs=1G of=/dev/null在 GNU 和 BusyBox 上使用 1GB 内存,但在一个核心上使用 100% CPU。
最后,如果您head不接受后缀,您可以计算内联字节数,例如 50 MB:head -c $((1024*1024*50))


致谢福斯塔夫贡献一个更简单、更广泛兼容的变体(例如 BusyBox)。


为什么还有另一个答案?接受的答案建议安装一个软件包(我敢打赌每个芯片组都有一个版本,而不需要软件包管理器);投票最高的答案建议编译 C 程序(我没有安装编译器或工具链来为您的目标平台进行编译);第二个投票最高的答案建议在虚拟机中运行应用程序(是的,让我通过 USB 或其他设备添加此手机的内部 SD 卡并创建一个 VirtualBox 映像);第三个建议修改启动顺序中的某些内容,这些内容不会按需要填充 RAM;第四个仅在 /dev/shm 挂载点 (1) 存在且 (2) 较大时有效(重新挂载需要 root);第五个结合了上面的许多内容,没有示例代码;第六个是一个很好的答案,但在提出我自己的方法之前我没有看到这个答案,所以我想我应该添加我自己的答案,也是因为如果您没有看到 memblob 行,那么记住或输入的时间会更短其实才是问题的关键;第七个再次没有回答问题(使用 ulimit 来限制进程);第八个尝试让你安装 python;第九个认为我们都非常没有创造力,最后第十个编写了他自己的 C++ 程序,这导致了与投票最高的答案相同的问题。

答案3

您可以将C程序写入malloc()所需的内存,然后用于mlock()防止内存被换出。

然后就让程序等待键盘输入,并解锁内存,释放内存并退出。

答案4

来自 HN 的评论:https://news.ycombinator.com/item?id=6695581

只需通过 dd 或类似方式填充 /dev/shm 即可。

swapoff -a
dd if=/dev/zero of=/dev/shm/fill bs=1k count=1024k

相关内容