[Linux运维]使用内存
1. free 输出
$free -m
total used free shared buffers cached
Mem: 19138 18828 309 0 832 9151
-/+ buffers/cache: 8843 10294
Swap: 1961 1503 457
各行的意思为:
- 第一行是从操作系统(OS)的角度来看的,Mem[total] = Mem[used] + Mem[free], Mem[shared]表示被多个进程共享的内存,Mem[buffers]表示被OS buffer住的内存,Mem[cached]表示被OS cache的内存。共享内存,buffer,cache分别如下:
顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
A buffer is something that has yet to be "written" to disk.
A cache is something that has been "read" from the disk and stored for later use.
- 第二行是从应用程序的角度来看系统的内存,used,即
- buffers/cache
,表示应用程序认为系统被用掉了多少内存; free,即+ buffers/cache
,表示应用程序认为系统还有多少内存。公式如下:
buffers/cache[used] = Mem[used] - Mem[buffers] - Mem[cached]
buffers/cache[free] = Mem[free] + Mem[buffers] + Mem[cached]
即,程序认为可用内存要加上buffers和cached的大小,程序认为系统还剩内存要减掉buffers和cached的大小,因为buffers和cached对于应用程序来说是可以使用的。
- 第三行,表示swap的使用情况
当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换。
2. /proc/meminfo
$ cat /proc/meminfo
MemTotal: 7955604 kB
MemFree: 189616 kB
Buffers: 176740 kB
Cached: 6864784 kB
SwapCached: 0 kB
Active: 3830536 kB
Inactive: 3520836 kB
Active(anon): 309872 kB
Inactive(anon): 216 kB
Active(file): 3520664 kB
Inactive(file): 3520620 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 332 kB
Writeback: 0 kB
AnonPages: 309856 kB
Mapped: 23224 kB
Shmem: 260 kB
Slab: 330412 kB
SReclaimable: 288188 kB
SUnreclaim: 42224 kB
KernelStack: 1944 kB
PageTables: 16644 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3977800 kB
Committed_AS: 1585052 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 26272 kB
VmallocChunk: 34359709820 kB
HardwareCorrupted: 0 kB
AnonHugePages: 22528 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 6144 kB
DirectMap2M: 8280064 kB
这里的很多信息,都会被top
,ps
,free
使用。下面说一下各行的意思,单位是kilobytes。
- MemTotal: 物理机总内存
- MemFree: 物理机未使用的内存
- Buffers: 用作buffer的物理内存
- Cached: 用作cache的物理内存
- SwapCached: 用作cache的swap大小
- Active: 最近被使用,不能用作其他用途的buffer或者page cache大小
- Inactive: 与上相反
Active = Active(anon) + Active(file)
Active = Active(anon) + Active(file)
- Active(anon) :
- Inactive(anon)
- Active(file)
- Inactive(file)
- Unevictable
- Mlocked
- SwapTotal: Swap的大小
- SwapFree: 未使用的swap
- Dirty: 需要写disk的内存大小
- Writeback:
- AnonPages
- Mapped
- Shmem
- Slab
- SReclaimable
- SUnreclaim
- KernelStack
- PageTables
- NFS_Unstable
- Bounce
- WritebackTmp
- CommitLimit
- Committed_AS
- VmallocTotal
- VmallocUsed
- VmallocChunk
- HardwareCorrupted
- AnonHugePages
- HugePages_Total
- HugePages_Free
- HugePages_Rsvd
- HugePages_Surp
- Hugepagesize
- DirectMap4k
- DirectMap2M
3. 查看进程所占的内存 /proc/pid/status, /proc/pid/statm
(1) /proc/pid/status
$ cat /proc/1287/status
Name: python
State: S (sleeping) # 进程状态
Tgid: 1287 # 线程组ID
Pid: 1287 # 任务ID
PPid: 1285 # 父进程ID
TracerPid: 0 # 接受跟踪该进程信息的进程ID
Uid: 0 0 0 0 # 分别为: Uid euid suid fsuid
Gid: 0 0 0 0 # 分别为: Gid egid sgid fsgid
Utrace: 0 #
FDSize: 64 # 文件描述符的最大个数
Groups: 0 #
VmPeak: 148668 kB #
VmSize: 148636 kB # 任务虚拟地址空间的大小
VmLck: 0 kB # 任务已经锁住的物理内存的大小,锁住的内存不能swap到硬盘上
VmHWM: 5980 kB #
VmRSS: 5980 kB # 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)
VmData: 2516 kB # 程序数据段的大小
VmStk: 100 kB # 任务在用户态的栈的大小
VmExe: 4 kB # 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库
VmLib: 7624 kB # 被映像到任务的虚拟内存空间的库的大小 (exec_lib)
VmPTE: 132 kB # 该进程的所有页表的大小,单位:kb
VmSwap: 0 kB
Threads: 1 # 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符。
SigQ: 2/62001 # 待处理信号的个数
SigPnd: 0000000000000000 # 屏蔽位,存储了该线程的待处理信号
ShdPnd: 0000000000000000 # 屏蔽位,存储了该线程组的待处理信号
SigBlk: 0000000000000000 # 存放被阻塞的信号
SigIgn: 0000000001001000 # 存放被忽略的信号
SigCgt: 0000000180000002 # 存放被俘获到的信号
CapInh: 0000000000000000
CapPrm: ffffffffffffffff
CapEff: ffffffffffffffff
CapBnd: ffffffffffffffff
Cpus_allowed: 7fff
Cpus_allowed_list: 0-14
Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list: 0
voluntary_ctxt_switches: 197
nonvoluntary_ctxt_switches: 2
(2) /proc/pid/statm
$ cat /proc/1287/statm
37159 1495 733 1 0 654 0
每一列的意思(每个字段的单位都是页)为:
- Size (pages): 任务虚拟地址空间的大小 VmSize/4
- Resident(pages): 应用程序正在使用的物理内存的大小 VmRSS/4
- Shared(pages): 共享页数
- Trs(pages): 程序所拥有的可执行虚拟内存的大小 VmExe/4
- Lrs(pages): 被映像到任务的虚拟内存空间的库的大小 VmLib/4
- Drs(pages): 程序数据段和用户态的栈的大小 (VmData+ VmStk )4
- dt(pages): 脏页
4. 参考:
(1) https://www.centos.org/docs/5/html/5.1/Deployment_Guide/s2-proc-meminfo.html
(2) http://blog.yufeng.info/archives/2456