我想在命令行中输入pid,然后返回尚未保留的最大连续地址空间。有什么想法吗?
我们的32位应用程序,运行在64位RHEL 5.4上,在运行一段时间后,比如24小时后就会崩溃。当时它只使用了2.5 gb的内存,但是我们得到了内存不足的错误。我们认为它无法映射大文件,因为应用程序的内存空间是零碎的。我想去生产服务器上测试一下这个理论。
发布于 2012-02-23 06:32:16
我上面的评论稍微好一点:
#!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-23 06:47:37
可能不完全是你想要的,但是在一个进程内部,可以通过mmaping来进行二进制搜索,而不需要分配。即mmap(4GB),如果失败了mmap(2GB),如果成功了mmap(3GB),依此类推。
发布于 2012-02-23 07:32:39
我们得到内存不足的错误。我们认为它无法映射大文件,因为应用程序的内存空间是零碎的。
然而,在纸上仍然有大量空闲的虚拟地址范围的情况下,例如由于缺乏足够的RAM+swap,也可能会出现面向对象的错误。此外,您的系统和/或程序可能已经关闭了覆盖(sysctl -a),或者已经禁止了交换(mlock(2)),或者您实际上对映射(ulimit -v)有一个非常迟钝的限制--后者很容易运行,因为一些发行版以这样或那样的方式设置了ulimit。
https://stackoverflow.com/questions/9403146
复制相似问题