我想在命令行输入pid并返回尚未保留的最大连续地址空间。有任何想法吗?
我们的32位应用程序,在64位RHEL 5.4上运行,在运行了一段时间之后,就像24小时一样。那时它的内存使用量只有2.5 GB,但我们会出现内存错误。我们认为它无法映射大型文件,因为应用程序的内存空间是碎片化的。我想去生产服务器,然后测试一下这个理论。
答案 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,那么很容易运行。