Linux:手动减少堆大小

时间:2013-04-09 11:06:06

标签: linux memory

我正在尝试模拟内存消耗。所以这就是我的想法:

  1. 关闭提交。
  2. 减少可用堆,以便更快地发生内存耗尽。
  3. 运行测试中的程序。
  4. 我的问题是w.r.t 2:有没有减少内核分配的堆大小的技巧?我可以编写另一个分配大量RAM的程序,但可能有更聪明的方法吗?

3 个答案:

答案 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的进程,以试图释放内存。