本文旨在介绍Linux下分析内存的各种工具及其背后的原理。
背景
在Linux 性能优化基础中引入了诸多内存性能分析工具,同时为了更好地理解Linux内核内存管理,需要对Linux下内存分析工具做一个简单分析。
free
bash
$ free -m
total used free shared buff/cache available
Mem: 3909 890 222 29 2795 2715
Swap: 0 0 0
- total:系统中总的内存,Mem指物理内存,Swap指交换分区
- used:程序使用的内存
- free:未被分配的物理内存大小
- shared:共享内存大小,主要用于进程间通信
- buff/cache:buff指的是buffers,用来给块设备做缓存,cache指的是page cache,用来给打开的文件做缓存,以提高文件访问速度
- available:当内存短缺,系统可用回收buffers和page cache, a v a i l a b l e = f r e e + b u f f e r s + p a g e c a c h e − 不可回收的部分 available=free+buffers+page cache-不可回收的部分 available=free+buffers+pagecache−不可回收的部分
procfs
bash
$ cat /proc/meminfo
MemTotal: 4003144 kB
MemFree: 219916 kB
MemAvailable: 2772960 kB
Buffers: 329880 kB
Cached: 2095056 kB
SwapCached: 0 kB
Active: 1709508 kB
Inactive: 1456840 kB
Active(anon): 756224 kB
Inactive(anon): 2992 kB
Active(file): 953284 kB
Inactive(file): 1453848 kB
Unevictable: 64 kB
Mlocked: 64 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 136 kB
Writeback: 0 kB
AnonPages: 741352 kB
Mapped: 618776 kB
Shmem: 30332 kB
KReclaimable: 438920 kB
Slab: 495000 kB
SReclaimable: 438920 kB
SUnreclaim: 56080 kB
KernelStack: 8656 kB
PageTables: 18856 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2001572 kB
Committed_AS: 4880780 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 24664 kB
VmallocChunk: 0 kB
Percpu: 3168 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages: 0 kB
ShmemPmdMapped: 0 kB
FileHugePages: 0 kB
FilePmdMapped: 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: 155296 kB
DirectMap2M: 4018176 kB
DirectMap1G: 2097152 kB
sysfs
bash
$ ls /sys/devices/system/memory
auto_online_blocks memory1 memory13 memory3 memory35 memory39 memory42 memory46 memory7 probe
block_size_bytes memory10 memory14 memory32 memory36 memory4 memory43 memory47 memory8 soft_offline_page
hard_offline_page memory11 memory15 memory33 memory37 memory40 memory44 memory5 memory9 uevent
memory0 memory12 memory2 memory34 memory38 memory41 memory45 memory6 power
pcstat
hcache
hcache 在 pcstat基础上的改进,可以显示page cache的一些统计信息,通过它,你可以快速定位占用缓存最多的文件或进程,从而优化内存使用或排查异常问题。
bash
./hcache --help
Usage of ./hcache:
-bname
convert paths to basename to narrow the output
-histo
print a simple histogram instead of raw data
-json
return data in JSON format
-nohdr
omit the header from terse & text output
-pid int
show all open maps for the given pid
-plain
return data with no box characters
-pps
include the per-page status in JSON output
-terse
show terse output
-top int
show top x cached files
-unicode
return data with unicode box characters
原理
hcache 通过解析 /proc 文件系统中的内存映射数据,结合页缓存统计信息,生成缓存报告。