文章目录
前言
前面我们已经学习了 CPU 篇,这篇来看下内存篇。
内存信息
/proc/meminfo
这个文件记录着比较详细的内存配置信息,使用 cat /proc/meminfo 查看。
[root@master ~]# cat /proc/meminfo
MemTotal: 1863196 kB
系统总内存,由于 BIOS、内核等会占用一些内存,所以这里和配置声称的内存会有一些出入,比如我这里配置有 2G,但其实只有 1.51G 可用。
MemFree: 121916 kB
系统空闲内存。
MemAvailable: 551240 kB
应用程序可用内存。有人会比较奇怪和 MemFree 的区别,可以从两个层面来区分,MemFree 是系统层面的,而 MemAvailable 是应用程序层面的。系统中有些内存虽然被使用了但是有一部分是可以回收的,比如 Buffers、Cached 及 Slab 这些内存,这部分可以回收的内存加上 MemFree 才是 MemAvailable 的内存值,这是内核通过特定算法算出来的,是一个估算值。
Buffers: 204 kB
缓冲区内存
Cached: 539568 kB
缓存
SwapCached: 0 kB
Active: 955436 kB
Inactive: 367568 kB
Active(anon): 761336 kB
Inactive(anon): 36160 kB
Active(file): 194100 kB
Inactive(file): 331408 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Dirty: 4 kB
Writeback: 0 kB
AnonPages: 783228 kB
Mapped: 134288 kB
Shmem: 14264 kB
Slab: 127384 kB
SReclaimable: 69812 kB
SUnreclaim: 57572 kB
KernelStack: 11040 kB
PageTables: 42224 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 3028744 kB
Committed_AS: 4617028 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 185664 kB
VmallocChunk: 34359310332 kB
HardwareCorrupted: 0 kB
AnonHugePages: 122880 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 141184 kB
DirectMap2M: 1955840 kB
DirectMap1G: 0 kB
上面信息没有 MemUsed 的值,虽然可以用现有的值大致估算出来,但是我们想一步到位,就用下面的 free 命令。
free
这个命令估计用的人就多了(我一般都是用这个命令)。
这里存在一个计算公式:
MemTotal = used + free + buff/cache(单位 K)
几个字段和上面 /proc/meminfo 的字段是对应的。还有个 shared 字段,这个是多进程的共享内存空间,不常用。
我们注意到 free 很小,buff/cache 却很大,这是 Linux 的内存设计决定的,Linux 的想法是内存闲着反正也是闲着,不如拿出来做系统缓存和缓冲区,提高数据读写的速率。但是当系统内存不足时,buff/cache 会让出部分来,非常灵活的操作。
要看比较直观的值,可以加 -h 参数
dmidecode
同样可以使用这个命令,对于内存,可以使用 dmidecode -t memory 查看:
[root@master ~]# dmidecode -t memory |grep Size
Maximum Memory Module Size: 32768 MB
Maximum Total Memory Size: 491520 MB
Installed Size: 2048 MB (Single-bank Connection)
Enabled Size: 2048 MB (Single-bank Connection)
Installed Size: Not Installed
Maximum Memory Module Size: 32768 MB,Maximum Total Memory Size: 491520 MB怎么这么大,这是做什么用的?
vmstat
这个命令也是非常常用了。但对于内存,显示信息有限。它更多是用于进行系统全局分析和 CPU 分析。详细可以看 CPU 分析一文。
进程内存使用情况分析
最常用的两个命令 ps 和 top,虽然很简单的两个命令,但还是有不少学问的。
top 命令运行时默认是按照 CPU 利用率进行排序的,如果要按照内存排序,该怎么操作呢?两种方法,一种直接按 “M”(相应的按 “P” 是 CPU),另外一种是在键入 top 之后,按下 “F”,然后选择要排序的字段,再按下 “s” 确认即可。
可以看到,我按照 “%MEM” 排序的结果。这个结果对于查看系统占用内存较多的哪些进程是比较有用的。
然后这里我们会重点关注几个地方,上面横排区,和前面几个命令一样可以查看系统内存信息,中间标注的横条部分,和内存相关的有三个字段:VIRT、RES、SHR。
- VIRT:virtual memory usage,进程占用的虚拟内存大小。
- RES:resident memory usage,进程常驻内存大小,也就是实际内存占用情况,一般我们看进程占用了多少内存,就是看的这个值。
- SHR:shared memory,共享内存大小,不常用。
ps
ps 同样可以查看进