0
点赞
收藏
分享

微信扫一扫

DAY 13 进程与系统监控:top/htop/ps/pstree/jstat 一眼定位瓶颈

DAY 13 进程与系统监控:top/htop/ps/pstree/jstat 一眼定位瓶颈

——最小可行清单 · 第 13 天(1 h 上手)

今日目标

  1. ps + grep 快速抓进程;pgrep 一键 PID
  2. top 变身为 htop,看懂 CPU、内存、Load 三色柱
  3. pstree 看父子关系,lsof 找打开文件/端口
  4. vmstat/iostat/jstat 判 CPU、IO、GC 瓶颈
  5. 写 10 行脚本:CPU>80% 自动 dump 线程栈

1. ps:静态快照第一枪

BSD 风格(带柱):

ps aux | head              # a=所有终端 u=用户 x=无终端
ps aux | grep nginx        # 抓 nginx

GNU 风格(可排序):

ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head

只拿 PID

pgrep -f nginx             # -f 匹配整行
pgrep -u $USER -f java     # 仅当前用户

2. top → htop:交互式监控

安装:

sudo apt install htop      # Debian/Ubuntu
sudo yum install htop      # RHEL/CentOS

关键区域(图在上,文在下)

  • 1 栏:CPU bars(低<40% 绿,高>80% 红)
  • 2 栏:内存/交换(used/cache/buff)
  • Load average:1/5/15 分钟队列长度,>CPU 核数即排队
    交互键
    | 键 | 功能 | |----|------| | F6 | 排序字段(CPU、MEM、TIME) | | t | 树状父子进程 | | / | 搜索进程 | | P | 按 CPU 排序 | | M | 按内存排序 |

3. pstree:一眼看家谱

pstree -p | less           # 带 PID
pstree -p $USER            # 仅当前用户

高亮线程

pstree -p 1234 | grep java # 某进程的线程树

4. lsof:文件、端口、PID 三合一

谁占用了 80 端口

sudo lsof -i :80

某进程打开哪些文件

lsof -p $(pgrep mysql)

被删除但仍占用空间的文件

sudo lsof | grep '(deleted)'

5. vmstat:系统级瓶颈 1 秒刷新

vmstat 1                   # 每秒 1 行

重点列:

  • r 运行队列线程数,>CPU 核即饱和
  • wa IO 等待 CPU 占比,>15% 磁盘瓶颈
  • si/so 交换进出,非 0 表示内存不足

6. iostat:磁盘 IO 细分

安装:

sudo apt install sysstat

查看:

iostat -x 1                # -x 扩展,1 秒刷新

关键指标:

  • %util 设备利用率,>80% 瓶颈
  • await 平均等待毫秒,>20ms 慢盘
  • svctm 服务时间(接近 await 则排队)

7. jstat:JVM 性能雷达

GC 情况 1 秒刷新

jstat -gc $(pgrep java) 1s

重点列:

  • EU/OU Eden/Old 使用量
  • YGC/FGC Young/Full GC 次数
  • YGCT/FGCT 耗时,>5% 总时间需调优

8. 综合实战:CPU>80% 自动 dump 线程

脚本 cpu_dump.sh

#!/bin/bash
# 每 30 秒检查,连续 3 次超 80% 则 jstack
THRESH=80
CNT=0
while true; do
    CPU=$(top -bn1 | grep java | head -1 | awk '{print $9}' | cut -d'.' -f1)
    [[ -z $CPU ]] && { sleep 30; continue; }
    if [[ $CPU -gt $THRESH ]]; then
        ((CNT++))
        if [[ $CNT -ge 3 ]]; then
            PID=$(pgrep java)
            jstack $PID > /tmp/jstack_$(date +%F_%T).log
            echo "High CPU $CPU%, dumped stack" >&2
            CNT=0
        fi
    else
        CNT=0
    fi
    sleep 30
done

后台运行:

chmod +x cpu_dump.sh
nohup ./cpu_dump.sh &

9. 一行监控组合拳

# 内存 Top 10
ps aux --sort=-%mem | head -n 10
# CPU Top 10
ps aux --sort=-%cpu | head -n 10
# 网络实时流量
sudo nethogs                  # 需安装 nethogs

10. 常见坑速查

现象

原因

修复

`ps aux

grep java` 把自己 grep 出来

关键字匹配

top 中 CPU >100%

多核累加,按 1 看各核

正常

jstat 报 “not found”

未装 JDK

sudo apt install openjdk-11-jdk-headless

11. 今日打卡(1 分钟)

  • [ ] 用 ps auxpgrep 找到任意进程 PID
  • [ ] 打开 htop 并看懂 CPU、内存、Load 三色柱
  • [ ] 用 lsof -i :端口号 查出监听程序
  • [ ] 运行 vmstat 1iostat -x 1 识别一次 CPU/IO 瓶颈

全部打勾 → 进程监控通关!
DAY 14 预告:网络故障四件套 ping/ss/traceroute/tcpdump,从“不通”到“抓包”一条龙!

举报

相关推荐

0 条评论