Top命令
像windows一样,linux也有一个“进程管理”,可以在命令行执行 top ,就可以整体的查看当前机器的资源及进程情况。
在性能问题中,Top是使用较多的一个命令,一般用它可以从整体上了解系统的CPU、内存、IO情况,快速从全局上来找到问题爆发点。
输出内容解释
Top是实时性的监控命令,会实时显示当前操作系统的整体性能情况,输出内容包扩两部分:全局资源信息和进程信息。
全局信息
这里的信息包括:
top (整体状态)
- 系统时间:19:27:01
- 运行时间:up 54 min,
- 当前登录用户: 1 user
- 负载均衡(uptime) load average: 0.02, 0.03, 0.08
average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了
注:可以通过
cat /proc/cpuinfo 查看服务器CPU详细信息
Tasks (进程情况)
- total:进程总数
- runing:在运行状态进程数
- sleeping:睡眠进程数量
- stopped:死亡进程数量
%CPU (CPU情况)
- 0.0 us【user space】— 用户空间占用CPU的百分比。
- 0.1 sy【sysctl】— 内核空间占用CPU的百分比。
- 0.0 ni 改变过优先级的进程占用CPU的百分比
- 99.9 id【idolt】— 空闲CPU百分比
- 0.0 wa【wait】— IO等待占用CPU的百分比
- 0.0 hi【Hardware IRQ】— 硬中断占用CPU的百分比
- 0.0 si【Software Interrupts】— 软中断占用CPU的百分比
KiB Mem (内存情况)
- total 内存总大小
- free 空闲大小
- used 已用大小
- buff/cache 用于缓冲区的大小
KiB Swap (交换区)
- total 系统配置的总交换空间大小,以千字节(KiB)为单位。这包括了所有交换分区和交换文件的总和。
- used 已经被系统使用的交换空间大小,以千字节(KiB)为单位。这表示当前有多少数据被交换到了硬盘上。
- free 尚未被使用的交换空间大小,以千字节(KiB)为单位。这表示还剩下多少交换空间可以被系统使用
具体进程信息
通常使用 -p参数指定具体进程,锁定具体进程的信息
top -p [PID]
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S —进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
性能分析思路
性能分析的核心最终都会聚焦在CPU、内存、磁盘IO,而出现性能问题,CPU、内存、磁盘IO也是最先显现的。所以top的综合性优势就在于可以快速发现上述三个维度出现问题的点(CPU飙高、内存溢出、IO瓶颈),再带着具体维度问题根据具体的进程信息锁定进程,最终定位到应用甚至代码问题。
CPU使用分析
关于CPU的使用,可以直接通过top输出中的%CPU进行。针对CPU的参数项,常见以下几种情况:
-
高 us: 如果 us 持续很高,可能意味着用户空间的进程非常繁忙,这可能导致系统响应变慢。
-
高 sy: 如果 sy 持续很高,可能意味着系统空间的进程(如内核线程)非常繁忙,这可能表明系统正在处理大量的系统调用或内核任务。
内存使用分析
为了更好的进行内存分析之前,需要先搞清除swap和buffer/cache的原理
buffer/Cache缓冲区
缓冲区(Buffer):
缓冲区主要用于存储即将写入磁盘的数据。当应用程序写数据到磁盘时,数据首先被写入到缓冲区,然后操作系统会在合适的时机将缓冲区的数据刷新到磁盘上。这可以减少对磁盘的直接 I/O 操作次数,从而提高性能。缓存(Cache):
缓存用于存储最近或频繁访问的数据。操作系统会将文件系统的数据、目录结构等信息缓存到内存中,这样当应用程序再次访问这些数据时,可以直接从内存中读取,而不需要重新从磁盘读取,从而加快访问速度。
buffer和cache多用在系统文件读取、网络通信、系统服务;
当应用程序读取或写入文件时,操作系统会使用缓冲区和缓存来暂存数据,减少磁盘 I/O 操作。
网络堆栈可能会使用缓冲区来暂存即将发送或接收的数据包,以提高网络通信的效率。
系统服务和守护进程可能会使用缓存来存储配置信息、状态信息等,以便快速访问。
swap
当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上。当然从用户的角度来看就相当于内存变大了。但在内部其实是将一段物理磁盘即swap分区充当Wie内存来使用。当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,所以就有换入和换出两个过程。
换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。
换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来。Swap 看似把系统的可用内存变大了,但其实本质是虚拟内存,真实的读取速度并没有上升,更多的是为了保证内存的稳定和可用空间,因为数据在swap中,仍旧需求读取磁盘,而且,过分使用Swap,当Swap使用完,操作系统会触发OOM-Killer机制,把消耗内存最多的进程kill掉以释放内存
综上,对于使用top进行内存性能排查,主要有以下几种场景说明内存存在问题:
-
高 used 低free: 如果
used
值非常高,接近total
值,而free
值非常低,表示系统内存使用接近饱和,且没有足够的空闲内存供新进程使用,可能需要更多的内存或优化内存使用。 - 当
buff/cache
占用较高时,可能意味着系统正在进行大量的数据读写操作,在没有其他异常时,可以考虑转向IO读取瓶颈。 - 当
buff/cache
占用过低,可能意味着系统没有充分利用内存来提高性能。 - 当 swap的free和total接近,则需要考虑是否系统的内存出现了问题
Linux 内核会动态管理 buff/cache
大小。当系统内存不足时,内核可以回收部分缓存用于其他目的。如果系统内存不足,内核可能会通过回收缓存来释放内存,这可能会导致性能下降,因为更多的数据需要从磁盘读取。
IO分析
在top的结果中,关于IO问题,需要在意的参数主要在%CPU,主要是IO与CPU的资源竞争。
高 wa: 如果 wa 持续很高,可能意味着系统正在等待 I/O 操作,这可能是磁盘 I/O 瓶颈的迹象。
详细的io分析可参考:iostat分析磁盘性能
根据进程定位具体代码
可参考:Linux上定位Java错误代码