1、top命令和历史系统监控找出持续占用CPU的top5进程。
# top -c
依次按键盘键b->x,按照CPU由高到底排序。shift+P和shift+M切换使用CPU和内存的排序
# top -Hp pid
查看进程中所有线程的占用情况
# top -Hp 1124 -n 1 -b | awk '{print $NF}' | sort | uniq -c | sort -nrk 1
对线程进行统计和排序
2、使用pidstat命令查询CPU占用详细信息,是内核态还是用户态
# pidstat -p pid 1
1s刷新一次
# pidstat -r -p pid 1
进程占用的内存信息
3、使用lsof命令检查进程打开的文件
# lsof -p pid
4、通过strace抓取系统调用
# strace -o output.txt -T -tt -e trace=all -p pid
输出在output.txt文件中
5、通过gdb抓取堆栈
# gdb
pstack pid
gdb -p pid
info thread
thread 2
bt
frame 3
p mutext_1
6、如果环境没有strace和gdb, 也可以通过cat stack查看进程的内核堆栈的调试信息
# cd /proc/1483/
# cat stack
7、还可以使用操作系统提供的内核追踪工具ftrace抓取系统调用, ARM环境和X86环境命令不同。此处通过kprobe内核探针, Event Tracing事件追踪利用在内核中加入各种Tracepoint(追踪点)实现对系统的追踪。
# cd /sys/kernel/debug/tracing/
a. 增加探针
ARM环境
# echo 'p:myprobe do_sys_open dfd=%x0 filename=+0(%x1):string flags=%x2 mode=%x3' > /sys/kernel/debug/tracing/kprobe_events
X86环境
# echo 'p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack)' > /sys/kernel/debug/tracing/kprobe_events
具体内核函数的定义,可以在百度搜索,都是开源代码
b. 使能event
# echo 1 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable
c. 指定调试进程
# echo pid > /sys/kernel/debug/tracing/set_event_pid
d. 使能系统内核trace
# echo 1 > /sys/kernel/debug/tracing/tracing_on
e. 抓取信息保持几分钟,内容重镜像到文件中
# cat /sys/kernel/debug/tracing/trace_pipe >> /tmp/testtrace.log
关闭trace_event
# echo 0 > /sys/kernel/debug/tracing/events/kprobes/myprobe/enable
# echo '-:myprobe' >> /sys/kernel/debug/tracing/kprobe_events
# echo 0 > /sys/kernel/debug/tracing/tracing_on