在Linux中如何确定进程的内存限制?

16

我一直在搜寻互联网上关于Java进程在Linux(Red-hat)机器上可以占用多少内存的信息。(我不是在谈论堆,而是指整个Java进程占用的总内存量)。

我没有权限在那台机器上执行任何程序。因此,我不能简单地执行一个消耗内存的程序直到发生Out-Of-Memory条件。

然而,我有权限检查配置文件等。(例如:我尝试执行cat /proc/meminfo,但我无法理解它;似乎没有任何结果代表我想了解的参数)。

我在另一台我有权限执行程序的Red Hat机器上尝试了一个Java程序,并成功看到该程序增长到3GB左右。

是否有办法找出一个进程可以获得多少内存?

3个回答

15

我执行了 "ulimit -a" 命令,但是输出结果中有很多选项需要尝试。所以我尝试了 "ulimit -m" 命令,结果显示为 "unlimited"。我不知道这是什么意思,但我认为它并不意味着一个进程可以占用无限的内存...是吗? - rk2010
2
@rk2010 表示任何进程在内存使用方面都没有配额限制,唯一的硬性限制是计算机拥有多少 RAM 和交换内存。 - Dr. Snoopy
@Matias,但是互联网上有很多(含糊)信息表明某个进程不能消耗超过3GB的内存。你对此有什么看法? - rk2010
2
@rk2010 这取决于操作系统是64位还是32位,对于32位操作系统,每个进程只能寻址约3.5 GB的内存。无论如何,如果您拥有更多的内存,就“需要”使用64位操作系统。 - Dr. Snoopy
1
32位进程可以拥有的总内存是无限的(机器上所有存储空间(硬盘、内存等)的大小决定了其他地方使用的内存量)。但是,任何时候可以映射(作为直接可寻址内存访问)的最大内存量是4GB-(2的n次方),n通常为30,因此为4GB-1GB=3GB。n为29将给您3.5GB。我不记得如何更改n。 - ctrl-alt-delor
需要注意的是,ulimit 命令是内置于 /bin/sh/bin/bash shell 中的。如果您直接生成进程(而不使用 shell),则该命令不存在。 - Rob Raisch

6

2

我曾经遇到过这个问题,并发现如果您使用的是2.6.24或更高版本,则最好的解决方案是使用cgroup/cgroups。例如,下面是默认的/etc/cgconfig.conf文件,并在底部添加了一个控制组。此控制组将物理内存限制为100MB,虚拟内存总分配量限制为200MB。

mount {
    cpuset  = /cgroup/cpuset;
    cpu = /cgroup/cpu;
    cpuacct = /cgroup/cpuacct;
    memory  = /cgroup/memory;
    devices = /cgroup/devices;
    freezer = /cgroup/freezer;
    net_cls = /cgroup/net_cls;
    blkio   = /cgroup/blkio;
}

group daemons/java_limited_process {
    memory {
        memory.limit_in_bytes = "104857600";
        memory.memsw.limit_in_bytes = "209715200";
    }
}

一旦我配置好了这个,我就可以像这样将进程添加到组中

cgexec -g memory:daemons/java_limited_process /usr/local/tomcat/bin/startup.sh

这将限制主进程及其生成的任何子进程的内存。它还具有在控制器中查询内存使用情况的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接