一文掌握 Linux 性能分析之内存篇
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫。
前面我们已经学习了 CPU 篇,这篇来看下内存篇。
01 内存信息
同样在分析内存之前,我们得知到怎么查看系统内存信息,有以下几种方法。
1.1 /proc/meminfo
这个文件记录着比较详细的内存配置信息,使用 cat /proc/meminfo
查看。
我们比较关心的是下面几个字段:
- MemTotal:系统总内存,由于 BIOS、内核等会占用一些内存,所以这里和配置声称的内存会有一些出入,比如我这里配置有 2G,但其实只有 1.95G 可用。
- MemFree:系统空闲内存。
- MemAvailable:应用程序可用内存。有人会比较奇怪和 MemFree 的区别,可以从两个层面来区分,MemFree 是系统层面的,而 MemAvailable 是应用程序层面的。系统中有些内存虽然被使用了但是有一部分是可以回收的,比如 Buffers、Cached 及 Slab 这些内存,这部分可以回收的内存加上 MemFree 才是 MemAvailable 的内存值,这是内核通过特定算法算出来的,是一个估算值。
- Buffers:缓冲区内存
- Cached:缓存
上面信息没有 MemUsed 的值,虽然可以用现有的值大致估算出来,但是我们想一步到位,就用下面的 free 命令。
1.2 free
这个命令估计用的人就多了(我一般都是用这个命令)。
这里存在一个计算公式:
MemTotal = used + free + buff/cache(单位 K)
几个字段和上面 /proc/meminfo
的字段是对应的。还有个 shared
字段,这个是多进程的共享内存空间,不常用。
我们注意到 free 很小,buff/cache 却很大,这是 Linux 的内存设计决定的,Linux 的想法是内存闲着反正也是闲着,不如拿出来做系统缓存和缓冲区,提高数据读写的速率。但是当系统内存不足时,buff/cache 会让出部分来,非常灵活的操作。
要看比较直观的值,可以加 -h 参数:
1.3 dmidecode
同样可以使用这个命令,对于内存,可以使用 dmidecode -t memory
查看:
1.4 vmstat
这个命令也是非常常用了。但对于内存,显示信息有限。它更多是用于进行系统全局分析和 CPU 分析。详细可以看 CPU 分析一文。
02 进程内存使用情况分析
最常用的两个命令 ps 和 top,虽然很简单的两个命令,但还是有不少学问的。
2.1 top/htop
top 命令运行时默认是按照 CPU 利用率进行排序的,如果要按照内存排序,该怎么操作呢?两种方法,一种直接按 “M”(相应的按 “P” 是 CPU),另外一种是在键入 top 之后,按下 “F”,然后选择要排序的字段,再按下 “s” 确认即可。
可以看到,我按照 “%MEM” 排序的结果。这个结果对于查看系统占用内存较多的哪些进程是比较有用的。
然后这里我们会重点关注几个地方,上面横排区,和前面几个命令一样可以查看系统内存信息,中间标注的横条部分,和内存相关的有三个字段:VIRT、RES、SHR。
- VIRT:virtual memory usage,进程占用的虚拟内存大小。
- RES:resident memory usage,进程常驻内存大小,也就是实际内存占用情况,一般我们看进程占用了多少内存,就是看的这个值。
- SHR:shared memory,共享内存大小,不常用。
2.2 ps
ps 同样可以查看进程占用内存情况,一般常用来查看 Top n 进程占用内存情况,如:
ps aux --sort=rss | head -n
,表示按 rss 排序,取 Top n。
这里也关注三个字段:
- %MEM:进程使用物理内存所占百分比。
- VSZ:进程使用虚拟内存大小。
- RSS:进程使用物理内存大小,我们会重点关注这个值。
2.3 pmap
这个命令用于查看进程的内存映像信息,能够查看进程在哪些地方用了多少内存。 常用 pmap -x pid
来查看。
可以看到该进程内存被哪些库、哪些文件所占用,据此我们定位程序对内存的使用。
几个字段介绍一下:
- Address:占用内存的文件的内存起始地址。
- Kbytes:占用内存的字节数。
- RSS:实际占用内存大小。
- Dirty:脏页大小。
- Mapping:占用内存的文件,[anon] 为已分配的内存,[stack] 为程序堆栈
最后的 total 为统计的总值。我们可以使用 pmap -x pid | tail -1
这样只显示最后一行,循环显示最后一行,达到监控该进程的目的。使用:
while true; do pmap -x pid | tail -1; sleep 1; done
OK,以上工具都是 Linux 自带的,当然还有很多高阶的工具,比如 atop、memstat 等等,对于内存泄漏有一个比较常用的检测工具 Valgrind,更多干货可以关注我的公众号。
通过以上手段,我们基本上就能定位内存问题所在了,究竟是内存太小,还是进程占用内存太多,有哪些进程占用较多,这些进程又究竟有哪些地方占用较多,这些问题通过以上方法都能解决。
最后简单总结下,以上不少工具可能有人会犯选择困难症了。对于我来说,查看系统内存用 free -h,分析进程内存占用用 ps 或者 top(首选 ps),深入分析选择 pmap,就酱。
参考:
Linux下查看内存使用情况的多种方法 http://stor.51cto.com/art/201804/570236.htm
我的公众号 「Linux云计算网络」(id: cloud_dev) ,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,分享的内容包括但不限于 Linux、网络、云计算虚拟化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++编程技术等内容,欢迎大家关注。
相关文章
- [Linux] linux文件系统学习
- Linux C 收藏
- Linux创建内存磁盘空间
- linux安装mysql详细步骤
- Linux基础之查看linux发行版以及内核版本
- 【学习总结】快速上手Linux玩转典型应用-第2章-linux简介
- linux命令:java程序后台运行
- Linux free指令查看内存使用情况
- Linux 0.11 - 操作系统用一张大表管理内存-13
- Linux Kernel(Android) 加密算法总结(一)(cipher、compress、digest)
- Linux系统编程——IO编程
- 【Linux 内核 内存管理】物理内存组织结构 ⑥ ( 物理页 page 简介 | 物理页 page 与 MMU 内存管理单元 | 内存节点 pglist_data 与 物理页 page 联系 )
- 【Linux 内核 内存管理】物理内存组织结构 ① ( 多处理器体系结构 | SMP/UMA 对称多处理器结构 | NUMA 非一致内存访问结构 )
- 【Linux 内核 内存管理】内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )
- 【Linux 内核 内存管理】内存管理架构 ⑤ ( sbrk 内存分配系统调用代码示例 | 在 /proc/pid/maps 中查看进程堆内存详情 )
- 【Linux 内核 内存管理】内存管理架构 ① ( 内存管理架构组成 | 用户空间 | 内核空间 | MMU 硬件 | Linux 内核架构层次 | Linux 系统调用接口 )
- 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )
- Linux Shell查看磁盘分区,内存使用,CPU使用率
- Linux中查看CPU内存硬盘信息的命令
- 002-linux命令-文件和目录、查看文件内容-【cp、${}、basename、dirname、ls】
- L86.linux命令每日一练 -- 第12章 Linux系统常用内置命令(二)
- L65.linux命令每日一练 -- 第十章 Linux网络管理命令 -- ifdown和route
- L51.linux命令每日一练 -- 第八章 Linux磁盘与文件系统管理命令 -- mkfs和dumpe2fs
- L8.linux命令每日一练 -- 第二章 文件和目录操作命令 -- rm和rmdir命令
- Linux系统之部署Ajenti服务器管理面板
- 实战|掌握Linux内存监视:free命令详解与使用技巧
- C/C++、Qt开发,跨平台CMake判断当前平台是Linux还是Windows,操作系统判断
- 嵌入式linux开发,Linux下访问PHY芯片寄存器,获取phyID号,获取phy的link状态
- linux命令之busybox microcom,串口调试命令
- 亲测linux 上安装php
- linux的vm.overcommit_memory的内存分配参数详解
- LEADTOOLS SDK 22.0 for Linux Crack
- Linux 物理内存、虚拟内存
- linux 内存性能评估工具 free/smem