性能文章>这些排查内存问题的命令,你用过多少?>

这些排查内存问题的命令,你用过多少?原创

1年前
569116

我相信大家都遇到过内存占用率过高的情况,在排查过程中,我们会用到一些命令或工具,下面来看下这些你都用过吗?

top 命令

首先比较常用的就是 top 命令,是性能监控的常用命令,该命令可以实时显示系统中各个进程的资源占用状况。
image.png
在这里简单说下每行的意义:

第一行中 load average 为最近 1 分钟、5 分钟、15 分钟的负载情况。

第二行的 Tasks 为进程的情况,如上图所示就是系统目前有 126 个进程,其中正在运行(running)的进程有 1 个,有 125 个睡眠(sleeping)进程,处于暂停(stopped)和僵尸(zombie)进程没有。

第三行为 CPU 状态信息,其中几个属性的意义如下:
image.png

第四、五行为内存信息,其参数含义如下:
image.png

还可以通过 top -Hp pid 查看具体线程使用系统资源情况:
image.png

vmstat 命令

vmstat 命令可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率、内存使用、虚拟内存交换情况、IO读写情况。
image.png

比如执行 vmstat 2 3 命令,其中第一个参数是采样的时间间隔数(单位为秒),第二个参数为采样的次数。
下面来介绍下每个参数到含义:

procs 主要是进程信息,有以下两个字段:

  • r:等待运行到进程数
  • b:处于非中断睡眠状态的进程数

memory 主要是内存信息,有以下四个字段:

  • swpd:虚拟内存使用情况
  • free:空闲的内存
  • buff:用来作为缓冲的内存数
  • cache:缓存的内存容量

swap主要是交换分区信息,有下面两个字段:

  • si:从磁盘交换到内存的交换页数量
  • so:从内存交换到磁盘的交换页数量

io 主要是磁盘读/写信息,有以下两个字段:

  • bi:发送到块设备的块数
  • bo:从块设备接收到的块数

system 为系统信息,有如下字段:

  • in:每秒中断数
  • cs:每秒上下文切换次数

cpu 为 CPU 信息,主要有如下字段:

  • us:用户 CPU 使用时间
  • sy:内核 CPU 系统使用时间
  • id:空闲时间
  • wa:等待 I/O 时间
  • st:运行虚拟机窃取的时间

pidstat 命令

pidstat 是一个进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

如果对命令不熟悉,可以使用 pidstat -help 来查看。
image.png
下面对命令中的 options 参数进行简单介绍:

  • -d:显示各个进程的 I/O 使用情况
  • -r:显示各个进程的内存使用情况
  • -u:默认的参数,显示各个进程的 cpu 使用情况
  • -w:显示每个进程的上下文切换情况
  • -p:指定进程号
  • -t:显示进程中线程的统计信息

比如使用 pidstat -p 3286779 -r 2 3 命令就可以查看进程的内存使用情况,其中 -p 后面为进程 ID,-r 表示查看内存使用情况,2 为每 2 秒采样一次,3 为采样次数。
image.png
下面对图中的参数做下介绍:

  • minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页
  • majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页
  • VSZ:虚拟地址大小,虚拟内存使用 KB
  • RSS:常驻集合大小,非交换区内存使用 KB
  • %MEM:进程使用内存的百分比
  • Command:拉起进程对应的命令

使用 pidstat -p 3286779 -d 2 3 可以查看进程 IO 情况,结果如下图所示:
image.png
这些字段的含义如下所示:
image.png
还有其他的参数大家可以自己摸索下。

除了通过上述的 Linux 命令来查看服务的内存使用情况外,还有很多常用的 JDK 命令来查看 JVM 的内存分配和使用情况,感兴趣的可以阅读下这篇文章:不可不知的 7 个 JDK 命令

总结

本文主要对排查内存问题中常用的 Linux 命令 top、vmstat、pidstat 进行了简单讲解,大家可以自己在本机进行实践。
了解这些命令后会在 CPU、内存占用过高问题的排查、程序性能调优上会有很大的帮助。

分类:标签:
请先登录,查看1条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

不起眼,但是足以让你有收获的JVM内存分析案例
分析 这个问题说白了,就是说有些int[]对象不知道是哪里来的,于是我拿他的例子跑了跑,好像还真有这么回事。点该 dump 文件详情,查看相关的 int[] 数组,点该对象的“被引用对象”,发现所
从一起GC血案谈到反射原理
前言 首先回答一下提问者的问题。这主要是由于存在大量反射而产生的临时类加载器和 ASM 临时生成的类,这些类会被保留在 Metaspace,一旦 Metaspace 即将满的时候,就会触发 Fu
关于内存溢出,咱再聊点有意思的?
概述 上篇文章讲了JVM在GC上的一个设计缺陷,揪出一个导致GC慢慢变长的JVM设计缺陷,可能有不少人还是没怎么看明白的,今天准备讲的大家应该都很容易看明白 本文其实很犹豫写不写,因为感觉没有
协助美团kafka团队定位到的一个JVM Crash问题
概述 有挺长一段时间没写技术文章了,正好这两天美团kafka团队有位小伙伴加了我微信,然后咨询了一个JVM crash的问题,大家对crash的问题都比较无奈,因为没有现场,信息量不多,碰到这类问题我
又发现一个导致JVM物理内存消耗大的Bug(已提交Patch)
概述 最近我们公司在帮一个客户查一个JVM的问题(JDK1.8.0_191-b12),发现一个系统老是被OS Kill掉,是内存泄露导致的。在查的过程中,阴差阳错地发现了JVM另外的一个Bug。这个B
在调试器里看LINUX内核态栈溢出
图灵最先发明了栈,但没有给它取名字。德国人鲍尔也“发明”了栈,取名叫酒窖。澳大利亚人汉布林也“发明”了栈,取名叫弹夹。1959年,戴克斯特拉在度假时想到了Stack这个名字,后来被广泛使用。
LONG究竟有多长,从皇帝的新衣到海康SDK
转眼之间初中毕业30年了,但我仍清楚的记得初中英语的一篇课文,题目叫《皇帝的新装》(“The king’s new clothes”)。这篇课文的前两句话是:”Long long ago, there
不起眼,但是足以让你收获的JVM内存案例
今天的这个案例我觉得应该会让你涨姿势吧,不管你对JVM有多熟悉,看到这篇文章,应该还是会有点小惊讶的,不过我觉得这个案例我分享出来,是想表达不管多么奇怪的现象请一定要追究下去,会让你慢慢变得强大起来,