• cpu高占用率排查工具


    概览

    1.使用top -H -p pid,去查看一个线程的cpu使用
    2.使用pstack 打印运行堆栈,从堆栈观察高出现函数

    正文

    1.火焰图

    使用perf采集数据,-F 99 每秒99次; -p 999 追踪进程999; -g 记录调用栈; --proc-map-timeout 1000, cpu太高的时候,进入该进程要时间,设置跟入该进程的超市时间; sleep 30, 持续30秒

    perf record -F 99 -p 999 -g --proc-map-timeout 1000 -- sleep 30
    perf script > out.perf
    

    下载火焰图制造工具FlameGraph, 设置环境变量

    git clone https://github.com/brendangregg/FlameGraph.git
    export PATH=$PATH:$WORK_PATH/FlameGraph-master
    

    生成火焰图

    stackcollapse-perf.pl out.perf >out.folded
    flamegraph.pl out.folded > cpu.svg
    

    一键化脚本,将以下脚本保存成genFrmae.sh, 然后使用 genFrame.sh pid就可以生成火焰图 cpu.svg

    #!/bin/bash
    
    perf record -F 99 -p $1 -g --proc-map-timeout 1000 -- sleep 30
    
    perf script > out.perf
    stackcollapse-perf.pl out.perf >out.folded
    flamegraph.pl out.folded > cpu.svg
    

    2.pstack

    原理就是使用gdb attach 上去之后打印运行堆栈,ubuntu下安装的pstack不知道为什么有问题,可将以下脚本直接保存成pstack.sh, 使用./pstack.sh pid的方式运行查看进程当前的运行堆栈

    #!/bin/sh
    
    if test $# -ne 1; then
            echo "Usage: `basename $0 .sh` <process-id>" 1>&2
                exit 1
    fi
    
    if test ! -r /proc/$1; then
            echo "Process $1 not found." 1>&2
                exit 1
    fi
    
    # GDB doesn't allow "thread apply all bt" when the process isn't
    # threaded; need to peek at the process to determine if that or the
    # simpler "bt" should be used.
    
    backtrace="bt"
    if test -d /proc/$1/task ; then
            # Newer kernel; has a task/ directory.
                if test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2>/dev/null ; then
                        backtrace="thread apply all bt"
                            fi
                        elif test -f /proc/$1/maps ; then
                                # Older kernel; go by it loading libpthread.
                                    if /bin/grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; then
                                            backtrace="thread apply all bt"
                                                fi
    fi
    
    GDB=${GDB:-/usr/bin/gdb}
    
    if $GDB -nx --quiet --batch --readnever > /dev/null 2>&1; then
            readnever=--readnever
        else
                readnever=
    fi
    
    # Run GDB, strip out unwanted noise.
    $GDB --quiet $readnever -nx /proc/$1/exe $1 <<EOF 2>&1 | 
    set width 0
    set height 0
    set pagination no
    $backtrace
    EOF
    /bin/sed -n 
            -e 's/^((gdb) )*//' 
                -e '/^#/p' 
                    -e '/^Thread/p'
    
    
    

    3.strace

    用来跟踪系统调用的工具

    strace -f -F -o ~/straceout.txt myserver
    

    -f -F选项告诉strace同时跟踪fork和vfork出来的进程,-o选项把所有strace输出写到~/straceout.txt里 面,myserver是要启动和调试的程序。

    ref

    1.火焰图的使用
    2.strace的使用

  • 相关阅读:
    虚拟主机导入MySQL出现Unknown character set: ‘utf8mb4’
    解决导入MySQL数据库提示"Unknown character set: 'utf8mb4'"错误
    在js中怎样获得checkbox里选中的多个值?
    CSharp设计模式读书笔记(0):设计原则(学习难度:★★☆☆☆,使用频率:★★★★★)
    how to install maven and svn plugin into eclipse 3.6
    三个月不编程,能力下降80%
    maven管理的struts2spring3mybatisfreemarker框架整合
    Wiki: JavaHL for subversion & ubuntu lucid
    重装系统要装的库包 for ubuntu lucid
    Q for Eclipse is an Apache Maven plugin for the Eclipse IDE
  • 原文地址:https://www.cnblogs.com/ishen/p/12728157.html
Copyright © 2020-2023  润新知