【问题标题】:Linux: how to check the largest contiguous address range available to a processLinux:如何检查进程可用的最大连续地址范围
【发布时间】:2012-03-13 06:34:12
【问题描述】:

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

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

【问题讨论】:

  • cat /proc/<pid>/maps 加上一些 awk/perl/whatever 按摩?
  • </proc/self/maps perl -ne'/-/;print hex($``)-$e,$/;$e=hex($'"'"')'| sort -nr|head -n 1
  • 谢谢!完美的!我确实必须将双 `` 更改为单 ` 才能使其工作。

标签: linux memory-management mmap memory-fragmentation


【解决方案1】:

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

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

【讨论】:

  • 我们在每台服务器上都有超过 70GB。我们运行 24 个应用程序副本。它上升到大约 2.5g,然后消失,没有核心文件。当它无法 malloc 或 mmap 时,我将创建一个日志条目,也许已经有一个。每台服务器使用大约 1g 的共享 mmap 内存。 ulimit -v 无限 overcommit_memory = 0
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    #!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";
    }
    

    【讨论】:

    • #!perl 真的有效吗?我的印象总是必须是一条绝对路径。
    • @Zack:不是真的。我把它放在那里只是为了强制-T(它只是表明我做了太多代码高尔夫)。
    • 轻微的挑剔 - 您忘记检查最后一次映射结束后的空间(在允许的最大用户空间地址完成,这取决于内核的配置)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2014-01-31
    • 2013-11-23
    • 2023-03-28
    相关资源
    最近更新 更多