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



我想在命令行输入pid,并获取尚未保留的最大连续地址空间。有什么想法吗?

我们的32位应用程序在64位RHEL 5.4上运行,运行一段时间(比如24小时)后就会崩溃。当时它的内存使用量只有2.5 gb,但我们会出现内存不足的错误。我们认为它无法对大文件进行mmap,因为应用程序的内存空间是碎片化的。我想去生产服务器上测试一下这个理论。

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

#!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 "$maxn";
}

可能不是您想要的,但从进程内部,可以通过mmaping进行二进制搜索,而无需分配。即mmap(4GB),如果它失败了mmap(2GB),如果它成功了mmap(3GB),依此类推

我们会出现内存不足的错误。我们认为它无法对大文件进行mmap,因为应用程序的内存空间是碎片化的。

然而,在纸上仍然有很多空闲的虚拟地址范围的情况下,也可能出现OOM错误,例如,由于缺乏足够的RAM+交换。此外,您的系统和/或程序可能关闭了过度传输(sysctl-a),或禁止了交换(mlock(2)),或者您实际上对映射有一个非常严格的限制(ulimit-v)——如果某些发行版以某种方式设置了这样的ulimits,则后者很容易在其中运行。

相关内容

  • 没有找到相关文章