linux的top命令

先看几个例子

第一台机器

关键指标拆解

  1. 负载 load average:1.23
    负载很低,系统整体压力小。
  2. Tasks:1 running,135 sleeping
    同样现象:同一时刻只有1个线程在运行,其余全部休眠阻塞。
  3. CPU指标
  • us 1.8:业务用户CPU很低;
  • ni 14.8:nice(低优先级进程)占用,这个是比较显眼的点;
  • id 78.1:CPU大量空闲;
  • wa 2.0:有轻微IO等待(2%,不算严重);
  • st 0.1:几乎没有被宿主机偷时间。
  1. ⚠️内存状态需要留意
  • 总内存约 16G;
  • 物理空闲 free=371.9MiB,剩余物理内存很少;
  • avail Mem 2973.8 MiB:系统可用内存约2.9G(包含cache回收);
  • Swap已经使用2215MB,说明有部分内存被置换到交换分区。>

free很小不代表OOM,要看avail Mem,但swap上升代表内存压力开始显现,需要关注,持续上涨就会性能抖动。


这台机器需要关注两点

  1. 内存压力:free已经很低,swap在使用,观察是否持续走高。

    #观察swap变化
    vmstat 1

  2. 同样执行jstack <java-pid>导出线程快照,查看大量线程阻塞在哪里。

  3. 可以用iotop确认那2% wa是哪个进程产生的IO。

简单理解各个字段记忆

  • free:完全空闲物理内存;
  • avail Mem:真正给新程序可用的内存(内核可以回收buff/cache),这个值才是判断内存是否危险的核心;
  • swap used持续上涨:说明应用实际内存需求大于物理内存,会变慢。

这台机器CPU资源很富余,瓶颈不在CPU;但内存需要盯一下。

第二台机器

关键指标拆解

  1. 负载 load average=2.95
    机器16G内存,load接近3,不算很高。

再次看到经典现象:1 running,138 sleeping,全局只有1个线程处于运行状态,绝大多数线程休眠阻塞,和另外两台业务机器一模一样。

  1. CPU分布
  • us 32.1:业务用户态占用;
  • sy 21.2:系统内核CPU占比偏高;
  • id 31.1:CPU还有31%空闲,CPU资源没有打满;
  • wa 4.7:存在一定磁盘IO等待;
  • si 10.4 很高 :si 软中断,网络小包多(大量TCP收发、短连接、MQ、数据库网络交互,会拉高si)。
  1. 内存(这台状态健康)
  • 物理内存16G;
  • avail Mem 9107.8 MiB ≈9G可用内存,非常充足;
  • Swap只用182MB,几乎没用到swap,没有内存压力。

两台机器横向对比汇总

机器 load running线程 内存情况 特征
10.101.2.145 1.23 1 紧张,swap上涨 CPU空闲,内存压力,少量wa
10.101.2.36 2.95 1 充足 内核sy高、软中断si高,有iowait

两台机器共同的核心特征:running线程数量极少,大量线程sleep 。

说明业务应用内部大量线程阻塞等待(数据库连接、锁、消息队列、外部调用),就绪可交给CPU执行的线程很少,导致多核CPU不能充分跑满。

针对这台机器的关注点

  1. si=10.4软中断偏高:说明网络流量压力不小,检查:MQ、数据库交互、接口请求量。
  2. wa=4.7:有磁盘IO等待,执行 iotop -oP 看是谁在做磁盘读写。
  3. 依旧需要导出jstack快照,定位大量sleep线程到底阻塞在哪一行代码。
  4. sy内核态CPU 21.2%偏高,结合高si,大概率大量socket系统调用。

排查命令

复制代码
#看磁盘IO进程
iotop -oP

#看网络连接统计
ss -s

#导出java线程栈
jstack <pid> > jstack‑36.log

不是操作系统、docker限制多核;是Java应用层,业务线程拿不到资源,卡在等待状态,CPU有空闲资源却没有任务可以调度上去。

总结

top可以对线程、CPU、IO、内存、交换内存进行监控。特别容易忽略的是wa,这个指标都不会太重视,如果对于大数据的处理,是需要掌握磁盘IO的效率的。

小技巧:在top界面上按1,可以列出每个cpu的使用效率。

相关推荐
vx_Biye_Design1 分钟前
flask学生课程笔记共享系统29026-计算机课程设计、毕业设计
java·javascript·spring boot·后端·elasticsearch·flask·课程设计
代码山河3 分钟前
JDK、JRE、JVM的区别:一文讲清楚Java运行环境
java·学习·架构·教程·面向对象·项目
深入云栈16 分钟前
Netty 4.2.x 源码深度解析 (十七):Channel 底层读写 —— Unsafe 的 I/O 操作内核
java·后端·架构
SimonKing29 分钟前
Qoder中Qwen3.8-Flash 限时免费使用
java·后端·程序员
susplus29 分钟前
【IMX6ULL Linux系统移植】SD卡分区 | uboot详解
linux·arm·u-boot
云和数据.ChenGuang31 分钟前
langchain4j InMemoryEmbeddingStore常用的方法
java·人工智能·windows·java-ee·fastapi·springai
雪雪爱冲浪33 分钟前
ISP代理与住宅代理选型对比:从原理到实战
服务器·网络·网络协议·tcp/ip·接口隔离原则
@三十一Y36 分钟前
Linux:实现简易的shell
linux
智能直播40 分钟前
OpenGL驱动的实时绿幕抠图:GPU着色器色度键控原理
运维·服务器
小番茄程序猿42 分钟前
RAG 的 precision 只有 0.55,我以为检索烂了,MRR 一测才发现是我用错了尺子
java·后端