• linux 内存查看方法:meminfomapssmapsstatus 文件解析


    linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free 等,比如通过/proc系统,一般需要比较详细和精确地知道整机内存/某个进程内存的使用情况,最好通过/proc 系统,下面介绍/proc系统下内存相关的几个文件

    单个进程的内存查看  cat /proc/[pid] 下面有几个文件: maps , smaps, status

    maps 文件可以查看某个进程的代码段、栈区、堆区、动态库、内核区对应的虚拟地址,如果你还不了解linux进程的内存空间,可以参考这里

    下图是maps文件内存示例

     Develop>cat /proc/self/maps 
    00400000-0040b000 r-xp 00000000 fd:00 48              /mnt/cf/orig/root/bin/cat
    0060a000-0060b000 r--p 0000a000 fd:00 48              /mnt/cf/orig/root/bin/cat
    0060b000-0060c000 rw-p 0000b000 fd:00 48              /mnt/cf/orig/root/bin/cat 代码段
    0060c000-0062d000 rw-p 00000000 00:00 0               [heap] 堆区
    7f1fff43b000-7f1fff5d4000 r-xp 00000000 fd:00 861   /mnt/cf/orig/root/lib64/libc-2.15.so
    7f1fff5d4000-7f1fff7d3000 ---p 00199000 fd:00 861  /mnt/cf/orig/root/lib64/libc-2.15.so
    7f1fff7d3000-7f1fff7d7000 r--p 00198000 fd:00 861   /mnt/cf/orig/root/lib64/libc-2.15.so
    7f1fff7d7000-7f1fff7d9000 rw-p 0019c000 fd:00 861   /mnt/cf/orig/root/lib64/libc-2.15.so
    7f1fff7d9000-7f1fff7dd000 rw-p 00000000 00:00 0 
    7f1fff7dd000-7f1fff7fe000 r-xp 00000000 fd:00 2554  /mnt/cf/orig/root/lib64/ld-2.15.so
    7f1fff9f9000-7f1fff9fd000 rw-p 00000000 00:00 0 
    7f1fff9fd000-7f1fff9fe000 r--p 00020000 fd:00 2554  /mnt/cf/orig/root/lib64/ld-2.15.so
    7f1fff9fe000-7f1fff9ff000 rw-p 00021000 fd:00 2554  /mnt/cf/orig/root/lib64/ld-2.15.so
    7f1fff9ff000-7f1fffa00000 rw-p 00000000 00:00 0 
    7fff443de000-7fff443ff000 rw-p 00000000 00:00 0     [stack] 用户态栈区
    7fff443ff000
    -7fff44400000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall] 内核区

    有时候可以通过不断查看某个进程的maps文件,通过查看其虚拟内存(堆区)是否不停增长来简单判断进程是否发生了内存溢出。

    maps文件只能显示简单的分区,smap文件可以显示每个分区的更详细的内存占用数据

    下图是smaps文件内存示例, 实际显示内容会将每一个区都显示出来,下面我只拷贝了代码段和堆区,

    每一个区显示的内容项目是一样的,smaps文件各项含义可以参考这里

     Develop>cat /proc/self/smaps 
    00400000-0040b000 r-xp 00000000 fd:00 48  /mnt/cf/orig/root/bin/cat
    Size:                 44 kB 虚拟内存大小
    Rss:                  28 kB 实际使用物理内存大小
    Pss:                  28 kB
    Shared_Clean:         0 kB 页面被改,则是dirty,否则是clean,页面引用计数>1,是shared,否则是private
    Shared_Dirty:          0 kB
    Private_Clean:        28 kB
    Private_Dirty:         0 kB
    Referenced:           28 kB
    Anonymous:             0 kB
    AnonHugePages:         0 kB
    Swap:                  0 kB  处于交换区的页面大小
    KernelPageSize:        4 kB  操作系统一个页面大小
    MMUPageSize:           4 kB  体系结构MMU一个页面大小 
    Locked:                0 kB

    0060c000-0062d000 rw-p 00000000 00:00 0 [heap]
    Size: 132 kB
    Rss: 8 kB
    Pss: 8 kB
    Shared_Clean: 0 kB
    Shared_Dirty: 0 kB
    Private_Clean: 0 kB
    Private_Dirty: 8 kB
    Referenced: 8 kB
    Anonymous: 8 kB
    AnonHugePages: 0 kB
    Swap: 0 kB
    KernelPageSize: 4 kB
    MMUPageSize: 4 kB
    Locked: 0 kB

    下图是status文件内存示例, 加粗部分是内存相关的统计,

     Develop>cat /proc/24475/status
    Name:    netio   可执行程序的名字
    State:    R (running) 任务状态,运行/睡眠/僵死
    Tgid:    24475  线程组号
    Pid:    24475   进程id
    PPid:    19635  父进程id
    TracerPid:    0  
    Uid:    0    0    0    0
    Gid:    0    0    0    0
    FDSize:    256 该进程最大文件描述符个数
    Groups:    0 
    VmPeak:     6330708 kB  内存使用峰值
    VmSize:
    268876 kB 进程虚拟地址空间大小
    VmLck:
    0 kB 进程锁住的物理内存大小,锁住的物理内存无法交换到硬盘

    VmHWM:
    16656 kB
    VmRSS:
    11420 kB 进程正在使用的物理内存大小
    VmData:
    230844 kB 进程数据段大小
    VmStk:
    136 kB 进程用户态栈大小
    VmExe:
    760 kB 进程代码段大小
    VmLib:
    7772 kB 进程使用的库映射到虚拟内存空间的大小
    VmPTE:
    120 kB 进程页表大小
    VmSwap:
    0
    kB Threads: 5 SigQ: 0/63346 SigPnd: 0000000000000000 ShdPnd: 0000000000000000 SigBlk: 0000000000000000 SigIgn: 0000000001000000 SigCgt: 0000000180000000 CapInh: 0000000000000000 CapPrm: ffffffffffffffff CapEff: ffffffffffffffff CapBnd: ffffffffffffffff Cpus_allowed: 01 Cpus_allowed_list: 0 Mems_allowed: 01 Mems_allowed_list: 0 voluntary_ctxt_switches: 201 nonvoluntary_ctxt_switches: 909

    可以看到,linux下内存占用是一个比较复杂的概念,不能

    简单通过一个单一指标就判断某个程序“内存消耗”大小,原因有下面2点:

    • 进程所申请的内存不一定真正会被用到(malloc或mmap的实现)
    • 真正用到了的内存也不一定是只有该进程自己在用 (比如动态共享库)

    关于内存的使用分析及本文几个命令的说明也可以参考这里

    下面是查看整机内存使用情况的文件 /proc/meminfo

     Develop>cat /proc/meminfo 
    MemTotal:        8112280 kB 所有可用RAM大小 (即物理内存减去一些预留位和内核的二进制代码大小)
    MemFree:         4188636 kB LowFree与HighFree的总和,被系统留着未使用的内存
    Buffers:           34728 kB 用来给文件做缓冲大小
    Cached:           289740 kB 被高速缓冲存储器(cache memory)用的内存的大小
    (等于 diskcache minus SwapCache )
    SwapCached:
    0 kB 被高速缓冲存储器(cache memory)用的交换空间的大小 
    已经被交换出来的内存,但仍然被存放在swapfile中。
    用来在需要的时候很快的被替换而不需要再次打开I/O端口
    Active:
    435240 kB 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,
    除非非常必要否则不会被移作他用
    Inactive:
    231512 kB 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径. Active(anon): 361252 kB Inactive(anon): 120688 kB Active(file): 73988 kB Inactive(file): 110824 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB 交换空间的总大小 SwapFree: 0 kB 未被使用交换空间的大小 Dirty: 0 kB 等待被写回到磁盘的内存大小 Writeback: 0 kB 正在被写回到磁盘的内存大小 AnonPages: 348408 kB 未映射页的内存大小 Mapped: 33600 kB 已经被设备和文件等映射的大小 Shmem: 133536 kB Slab: 55984 kB 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗 SReclaimable: 25028 kB 可收回Slab的大小 SUnreclaim: 30956 kB 不可收回Slab的大小(SUnreclaim+SReclaimable=Slab) KernelStack: 1896 kB 内核栈区大小 PageTables: 8156 kB 管理内存分页页面的索引表的大小 NFS_Unstable: 0 kB 不稳定页表的大小 Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2483276 kB Committed_AS: 1804104 kB VmallocTotal: 34359738367 kB 可以vmalloc虚拟内存大小 VmallocUsed: 565680 kB 已经被使用的虚拟内存大小 VmallocChunk: 34359162876 kB HardwareCorrupted: 0 kB HugePages_Total: 1536 大页面数目 HugePages_Free: 0 空闲大页面数目 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB 大页面一页大小 DirectMap4k: 10240 kB DirectMap2M: 8302592 kB

     

  • 相关阅读:
    Python2 和 Python3的区别 更新中
    CentOS下图形界面安装_Orcaale 11g
    Nmap_使用介绍
    shell_innobackup增量备份步骤
    shell_跳板机推送公钥
    shell_clean_log
    shell_xtrabackup_backup_mysql
    gitlab免密登录
    gitlab安装与部署
    git合并分支
  • 原文地址:https://www.cnblogs.com/jiayy/p/3458076.html
Copyright © 2020-2023  润新知