我正在用 zram 测试我的系统,我需要一个能够使用尽可能多的 RAM 的脚本。这个脚本应该用随机的东西填充我的 RAM,而不仅仅是零。
答案1
赶紧跑 :
echo {1..1000000000}
解释 :
Shell 在将命令发送给内核之前,会扩展所有正则表达式和简写。扩展后的命令暂时存储在 RAM 中。上述命令会扩展为非常大的命令,因此它将完全填满 RAM(在 8GB 上测试)。
警告 :这不是填充 RAM 的受控方法。运行此命令后,您可能会陷入困境。我建议您保持打开状态system monitor
(以观察 RAM 使用情况)并尝试使用较小的数字。
答案2
memtester
是一个用户空间程序,用于分配内存(您指定的任何数量)并使用随机模式对其进行测试。但它将避免使用交换空间。但如果您memtester
先用 移除所有内存(使用 检查free -m
),然后启动任何其他使用大量内存的程序(gimp、firefox 等),那么交换空间应该可以正常使用。
另一种选择是类似于openssl rand -base64 $((1024*1024*1024)) | less
较少使用>
跳到最后一行;这将导致 1GB 的 base64 编码随机数据被加载到内存中(但速度很慢)。
如果您正在寻找更有效的方法,那么任何脚本语言(例如 Python)中的小脚本都可以。
#!/usr/bin/python2
import numpy
result = [numpy.random.bytes(1024*1024) for x in xrange(1024)]
print len(result)
这将使用随机数据分配 1G 内存,并在终止前打印分配的 MB 数。如果您需要超过 1024M,请相应地调整 xrange 值。
答案3
正如 prophecy201 所建议的那样,压力是一款非常实用的工具,可以充分利用系统内存。添加更多工作器会占用更多 RAM,但也会占用更多 CPU,如果您只想测试 RAM,那么这种做法非常低效。更不用说 zram 还需要 CPU 来进行压缩。
相反,您应该增加与标志一起使用的 RAM 量--vm-bytes
。例如,要使用一个工作器占用 4 GB 的 RAM:
stress -m 1 --vm-bytes 4G
您可能还会发现该--vm-keep
标志很有用,因为它将保留内存分配而不是不断地重新分配,因此内存使用量将保持恒定而不是波动:
stress -m 1 --vm-bytes 4G --vm-keep
最后,看看这里以确保 zram 是你真正想要的;因为你确实有 swap,zswap 可能是一个更好的解决方案:zram vs zswap vs zcache 终极指南:何时使用哪一个
答案4
如果你用随机字节填充内存,特别是如果你随机快速触碰大量内存,zswap 的工作会非常糟糕,性能会变得更差。
zram 压缩内存页面的内容,并且压缩仅在数据不是随机。真实数据(尤其是内存数据)通常具有相当好的可压缩性。
zram 也只有在您具有“引用局部性”时才有用,就像大多数程序一样——它们倾向于在接触其他页面子集之前反复接触相同的页面。(这也是普通虚拟内存也能工作的原因。压缩缓存只是在普通的未压缩页面和磁盘存储之间添加了一个新的内存级别。)
如果你知道这一点,并有意尝试在最坏情况下测试 zswap,也许可以找到错误,那就去做吧。
但如果不是,您可能应该阅读 Paul R. Wilson 等人的论文“虚拟内存系统中压缩缓存的案例”,该论文解释了 RAM 压缩何时有用,何时有害,以及自适应算法如何在有用时使用,何时无用。(该论文以 html 形式在线发布在某个 USENIX 网站上,并以 pdf 形式发布在其他地方。谷歌一下。)
不幸的是,据我所知,zram 并不具备他们描述的那种通用的自动适应功能,因此您必须将压缩缓存大小设置为适合您的工作负载的某个合理的通常值。
这种方法效果很好的一种情况是,如果你的 RAM 比任何一个程序使用的 RAM 都多,但闲置的应用程序也占用了内存,并且在应用程序之间切换。闲置应用程序的页面往往会被压缩,当你切换回它们时,它们只需要解压缩,而不需要从磁盘加载。