内存使用分析
操作系统级别
/proc/meminfo
其中的Buffers和Cached的迷惑性非常大,非常难理解。Buffers是指的磁盘数据的缓存,Cached是指对文件数据的缓存.
free
该命令实际上是通过读取/proc/meminfo文件得到的如下输出
1 | $ free -h |
具体列含义:
- total: 总内存大小
- used:已经使用的内存大小,包含共享内存
- free:未使用的内存大小
- shared:共享内存大小
- buff/cache:缓存和缓冲区的大小
- available:新进程可用的内存大小
vmstat
1 | $ vmstat 1 |
容器级别
通过kubectl命令来查看内存使用
1 | $ kubectl top pod nginx-ingress-controller-85cd6c7b5d-md6vc |
通过docker stats命令来查看容器
1 | $ docker stats $container_id |
docker通过cgroup的统计数据来获取的内存值
参考文档:https://docs.docker.com/engine/reference/commandline/stats/
进程级别
具体的含义可以通过下文的/proc/$pid/status来查看,其他进程的内存含义
cat /proc/$pid/status
1 | cat status |
具体字段含义可以查看man文档:https://man7.org/linux/man-pages/man5/proc.5.html,跟内存相关的字段如下:
- VmRSS:虚拟内存驻留在物理内存中的部分大小
- VmHWM:使用物理内存的峰值
- VmData:进程占用的数据段大小
top命令查看
1 | $ top -p $pid |
具体列含义如下:
- VIRT:进程使用虚拟内存总大小,即使没有占用物理内存,包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换到swap空间的内存等
- RES: 进程实际使用的物理内存大小,不包括swap和共享内存
- SHR:与其他进程的共享内存、加载的动态链接库、程序代码段的大小
- MEM:进程使用的物理内存占系统总内存的百分比
ps命令查看
1 | $ps aux |
- RSS:虚拟内存中的常驻内存,即实际占用的物理内存,包括所有已经分配的堆内存、栈内存、共享内存,由于共享内存非独占,实际上进程独占的物理内存要少于RSS
pmap
1 | # pmap -x 452021 |
- Mapping: 支持如下值
- [anon]:分配的内存