这既是一个关于挂起进程/SIGSTOP 的问题,也是一个关于stress
所以我使用压力来模拟系统上的内存压力。
stress --vm X --vm-bytes YM
这工作正常,但我注意到它消耗了大量的 CPU。
root@ET0021B703EB23:~# ps -aux | grep stress
root 11800 0.0 0.0 2192 232 pts/4 S+ 15:21 0:00 stress --vm 1 --vm-bytes 10M
root 11801 83.5 0.2 12436 2436 pts/4 R+ 15:21 0:03 stress --vm 1 --vm-bytes 10M
现在,在这次测试中我不想关心 CPU 负载。我使用Ctrl+ Z暂停了我的stress
,现在我看到消耗的 CPU 已经下降,但内存仍然存在,这正是我想要的。
root@ET0021B703EB23:~# ps -aux | grep stress
root 9080 0.0 0.0 2760 296 pts/2 S+ 15:18 0:00 grep stress
root 17030 0.0 0.0 2192 172 pts/2 T 14:51 0:00 stress --vm 1 --vm-bytes 10M
root 17031 2.7 0.4 12436 4860 pts/2 T 14:51 0:44 stress --vm 1 --vm-bytes 10M
据我了解,保持进程暂停会将其保留在内存中。因此,我可以使用这种方法来可靠地模拟内存压力而不需要 CPU 成本吗?
我担心的是,Linux 中是否有某些东西会杀死内存压力下的挂起进程或以其他方式消除其对内存的影响(例如 Android 的 lowmemorykiller)。这样的事情是否存在,或者是否有任何原因导致这行不通?
答案1
我发现这篇 Oracle 文章关于 OOM Killer (Out Of Memory Killer) 回答了你一半的问题,特别是在“配置 OOM Killer”章节。
我从那里提取两个重要的命令(我认为):
- 禁用 OOM Killer
root@host:~# sysctl vm.overcommit_memory=2
- 从 OOM Killer 中排除进程
root@host:~# echo -17 > /proc/<pid>/oom_adj
其他非常有趣的答案是1.4在这个常见问题解答从压力项目页面来看,它说:
1.4 为什么我的CPU被锤了,但RAM却没有被锤?
这是因为压力如果其默认选项保守的话。通过强制虚拟内存管理器崩溃,很容易使系统暂时无法使用。因此,请确保您了解自己有多少内存,然后传递适当的选项。在具有 3 GB RAM 的双核 Intel 系统上,合理的调用如下:
stress -m 1 --vm-bytes 2G
对了,你的问题还没有得到解答。让我们看看压力手册...
-c, --cpu N
产生 N 个在 sqrt() 上旋转的工作线程
也许上面的选项会有所帮助,尝试将其设置为零。哎呀,这不起作用!?
查看代码后,我注意到默认情况下禁用此选项。我也注意到了--vm-挂选项可能就是您想要的。
默认动作为--vm正在 malloc()/free() 上旋转,并且它是 CPU 密集型的!--vm-挂使压力程序暂停一下每次分配秒数,直到自由的()。
尝试使用以下命令(消耗约 128MB RAM):
root@host:~# stress --vm 1 --vm-bytes 128000000 --vm-hang 3600
并在另一个终端中进行测试:
root@host:~# top