linux 性能分析之内存分析(free,vmstat,top,ps,pmap等工具使用介绍)

引言

学生时代经常听到老师和同学说到学习 linux 的重要性。但是当时看到这个命令行界面就头疼,也就草草地应付学了一下,哎嘛,还是游戏香!

但是当前两天自己捣鼓服务器的时候,发现自己部署的一个服务总是崩溃,最终发现是服务器的内存不够了。

现在要查询问题原因又头疼了!害,只怪之前没有好好学习实践,该头疼还是会头疼,只不过是早晚的事儿。(咳咳,也奉劝后来者,若想要在从事相关领域,基础知识还是打打牢,内功心法多学一点总没错)。

今天这篇文章简单介绍一下 linux 系统中如何对内存进行分析。

常见的内存分析工具介绍

/proc/meminfo

cat /proc/meminfo

在这里插入图片描述

单词 解释
MemTotal 系统总内存,通常会比硬件内存要小一些,是由于 BIOS、内核等也会占用一定的内存。
MemFree 系统空闲内存, 物理内存剩余。
MemAvailable 应用程序可用内存,和 MemFree 的区别在于:MemFree 就是内存条剩余的空间,是系统层面的。而 MemAvailable 则是应用程序层面的,系统中有些内存虽然被使用了,但是有一部分是可以回收的,如:BuffersCached 等,当应用程序需要使用内存时,系统会主动释放这部分内存。
Buffers 缓冲区内存,用来缓存尚未“写入”磁盘的内容。
Cached 缓存从磁盘“读取”出来的东西。

buffer 被用来当成对 io 设备写的缓存。而 cache 被用来当作对 io 设备的读缓存。这里的 io 设备,主要指的是块设备文件和文件系统上的普通文件。

MemAvailable = MemFree + Buffers + Cached

请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。

free

free -h

free

单词 解释
Mem 行(第二行)内存的使用情况
Swap 行(第三行)交换空间的使用情况。可以将其想象成 windows 的虚拟内存,当内存不足时,把一部分硬盘空间虚拟成内存使用。
total 总可用物理内存。
used 已使用的物理内存和交换空间。
free 系统尚未使用的物理内存。
shared 共享内存空间。
buff/cache 列显示被 buffercache 使用的物理内存大小,这部分内存是当应用程序需要使用时系统可以主动释放的,通常将系统中经常使用的文件、块设备文件进行缓存。
available 应用程序可用内存。
MemTotal = used + free + buff/cache

vmstat

vmstat 2 3 第一个参数代表隔几秒执行一次,第二个参数是执行多少次退出。若不给第二个参数,则会持续输出内容,需要 Ctrl+C 来退出。

在这里插入图片描述

单词 解释
r Procs(进程),等待执行的任务数,即有多少进程在等待 cpu 执行任务,可用于分析 cpu,一般这个值不会大于 cpu 的个数,如果超过了,会出现 cpu 瓶颈
b 有多少进程在等待 io
swpd 正在使用虚拟内存的大小,单位 k
free 空闲内存的大小
buff 已用的 buff 大小,对块设备的读写进行缓冲
cache 已用的 cache 大小,文件系统的 cache
si 每秒从交换区写入内存的大小(单位:kb/s)
so 每秒从内存写到交换区的大小
bi io 分析,每秒读取的块数(读磁盘)
bo io 分析,每秒写入的块数(写磁盘)
in 每秒中断数,包括时钟中断(越小越好)
cs 每秒上下文切换数(越小越好),值太大需要考虑降低进程或线程数目
us 用户进程执行消耗 cpu 时间(user time),若是长期使用超过 50%,则需要考虑优化算法或者实施其他措施
sy 系统进程消耗 cpu 时间(system time),该值过高,需要检查是什么导致的内核消耗的 cpu 资源多,需要优化。通常情况 us + sy 的参考值为 80%
id 空闲时间(包括 io 等待时间),一般来说 us+sy+id=100
wa 等待 io 时间,wa 过高时,说明 io 等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

top

top 可以看到进程 PID,若发现失控的进程,可以找到对应的进程进行故障排除(kill)。

命令行交互,实时刷新展示数据,q 退出。

在这里插入图片描述

基于上面所讲述的,基本上都能看懂含义,下面的几个没见过的列一下。

单词 解释
VIRT virtual memory usage 虚拟内存占用大小
RES resident memory usage 实际内存占用
SHR shared memory 共享内存占用

ps

ps aux --sort=rssrss 正序排序。

在这里插入图片描述

top 差不多,就不详细解释了。

单词 解释
%MEM 进程占用物理内存的百分比
VSZ 使用的虚拟内存大小
RSS 进程使用物理内存大小,重点关注这个值

pmap

pmap -x pid 用于查看进程的内存映像信息,看哪些地方用了多少内存。

在这里插入图片描述
在这里插入图片描述

单词 解释
Address 占用内存的文件的内存起始地址
Kbytes 占用内存的字节数
RSS 实际占用内存大小
Dirty 脏页大小
Mapping 占用内存的文件,[anon] 为已分配的内存,[stack] 为程序堆栈

最后的 total 为统计的总值。通常当想看这个程序的内存消耗情况,可以只看最后一行,如下:

while true; do pmap -x pid | tail -1; sleep 1; done

在这里插入图片描述

总结

上述工具都是 linux 自带的,当然也有很多更高级的工具。实际工作中,挑自己用的顺手的用就行了,基本上用顺手了都能够定位问题。我一般的使用:

  • 只查看系统的内存使用情况:free -h ,很直观。
  • 分析进程内存占用: top/ps 都不错。
  • 深入分析: pmap

当然了,也可以在服务器安装运维管理面板,目前开源的项目也很多,直接通过图形化界面来查看更加方便。

所有的工具都是为了解决问题而使用的,不要为了使用工具而使用工具,本篇记录一下常用工具,也方便之后自己进行回顾,可以先大概了解工具都能做什么,真正需要用到的时候再详细去了解使用即可。

参考

猜你喜欢

转载自blog.csdn.net/DisMisPres/article/details/132418391