我正在对远程寻呼机的实现进行一系列测试,该寻呼机将页面错误发送到网络中的其他计算机。
长话短说,我想知道是否有一种简单的方法可以强制进程使用虚拟内存而不是物理 RAM,以便我可以更好地衡量我的实现的性能与系统在交换到硬盘时的性能。
答案1
这很困难,但你本质上需要的是让一个单独的进程消耗所有可用的 RAM,将其自己的数据锁定到物理 RAM 中,但保留所有的交换可用(你应该能够使用“free”命令看到效果)
我认为已经有工具可以做到这一点(我不记得任何具体的例子,但有工具可以在系统运行时填充内存或测试内存是否存在位错误......诸如此类的事情)或类似的东西。
我的问题是...为什么?为什么要故意破坏测试机器,只为了得到与交换配置高度相关的数字(磁盘类型、大小、旋转速率等)?另外,首先,您的应用程序对资源的占用有多大?如果不是非常大(比如说一两兆的 RAM),那么交换不会造成太大的损害。
答案2
需要明确的是,RAM 是虚拟内存层次结构的一部分
进程不可能绕过 RAM...交换的页面如何重新进入 CPU 缓存?
你可以用一个内存非常低的盒子来模拟类似的东西,但即便如此,你也可以从 vmstat 中看到它仍然在被使用,并且以不确定的方式与你的测试集一起使用
答案3
您可以使用 限制进程可用的物理 RAM 量ulimit -m
。请注意,这ulimit
是 shell 内置命令,在 shell 手册页(man sh
或man bash
)中有记录。例如,以下代码片段将程序限制为 400kB 的物理内存:
(ulimit -m 400; exec /path/to/application)
底层接口是setrlimit(RLIMIT_RSS, …)
手册页指出 2.6 内核不支持此限制,但我认为它已经过时了,因为RLIMIT_RSS
当前 2.6 内核似乎使用了它。
答案4
在我看来,他想测试即使被监控的机器因频繁交换而陷入瘫痪,寻呼机消息也能发出。这是一个合理的测试案例。
我可能会设置一个程序来分配很多内存,并在整个内存中随机读取和写入,确保每个地址都是不同的页面。运行几个副本,以及几个视频压缩作业副本以消耗 CPU 周期 - 这应该会让机器忙碌起来。