我想做一些低资源测试为此,我需要将 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 工具 (head
和tail
) 或 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
设备,标准yes
和tr
工具可能会替代:(yes | tr \\n x | head -c BYTES | tail
输出yes
无限量的“是”,tr
替代换行符,使所有内容都变成一大行,而尾部需要将所有内容保留在内存中)。
另一种更简单的替代方案是使用dd
:dd 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