这些排查内存问题的命令,你用过多少?
我相信大家都遇到过内存占用率过高的情况,在排查过程中,我们会用到一些命令或工具,下面来看下这些你都用过吗?
top 命令
首先比较常用的就是 top
命令,是性能监控的常用命令,该命令可以实时显示系统中各个进程的资源占用状况。
在这里简单说下每行的意义:
第一行中 load average 为最近 1 分钟、5 分钟、15 分钟的负载情况。
第二行的 Tasks 为进程的情况,如上图所示就是系统目前有 126 个进程,其中正在运行(running)的进程有 1 个,有 125 个睡眠(sleeping)进程,处于暂停(stopped)和僵尸(zombie)进程没有。
第三行为 CPU 状态信息,其中几个属性的意义如下:
参数 | 含义 |
---|---|
us | 用户空间占用CPU的百分比 |
sy | 内核空间占用CPU的百分比 |
ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
id | 空闲CPU百分比 |
wa | 等待输入输出的CPU时间百分比 |
hi | 硬中断(Hardware IRQ)占用CPU的百分比 |
si | 软中断(Software Interrupts)占用CPU的百分比 |
st | 用于有虚拟cpu的情况,用来指示被虚拟机偷掉的cpu时间 |
第四、五行为内存信息,其参数含义如下:
参数 | 含义 |
---|---|
KiB Mem:total | 物理内存总量 |
KiB Mem:free | 空闲内存总量 |
KiB Mem:used | 使用的物理内存总量 |
KiB Mem:buff/cache | 用作内核缓存的内存量 |
KiB Swap:total | 交换区总量 |
KiB Swap:free | 空闲交换区总量 |
KiB Swap:used | 使用的交换区总量 |
KiB Swap:avail Mem | 可用于进程下一次分配的物理内存数量 |
还可以通过 top -Hp pid
查看具体线程使用系统资源情况:
vmstat 命令
vmstat
命令可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率、内存使用、虚拟内存交换情况、IO读写情况。
比如执行 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
来查看。
下面对命令中的 options
参数进行简单介绍:
-d:显示各个进程的 I/O 使用情况 -r:显示各个进程的内存使用情况 -u:默认的参数,显示各个进程的 cpu 使用情况 -w:显示每个进程的上下文切换情况 -p:指定进程号 -t:显示进程中线程的统计信息
比如使用 pidstat -p 3286779 -r 2 3
命令就可以查看进程的内存使用情况,其中 -p
后面为进程 ID,-r
表示查看内存使用情况,2 为每 2 秒采样一次,3 为采样次数。
下面对图中的参数做下介绍:
minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页 majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页 VSZ:虚拟地址大小,虚拟内存使用 KB RSS:常驻集合大小,非交换区内存使用 KB %MEM:进程使用内存的百分比 Command:拉起进程对应的命令
使用 pidstat -p 3286779 -d 2 3
可以查看进程 IO 情况,结果如下图所示:
这些字段的含义如下所示:
参数 | 含义 |
---|---|
kB_rd/s | 每秒进程从磁盘读取的数据量(以kB为单位) |
kB_wr/s | 每秒进程向磁盘写的数据量(以kB为单位) |
kB_ccwr/s | 每秒进程向磁盘写入时被取消的数据量(以kB为单位) |
还有其他的参数大家可以自己摸索下。
除了通过上述的 Linux 命令来查看服务的内存使用情况外,还有很多常用的 JDK 命令来查看 JVM 的内存分配和使用情况,感兴趣的可以阅读下这篇文章:不可不知的 7 个 JDK 命令
总结
本文主要对排查内存问题中常用的 Linux 命令 top、vmstat、pidstat
进行了简单讲解,大家可以自己在本机进行实践。
了解这些命令后会在 CPU、内存占用过高问题的排查、程序性能调优上会有很大的帮助。
最好的关系就是互相成就,大家的在看、转发连就是我创作的最大动力。
完