#memory #memory-size #benchmark #mlock #heap #oom

app memory-balloon

内存填充工具。分配指定大小的内存块,并尝试确保操作系统将其保持在主内存中,而不是交换空间。

1 个不稳定版本

0.1.0 2019年7月13日

#507 in 内存管理

Apache-2.0/MIT

15KB
191

Balloon - 内存填充工具

分配指定大小的内存块,并尝试确保操作系统将其保持在主内存中,而不是交换空间。

对于测试和调试 OOM/低内存情况以及执行某些基准测试非常有用。

名称灵感来源于虚拟机中常用的一种技术 内存膨胀

工作原理

该工具启动时带有一个参数,告诉它需要填充多少内存,以及一些可选的标志来控制某些功能。当程序启动时,它将执行以下操作

  1. 分配指定数量的内存,在一个连续的块中。该块将调整为操作系统使用的内存页面大小,或者可选地调整为使用 --page-size 设置的值。
  2. 如果没有设置 --no-lock 标志,并且程序运行在实现了该功能的操作系统上,它将锁定分配的内存区域到主内存,禁止操作系统将其移动到交换空间。这通过 Unix 平台上的 mlock 调用和 Windows 上的 VirtualLock 实现。
  3. 如果没有设置 --no-fill 标志,分配的内存将用来自快速 PRNG 生成的数据填充。PRNG 不是密码学安全的,但这并不重要。我们只是想访问所有内存页面并插入操作系统难以压缩的数据。这样,操作系统就不能进行一些无形的优化,实际上并没有为进程分配内存。
  4. 如果传递了 --poll-interval <sleep in ms> 参数,程序将进入一个无限循环,每个迭代都会在分配的每一页内存中读取+写入一个随机字节,然后暂停 <sleep in ms>,然后再重新开始。如果不存在 --poll-interval,程序将永久休眠。

内存锁定说明

在 Linux 上,对于谁可以调用 mlock 来锁定内存以及可以锁定多少内存有一些限制。如果在 Linux 2.6.8 或更早版本上运行,只有 root 可以锁定内存。在新内核中,未经授权的用户可以锁定内存,但受限于 RLIMIT_MEMLOCK 资源限制。此限制可以通过 ulimit -l <amount in kb> 命令进行调整,但只有 root 可以这样做,并且限制适用于每个会话。因此,最简单的方法是以 root 身份运行 balloon,否则尝试以下方法

faern@machine:~ $ sudo -i
root@machine:~ $ ulimit -l 10485760 # 10 GiB in KiB
root@machine:~ $ sudo -i faern
faern@machine:~ $ balloon 10G

示例场景

假设您想对文件系统和磁盘进行基准测试。因此,您运行了一些基准测试工具,这些工具将许多/大文件写入和读取到磁盘。由于有很多空闲内存,并且这些文件似乎经常被访问,操作系统很可能会将这些文件全部缓存在内存中。结果,您几乎没有真正触及磁盘或文件系统,您实际上测试的是操作系统缓存的能力以及您的内存速度。

解决方案:在启动基准测试工具之前,使用此工具填充未使用的内存。比如说,您的计算机有 16 GB 的内存。您检查当前的内存使用情况,您目前使用了 2.2 GB(不包括操作系统缓存等)。必须有一定的误差范围,所以您运行

# In one terminal:
$ balloon 12G

# While the above runs, you do your benchmarking in another one:
$ some_io_bench_utility --dir /storage/bench/

现在您的结果可能要低得多,更真实。并且驱动器的 LED 可能会闪烁很多。

旁注:您可能希望在基准测试之前尽可能关闭其他所有程序。它们可能在基准测试运行时分配和释放内存,为操作系统开始缓存留出内存空间,或者使用过多,迫使操作系统开始交换页面并降低性能。或者,其他程序可能会使用您试图基准测试的资源,从而从这个资源中夺取宝贵的带宽。

警告

此工具很容易导致您的计算机崩溃。鉴于它努力确保它控制的内存既不可压缩也不移动到交换空间,它很容易耗尽您的所有内存资源。

如果您在 16 GB 内存和只有 10 GB 可用内存的机器上运行 balloon 14G,您的计算机可能直接关闭。

免责声明

作为作者,我对大多数/任何操作系统的内存管理内部细节没有详细的了解。我非常欢迎关于如何改进此工具的反馈和建议。

依赖项

~3.5MB
~65K SLoC