2

我想在命令行输入pid,取回没有被保留的最大的连续地址空间。有任何想法吗?

我们的 32 位应用程序在 64 位 RHEL 5.4 上运行,运行一段时间后(比如 24 小时)就报废了。那时它只使用了 2.5 GB 的内存,但我们得到了内存不足的错误。我们认为它无法映射大文件,因为应用程序的内存空间是碎片化的。我想去生产服务器测试这个理论。

4

3 回答 3

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";
}
于 2012-02-22T22:32:16.397 回答
2

可能不完全是您想要的,但是从进程内部可以通过mmaping 进行二进制搜索而不进行分配。即mmap(4GB),如果失败mmap(2GB),如果成功mmap(3GB),等等。

于 2012-02-22T22:47:37.113 回答
0

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

然而,在纸面上仍有大量空闲虚拟地址范围的情况下,也可能出现 OOM 错误,例如由于 RAM+swap 不足。此外,您的系统和/或程序可能关闭了过度使用 (sysctl -a),或者禁止交换 (mlock(2)),或者您实际上对映射有非常直接的限制 (ulimit -v) — 后者很容易在给定的某些发行版中以一种或另一种方式设置此类 ulimit。

于 2012-02-22T23:32:38.607 回答