菜鸟笔记
提升您的技术认知

linux 内存查看方法:meminfo\maps\smaps\status 文件解析-ag真人游戏

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
网站地图