Linux:如何检查进程可用的最大连续地址范围

时间:2012-02-22 21:15:49

标签: linux memory-management mmap memory-fragmentation

我想在命令行输入pid并返回尚未保留的最大连续地址空间。有任何想法吗?

我们的32位应用程序,在64位RHEL 5.4上运行,在运行了一段时间之后,就像24小时一样。那时它的内存使用量只有2.5 GB,但我们会出现内存错误。我们认为它无法映射大型文件,因为应用程序的内存空间是碎片化的。我想去生产服务器,然后测试一下这个理论。

3 个答案:

答案 0 :(得分:2)

我上面评论的更好的版本:

#!perl -T

use warnings;
use strict;

scalar(@ARGV) > 0 or die "Use: $0 <pid>";

my $pid = $ARGV[0];
$pid = oct($pid) if $pid=~/^0/;         # support hex and octal PIDs
$pid += 0; $pid = abs(int($pid));       # make sure we have a number

open(my $maps, "<", "/proc/".$pid."/maps") or
        die "can't open maps file for pid ".$pid;

my $max = 0;
my $end = 0;
while (<$maps>) {
        /([0-9a-f]+)-([0-9a-f]+)/;
        $max = hex ($1) - $end if $max < hex ($1) - $end;
        $end = hex ($2);
}

close ($maps);

END {
        print "$max\n";
}

答案 1 :(得分:2)

可能不完全是你想要的,但是从一个过程中可以通过mmap进行二进制搜索而不需要分配。即mmap(4GB),如果失败mmap(2GB),如果成功mmap(3GB),依此类推。

答案 2 :(得分:0)

  

我们出现了内存错误。我们认为它无法映射大型文件,因为应用程序的内存空间是碎片化的。

但是,人们还可以获得OOM错误,同时仍然在纸上有大量的免费虚拟地址范围,例如足够缺乏RAM +交换。此外,您的系统和/或程序可能已关闭过度使用(sysctl -a),或禁止交换(mlock(2)),或者您实际上对映射(ulimit -v)实际上有一个非常钝的限制 - 后者如果某些发行版以这种或那种方式设置了这样的ulimits,那么很容易运行。