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”一章中。
我从那里提取两个重要的命令(我认为):
root@host:~# sysctl vm.overcommit_memory=2
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