聊聊 Linux 的内存统计( 四 )


  • Shared_Clean:共享的Clean内存的大小
  • Shared_Dirty:共享的Dirty内存的大小
  • Private_Clean:私有的Clean内存的大小
  • Private_Dirty:私有的Dirty内存的大小
  • Referenced:当前被标记为引用的页的大小
  • Anonymous:匿名内存的大小
  • AnonHugePages:透明大页内存的大小
  • Swap:Swap的大小
  • 【聊聊 Linux 的内存统计】KernelPageSize:内核页大小
  • MMUPageSize:MMU页大小
  • Locked:被mlock的内存大小
  • VmFlags:页的标志位,有点多这里不列举,详见参考资料 [4]
  • 可以看到Rss这个指标实际上是包含了共享库的大小的,不同的进程会共享这个映射的,如果想通过累加这个值来计算所有进程用到的内存的话就不准确了,而Pss把共享库的大小均摊给了所有用到映射了这个库的进程,所以累加起来就不会重复计算共享库大小了 。
    P.S. 最新的内核文档提到了要加smaps_rollup这个统计,支持Pss_AnonPss_FilePss_Shmem三个分类统计,这个在进程级别看,用到内存就很清晰了 。
    我们可以累加一下这个值看看某进程用到的内存总和:
    聊聊 Linux 的内存统计

    文章插图
    注意单位是KB,所以这里进程用到的内存是 1.17 GB 左右 。
    这是个使用共享内存作为存储的服务,所以这是符合预期的 。如果想要看排除共享内存的部分,那要看Anonymous部分的总和:
    聊聊 Linux 的内存统计

    文章插图
    所以实际匿名内存使用是 63 MB 左右 。
     
    top 命令top命令中关于内存使用的统计:
    聊聊 Linux 的内存统计

    文章插图
    内存相关的统计有VIRTRESSHRSWAPCODEDATAUSED
    • VIRT — Virtual Memory Size,虚拟内存大小,包括所有代码、数据和共享库,以及已交换的页面和已映射但未使用的内存
    • RES — Resident Memory Size,驻留内存大小,共享的内存比如动态库也会计算在内
    • SHR — Shared Memory Size,共享的内存大小,并非所有共享的内存都是常驻的
    • SWAP — Swapped Size,非驻留内存大小
    • CODE — Code Size,程序可执行代码的大小
    • DATA — Data + Stack Size,可执行代码以外的物理内存量,也称为数据驻留集大小
    • USED — Memory in Use,RES + SWAP 的大小
     
    其他的内存查看命令常用的还有这些:vmstatsarslabtopkmstatpsprstatpmap等等 。懒得写了,有问题看man文档得了 。
     
    参考文献[1] Understanding the Linux Kernel, Daniel Plerre Bovet / Marco Cesati, 2005-11
    [2] Professional Linux Kernel Architecture, Wolfgang Mauerer, 2008-10-13
    [3] Systems Performance: Enterprise and the Cloud, Brendan Gregg, 2013-10-26
    [4] https://raw.githubusercontent.com/torvalds/linux/master/Documentation/filesystems/proc.txt
    [5] https://en.wikipedia.org/wiki/Resident_set_size
    [6] https://en.wikipedia.org/wiki/Proportional_set_size
    [7] https://en.wikipedia.org/wiki/Unique_set_size




    推荐阅读