缘起
问题的源头是技术交流群中有位同学问如何排查一个内存占用问题。
我有个机器buffer/cache占用内存特别多,导致available内存不够了,有啥查看的方法没?
主要问题在于:就是找了半天没找到内存在哪被占用了
[root@mix-13 ~]# free -h
total used free shared buff/cache available
Mem: 125G 1.2G 1.0G 122G 123G 464M
Swap: 0B 0B 0B
[root@mix-13 ~]# cat /proc/meminfo
MemTotal: 131338164 kB
MemFree: 1077164 kB
MemAvailable: 467944 kB
Buffers: 9344 kB
Cached: 128550504 kB
SwapCached: 0 kB
Active: 613668 kB
Inactive: 128433176 kB
Active(anon): 497864 kB
Inactive(anon): 128151348 kB
Active(file): 115804 kB
Inactive(file): 281828 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 492 kB
Writeback: 0 kB
AnonPages: 487100 kB
Mapped: 237252 kB
Shmem: 128171596 kB
Slab: 906596 kB
SReclaimable: 488948 kB
SUnreclaim: 417648 kB
KernelStack: 25744 kB
PageTables: 10848 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 65669080 kB
Committed_AS: 136093504 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 0 kB
VmallocChunk: 0 kB
Percpu: 24576 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB
DirectMap4k: 582656 kB
DirectMap2M: 18913280 kB
DirectMap1G: 116391936 kB
方案一
有人给出建议:
但是仍然找不到:
可以思考下,为什么这种方法不行??
方案二
接着,又有人给出了答案
查共享内存占用情况。
有没有更方便的方案呢?
方案三
大杀器smem
工具。
它可以统计的比较详细。
$ smem -t -U root -k
非常直观了。
后话
这里将smem
推荐给大家,在遇到内存问题时,可以第一时间考虑用它来快速查看内存使用情况。
那么smem
的各个参数都是什么意思呢?
在Linux中,smem是一个用于查看系统内存使用情况的命令行工具。当使用smem命令时,它将返回一个内存使用情况报告,其中包括一些缩写词,如PSS、USS和RSS。这些词代表以下内容:
- PSS (Proportional Set Size):是所有共享库和代码的实际占用的内存总量,按照每个进程实际使用的内存进行分配。
- USS (Unique Set Size):是进程独自使用的内存总量,不包括共享库和代码的内存。换句话说,USS是进程私有的部分占用的内存。
- RSS (Resident Set Size):是进程当前驻留在RAM中的物理内存总量。
因此,PSS表示进程当前使用的内存量,其中包括共享库和代码的内存;USS表示进程独自使用的内存量,不包括共享库和代码的内存;RSS表示进程当前在RAM中驻留的物理内存总量,它包括进程所使用的所有内存,包括共享内存、私有内存和页缓存。
这三个值的区别在于计算方式和涵盖的内存内容。PSS和USS可以帮助您识别和调试共享内存问题,而RSS可以帮助您了解进程实际使用的物理内存量。如果您需要更深入地了解进程的内存使用情况,则可以查看PSS、USS和RSS值的详细报告,以识别问题并进行调试。