ps命令
下面给你一组“更全、更强”的命令组合,用于 Kafka 进程性能分析。你可以把它们当作一套排查脚本:从线程、CPU、IO、网络、GC、JVM 堆、以及系统层面逐层分析。
我会按从轻量到重型排序,并且说明每条命令的用途与解读要点。
1. 线程级别(更全面的 ps / top)
1.1 线程列表(带线程名、CPU、内核等待、内存、运行时间)
ps -eLo pid,tid,comm,stat,wchan:25,pcpu,pmem,etime --sort=-pcpu | awk '$1==14453' | head -200
-
comm:线程名(非常重要) -
wchan:内核等待函数 -
pcpu:线程 CPU 占用 -
pmem:线程占用内存(通常不敏感,但仍有用)
1.2 top 实时线程视图(最常用)
top -H -p 14453
按 P(CPU)或 M(内存)排序。
1.3 查看线程等待函数分布(统计)
ps -eLo pid,tid,wchan --sort=wchan | awk '$1==14453' | awk '{print $3}' | sort | uniq -c | sort -nr | head -50
可以看到 Kafka 线程集中在 futex_wait_queue_me / ep_poll 还是其他。
2. CPU 级别(系统/进程/线程)
2.1 pidstat:线程级 CPU 统计(实时)
pidstat -t -p 14453 1 5
输出解释:
-
%usr:用户态 CPU -
%sys:内核态 CPU -
%guest:虚拟机 -
CPU:CPU 核心编号
2.2 perf top(实时热点分析,最强)
perf top -p 14453
如果你想看线程热点:
perf top -p 14453 -g
3. IO 级别(磁盘/网络)
3.1 iostat:磁盘 IO 监控(最关键)
iostat -x 1 5
关注:
-
%util(是否接近 100) -
await(是否高) -
avgqu-sz(队列长度)
3.2 pidstat IO(进程级 IO 统计)
pidstat -d -p 14453 1 5
3.3 iotop(实时 IO 排名)
iotop -oPa | head -20
4. 网络级别(连接/吞吐/延迟)
4.1 查看 Kafka 端口连接状态
ss -ntlp | grep 9092
ss -s
4.2 查看连接数、状态分布
ss -nt state established '( sport = :9092 )' | wc -l
ss -nt state close-wait '( sport = :9092 )' | wc -l
4.3 查看 socket 队列是否积压
ss -s | grep -E 'tcp:|connections'
5. JVM 层(GC / 堆 / 线程)
5.1 立即输出 JVM 参数(如果 attach 失败可跳过)
jcmd 14453 VM.flags
jcmd 14453 VM.command_line
如果 attach 不行,可以从 Kafka 启动脚本查看。
5.2 GC 日志(如果已开启)
如果你开启了 GC log,可以实时 tail:
tail -200 /path/to/gc.log
建议生产环境开启:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/kafka/gc.log
6. 关键命令:生成堆栈(如果 attach 失败,用 kill -3)
kill -3 14453
然后查看 Kafka 日志输出。
如果 kill -3 没有输出,说明 JVM 处于“内核阻塞”状态。
7. 最强“系统级”诊断:dmesg / vmstat / sar
7.1 系统整体负载
vmstat 1 5
7.2 系统网络/IO 报错
dmesg | tail -100
7.3 资源利用历史(如果安装 sar)
sar -u 1 5
sar -d 1 5
8. 一条命令搞定“更全”的线程信息(推荐)
如果你想一次性列出线程名、CPU、等待函数、以及时间:
ps -eLo pid,tid,comm,stat,wchan:25,pcpu,pmem,etime --sort=-pcpu | awk '$1==14453' | head -200
你现在最需要的输出
为了快速定位问题,请你执行下面三条命令,并把输出贴出来(越多越好):
ps -eLo pid,tid,comm,stat,wchan:25,pcpu,pmem,etime --sort=-pcpu | awk '$1==14453' | head -200
pidstat -t -p 14453 1 5
iostat -x 1 5
wchan 是 ps 输出中用于显示 线程当前在内核中等待的函数(wait channel) 的字段。
而你问的 wchan:25 是一种 格式控制写法,用于控制输出宽度。
1. wchan 是什么?
在 Linux 中,每个进程/线程在进入内核等待时,会记录它正在等待的内核函数名,例如:
-
futex_wait_queue_me -
ep_poll -
read -
write -
fsync
wchan 就是显示这个等待函数名的字段。
2. wchan:25 的含义
在 ps 的 -o 格式中,字段:宽度 表示 输出字段宽度。
所以:
wchan:25
表示:
-
wchan字段的输出宽度 固定为 25 个字符 -
如果函数名不足 25 个字符,左对齐并填充空格
-
如果函数名超过 25 个字符,会被截断(通常不会超过太多)
3. 为什么要用 wchan:25?
因为 wchan 字段有时很长,例如:
futex_wait_queue_me
poll_schedule_timeout
ep_poll
为了让表格对齐更整齐,常用 :25 或 :20 来控制宽度。
4. 你可以改成其他宽度
例如:
-
wchan:20(更紧凑) -
wchan:35(更宽,不容易截断)
示例:
ps -o pid,tid,stat,wchan:35,pcpu,comm -Lp 14453
5. 你如果想要“自动适配宽度”,可以省略宽度
ps -o pid,tid,stat,wchan,pcpu,comm -Lp 14453
但输出可能会变得不整齐。
如果你希望我给你一个“最实用、最整齐、可读性最强”的 ps 命令格式,我可以直接给你一个标准模板。