我想在命令行输入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";
}
可能不是您想要的,但从进程内部,可以通过mmap
ing进行二进制搜索,而无需分配。即mmap(4GB)
,如果它失败了mmap(2GB)
,如果它成功了mmap(3GB
),依此类推
我们会出现内存不足的错误。我们认为它无法对大文件进行mmap,因为应用程序的内存空间是碎片化的。
然而,在纸上仍然有很多空闲的虚拟地址范围的情况下,也可能出现OOM错误,例如,由于缺乏足够的RAM+交换。此外,您的系统和/或程序可能关闭了过度传输(sysctl-a),或禁止了交换(mlock(2)),或者您实际上对映射有一个非常严格的限制(ulimit-v)——如果某些发行版以某种方式设置了这样的ulimits,则后者很容易在其中运行。