AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 527085
Accepted
Dan Pritts
Dan Pritts
Asked: 2013-07-30 09:21:46 +0800 CST2013-07-30 09:21:46 +0800 CST 2013-07-30 09:21:46 +0800 CST

Linux(非透明)每进程大页记帐

  • 772

我最近将一些 java 应用程序转换为使用 linux 手动配置的大页面运行,如此处所述。我指出“手动配置”是因为它们不是 透明的大页面,这给我们带来了一些性能问题。

所以现在,我在一个系统上运行了大约 10 个 tomcat,我很想知道每个 tomcat 使用了多少内存。

我可以按照Linux Huge Pages Usage Accounting/proc/meminfo中的描述获取摘要信息。

但我找不到任何工具可以告诉我实际的每个进程的大页面使用情况。

我四处/proc/pid/numa_stat寻找,发现了一些有趣的信息,这些信息使我感到如此粗暴:

function pshugepage () {
    HUGEPAGECOUNT=0
    for num in `grep 'anon_hugepage.*dirty=' /proc/$@/numa_maps | awk '{print $6}' | sed 's/dirty=//'` ; do
        HUGEPAGECOUNT=$((HUGEPAGECOUNT+num))
    done
    echo process $@ using $HUGEPAGECOUNT huge pages
}

或者这个,在 perl 中:

sub counthugepages {
    my $pid=$_[0];
    open (NUMAMAPS, "/proc/$pid/numa_maps") || die "can't open numa_maps";
    my $HUGEPAGECOUNT=0;
    while (my $line=<NUMAMAPS>) {
        next unless ($line =~ m{ huge }) ;
        next unless ($line =~ m{dirty=});
        chomp $line;
        $line =~ s{.*dirty=}{};
        $line =~ s{\s.*$}{};
        $HUGEPAGECOUNT+=$line;
    }
    close NUMAMAPS;
    # we want megabytes out, but we counted 2-megabyte hugepages
    return ($HUGEPAGECOUNT*2);
}

它给我的数字是合理的,但我远不相信这种方法是正确的。

环境是四核戴尔,64GB 内存,RHEL6.3,oracle jdk 1.7.x(当前为 20130728)

linux-kernel
  • 2 2 个回答
  • 4843 Views

2 个回答

  • Voted
  1. Best Answer
    Dan Pritts
    2014-02-25T11:17:07+08:002014-02-25T11:17:07+08:00

    更新:Red Hat 现在建议在 RHEL5/6 上使用这种方法来处理巨页记帐:

    grep -B 11 'KernelPageSize:     2048 kB' /proc/[PID]/smaps \
       | grep "^Size:" \
       | awk 'BEGIN{sum=0}{sum+=$2}END{print sum/1024}'
    

    我在 procps-ng 开发人员的邮件列表中问过这个问题。有人告诉我:

    几个月前在 procps-ng/pmap 工具中引入了大页面支持(开关 -XX、-C、-c、-N、-n 应该允许您配置和显示正在运行的内核支持的任何条目)。

    我在 Fedora 19 上使用 procps-3.3.8 对此进行了一些实验。我认为它没有给我任何我从问题中建议的内容中没有得到的信息,但至少它具有权威的光环。

    FWIW我最终得到以下结果:

    .pmaprc 文件包含:

    [Fields Display]
    Size
    Rss
    Pss
    Referenced
    AnonHugePages
    KernelPageSize
    Mapping
    
    [Mapping]
    ShowPath
    

    然后我使用以下命令来提取大页面信息:

    pmap -c [process id here] | egrep 'Add|2048'
    

    在 grep 中,“添加”用于标题行。“2048”将抓取内核页面大小为 2048 的任何内容,即大页面。它还会抓取不相关的东西。

    这是一些示例输出:

         Address    Size   Rss   Pss Referenced AnonHugePages KernelPageSize Mapping
        ed800000   22528     0     0          0             0           2048 /anon_hugepage (deleted)
        f7e00000   88064     0     0          0             0           2048 /anon_hugepage (deleted)
        fd400000   45056     0     0          0             0           2048 /anon_hugepage (deleted)
    7f3753dff000    2052  2048  2048       2048          2048              4 [stack:1674]
    7f3759000000    4096     0     0          0             0           2048 /anon_hugepage (deleted)
    7f3762d68000    2048     0     0          0             0              4 /usr/lib64/libc-2.17.so
    7f376339b000    2048     0     0          0             0              4 /usr/lib64/libpthread-2.17.so
    

    我们只关心 kernelPageSize 为 2048 的行。

    我认为它告诉我我已经在大页面中分配了 159744 KB (22528+88064+45056+4096) 的 RAM。我告诉 java 使用 128M 作为它的堆,它还有一些其他的内存池,所以这是一个合理的数字。Rss & Referenced 0 不太有意义,但是测试 java 程序非常简单,所以它也是合理的。

    它与我从上面的 perl 片段中得到的数字不一致,因为 perl 只搜索“脏”页面 - 那些实际使用过的页面。和/或因为 perl 是错误的,我不知道。

    我还在 RHEL6 机器上尝试了 procps 3.3.9,其中一些活动的 tomcat 使用了大量的大页内存。Rss & Referenced 列都是 0。这很可能是内核的错,而不是 procps,我不知道。

    • 6
  2. Mark Lakata
    2014-11-15T11:53:09+08:002014-11-15T11:53:09+08:00

    改进的 perl 脚本

    #!/usr/bin/perl
    #
    sub counthugepages {
        my $pid=$_[0];
        open (NUMAMAPS, "/proc/$pid/numa_maps") || die "can't open numa_maps";
        my $HUGEPAGECOUNT=0;
        while (<NUMAMAPS>) {
            if (/huge.*dirty=(\d+)/) {
              $HUGEPAGECOUNT+=$1;
            }
        }
        close NUMAMAPS;
        return ($HUGEPAGECOUNT);
    }
    
    printf "%d huge pages\n",counthugepages($ARGV[0]);
    
    • 3

相关问题

  • 一个 ext3 目录中的最大文件数,同时仍然获得可接受的性能?

  • 使用地址空间布局随机化时的 Munin“可用熵”

  • 请解释“top”命令的以下o/p

  • 如何让 Linux 识别我热插拔的新 SATA /dev/sda 驱动器而无需重新启动?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve