cat /proc/meminfo
cat /proc/pid/status
cat /proc/pid/maps
cat /proc/pid/smaps
cat /proc/pid/statm
free 因为linux系统的内存使用策略的缘故; 直接用free并不能真正体现可用内存。只能表示系统空闲物理内存
echo 1 > /proc/sys/vm/drop_caches 清缓存
1、/proc/meminfo各字段含义
cat /proc/meminfo
MemTotal: 116224 kB
当前系统总的可用的内存,物理内存减去一些保留内存和内核使用,正在使用的和空闲的
MemFree: 5248 kB
空闲内存,LowFree + HighFree之和,MemFree表示的就是当前空闲的内存数目
MemAvailable: 45552 kB 可用内存,MemAvailable就是不需要额外磁盘操作(开 销较大)就可以使用的空闲内存的数量,cache/buffer、slab都有一部分可以回收, 所以这部分可回收的内存加上MemFree才是系统可用的内存,available 是可能需要经过一些内存回收的流程之后, 才能分配到的内存。
Buffers: 1864 kB 给文件的缓冲大小,系统分配但未被使 用的 buffer 数量
Cached: 37824 kB
被高速缓冲存储器(cache memory)用的内存的大小等于 diskcache minus SwapCache )系统分配但未被使用的 buffer 数量
SwapCached: 0 kB
被高速缓冲存储器(cache memory)用的交换空间的大小,已经被交换出来的内存,但仍然被存放在swapfile中。用来在需要的时候很快的被替换而不需要再次打开I/O端口。
Active: 67720 kB
在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要否则不会被移作他用.Active = Active(anon)+Active(file)
Inactive: 10656 kB
在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径,最近未使用的内存,回收时优先回收
Active(anon): 40644 kB
活跃的匿名内存(进程中堆上分配的内存,是用malloc分配的内存),活跃的anonymous pages(匿名页)预分配的虚拟内存,还未有数据占用
Inactive(anon): 168 kB
不活跃的匿名内存
Active(file): 27076 kB
活跃的file内存Inactive(file): 10488 kB
不活跃的file内存
Unevictable: 72 kB
不能被释放的内存页
Mlocked: 72 kB
mlock()系统调用锁定的内存大小
SwapTotal: 0 kB
交换空间总大小
SwapFree: 0 kB
空闲交换空间
Dirty: 52 kB
等待被写回到磁盘的大小
Writeback: 0 kB
正在被写回的大小
AnonPages: 38240 kB
未映射页的大小
Mapped: 28308 kB
设备和文件映射大小
Shmem: 2124 kB
已经被分配的共享内存大小
Slab: 18640 kB
内核数据结构缓存大小
SReclaimable: 8180 kB
可收回slab的大小
SUnreclaim: 10460 kB
不可回收的slab的大小 SUnreclaim+SReclaimable=Slab
KernelStack: 3408 kB
kernel消耗的内存
PageTables: 1128 kB
管理内存分页的索引表的大小
NFS_Unstable: 0 kB
不稳定页表的大小
Bounce: 0 kB
在低端内存中分配一个临时buffer作为跳转,把位于高端内存的缓存数据复制到此处消耗的内存
WritebackTmp: 0 kB
FUSE用于临时写回缓冲区的内存
CommitLimit: 58112 kB
系统实际可分配内存总量 CommitLimit =
(vm.overcommit_ratio * Physical RAM)/100 + Swap
Committed_AS: 1882924 kB
系统当前已分配的内存总量,包括已分配但尚未使用的内存大小。
VmallocTotal: 258867136 k
vmalloc 可使用的总内存大小
VmallocUsed: 0 kB
已被使用的虚拟内存大小
VmallocChunk: 0 kB
在 vmalloc 区域中可用的最大的连续内存块的大小
/proc/pid/status各字段的含义
/ # cat /proc/4548/status
Name: sai_client
State: S (sleeping)Tgid: 4548
Ngid: 0
Pid: 4548
PPid: 1
当前进程的父进程
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 64
文件描述符的最大个数
Groups: 0 10
VmPeak: 964016 kB
进程地址空间的大小
VmSize: 931180 kB
进程虚拟地址空间的大小reserved_vm:进程在预留或特殊的内存间的物理页
VmLck: 36 kB
进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘,Vmlck的值为36Kb,这是因为分配的最少单位是36KB,以后每次递增都是36KB的整数倍.
VmPin: 0 kB
VmHWM: 51128 kB
程序得到分配到物理内存的峰值,文件内存映射和匿名内存映射的大小
VmRSS: 50276 kB
程序现在使用的物理内存
VmData: 890924 kB
表示进程数据段的大小.
VmStk: 132 kB
表示进程堆栈段的大小.
VmExe: 324 kB
表示进程代码的大小.
VmLib: 33364 kB
表示进程所使用LIB库的大小.
关于代码段,堆栈段,数据段:
代码段可以为机器中运行同一程序的数个进程共享
堆栈段存放的是子程序(函数)的返回地址、子程序的参数及程序的局部变量
数据段则存放程序的全局变量、常数以及动态数据分配的数据空间(比如用
malloc函数申请的内存)
与代码段不同,如果系统中同时运行多个相同的程序,它们不能使用同一堆栈段和数据段.
注意:
堆栈段代表的是程序中的堆区(stack),堆区一般是编译器自动分配释放的.我们用malloc申请的内存,它占用的其实是栈区(heap),栈区一般是程序员自已分
配释放的,而栈区在这里属于数据段,所以我们看到上面测试程序通过调用malloc函数后,VmData一值有了很大的变化.
VmPTE: 580 kB
占用的页表的大小.
VmPMD: 16 kB
VmSwap: 0 kB
进程占用Swap的大小.
Threads: 100
表示当前进程组有100个线程.
SigQ: 0/452
表示当前待处理信号的个数,
SigPnd: 0000000000000000
屏蔽位,存储了该线程的待处理信号,等同于线程的PENDING信号
ShdPnd: 0000000000000000
屏蔽位,存储了该线程组的待处理信号.等同于进程组的PENDING信号.
SigBlk: 0000000000000000
存放被阻塞的信号,等同于BLOCKED信号.
SigIgn: 0000000000001006
存放被忽略的信号,等同于IGNORED信号.
SigCgt: 0000000180000000
存放捕获的信号,等同于CAUGHT信号.
CapInh: 0000000000000000
表示能够被当前进程执行的程序继承的能力.
CapPrm: 0000003fffffffff
表示进程能够使用的能力,在
cap_permitted中可以包含cap_effective中没有的能力,这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集.
CapEff: 0000003fffffffff
当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否
为0.
CapBnd: 0000003fffffffff
是系统的边界能力,我们无法改变它
CapAmb: 0000000000000000
Cpus_allowed: f
3指出该进程可以使用CPU的亲和性掩码,因为我们指定为两块CPU,所以这里就是3,如果该进程指定为4个CPU(如果有话),这里就是F(1111).
Cpus_allowed_list: 0-3
该进程可以使用CPU的列表
voluntary_ctxt_switches: 1177
nonvoluntary_ctxt_switches: 231