Linux CPU占用高问题

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

  • 32
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值