我可以暂停一个进程(`stress`)来模拟内存压力减去 CPU 成本吗?

Eri*_* S. 5 linux memory signals

这是一个关于挂起进程/SIGSTOP 的问题,因为它是关于 stress

所以我使用压力来模拟系统上的内存压力。

stress --vm X --vm-bytes YM
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我注意到它消耗了大量 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
Run Code Online (Sandbox Code Playgroud)

现在 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
Run Code Online (Sandbox Code Playgroud)

据我了解,保持进程暂停会将其保留在内存中。因此,我可以使用这种方法在没有 CPU 成本的情况下可靠地模拟内存压力吗?

我担心的是 linux 中是否有某些东西会杀死或以其他方式消除在内存压力下挂起的进程或其他东西(如 Android 的 lowmemorykiller)的内存影响。这样的事情是否存在,或者是否有任何理由无法正常工作?

小智 3

我发现这篇关于 OOM Killer(内存不足杀手)的 Oracle 文章回答了您一半的问题,特别是在“配置 OOM Killer”一章中。
我从那里提取两个重要的命令(我认为):

  1. 禁用 OOM Killerroot@host:~# sysctl vm.overcommit_memory=2
  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-hang选项可能就是您想要的。--vm

的默认操作是在 malloc()/free() 上旋转,并且它是 CPU 密集型的!--vm-hang使压力程序暂停每次分配秒数,直到free()为止。

尝试使用以下命令(消耗约 128MB RAM):
root@host:~# stress --vm 1 --vm-bytes 128000000 --vm-hang 3600
并在另一个终端中进行测试:
root@host:~# top