我正在尝试模拟内存消耗。所以这就是我的想法:
我的问题是w.r.t 2:有没有减少内核分配的堆大小的技巧?我可以编写另一个分配大量RAM的程序,但可能有更聪明的方法吗?
答案 0 :(得分:7)
您可以使用ulimit
系统调用删除最大进程内存大小。该命令可从shell获得。有问题的选项是-v
(最大内存大小),因此例如将进程限制为最大2GB:
ulimit -v 2097152
然后从该shell启动进程。
如果使用-H
选项进行ulimit,则会设置一个硬限制,一旦设置就不能增加(root可以增加限制)。
如果您想从程序中进行控制,可以使用setrlimit
系统调用,方式如下:
#include <sys/types.h>
#include <sys/resource.h>
struct rlimit the_limit = { 2097152 * 1024, RLIM_INFINITY };
if (-1 == setrlimit(RLIMIT_AS, &the_limit)) {
perror("setrlimit failed");
}
这会将软限制设置为2GB
,您可以通过更改RLIM_INFINITY
值来设置硬限制。请注意,如果您是root用户,则只能增加硬限制。
此限制适用于可用于进程的内存总量,而不仅仅是可用作堆的内存。
可以使用-d
选项限制堆内存。 setrlimit
来电的等效名称为RLIMIT_DATA
。此限制仅适用于内存分配 - 例如malloc,mmap,静态数据。
答案 1 :(得分:2)
如果使用ulimit -d
,则可以限制数据段大小,该大小用于堆分配(以及全局/静态变量)。
答案 2 :(得分:0)
要模拟内存耗尽,您还可以使用mmap映射大内存段,并确保将它们“锁定”在内存中。有关如何锁定内存中的页面的信息,请参见mmap手册页。这样就不会交换这些内容,可用内存也会减少。
如果对大型有名mmap段的请求失败,您可能需要请求几个小型段(例如256KB)。无论如何你想要一路走下去,你可能需要让你的mmap进程免受Linux“OOM杀手”的攻击(通过将OOM prio设置为-17)。另外,当Linux发现系统的可用内存运行太低时,它可以选择并终止正在调用mmaps的进程,以试图释放内存。