首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux:如何检查进程可用的最大连续地址范围

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

Stack Overflow用户
提问于 2012-02-23 05:15:49
回答 3查看 1.7K关注 0票数 2

我想在命令行中输入pid,然后返回尚未保留的最大连续地址空间。有什么想法吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-23 06:32:16

我上面的评论稍微好一点:

代码语言:javascript
复制
#!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";
}
票数 2
EN

Stack Overflow用户

发布于 2012-02-23 06:47:37

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

票数 2
EN

Stack Overflow用户

发布于 2012-02-23 07:32:39

我们得到内存不足的错误。我们认为它无法映射大文件,因为应用程序的内存空间是零碎的。

然而,在纸上仍然有大量空闲的虚拟地址范围的情况下,例如由于缺乏足够的RAM+swap,也可能会出现面向对象的错误。此外,您的系统和/或程序可能已经关闭了覆盖(sysctl -a),或者已经禁止了交换(mlock(2)),或者您实际上对映射(ulimit -v)有一个非常迟钝的限制--后者很容易运行,因为一些发行版以这样或那样的方式设置了ulimit。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9403146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档