Linux 问题故障定位,看这一篇就够了( 二 )

  • 页缓存page cache
  • 缓冲区高速缓存buffer cache
  • 目录缓存
  • inode
  • inode缓存
  • noop调用策略
  • 6.2 分析工具
    Linux 问题故障定位,看这一篇就够了

    文章插图
     
     
    6.3 使用方式
    //查看系统io信息iotop//统计io详细信息IOStat -d -x -k 1 10//查看进程级io的信息pidstat -d 1 -p pid//查看系统IO的请求 , 比如可以在发现系统IO异常时 , 可以使用该命令进行调查 , 就能指定到底是什么原因导致的IO异常perf record -e block:block_rq_issue -ag^Cperf report7. 网络
    7.1 说明
    网络的监测是所有 Linux 子系统里面最复杂的 , 有太多的因素在里面 , 比如:延迟、阻塞、冲突、丢包等 , 更糟的是与 Linux 主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题 , 增加了监测和判断的复杂度 。现在我们使用的所有网卡都称为自适应网卡 , 意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整 。
    7.2 分析工具
     
    Linux 问题故障定位,看这一篇就够了

    文章插图
     
     
    7.3 使用方式
    //显示网络统计信息netstat -s//显示当前UDP连接状况netstat -nu//显示UDP端口号的使用情况netstat -apu//统计机器中网络连接各个状态个数netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'//显示TCP连接ss -t -a//显示sockets摘要信息ss -s//显示所有udp socketsss -u -a//tcp,etcp状态sar -n TCP,ETCP 1//查看网络IOsar -n DEV 1//抓包以包为单位进行输出tcpdump -i eth1 host 192.168.1.1 and port 80 //抓包以流为单位显示数据内容tcpflow -cp host 192.168.1.18. 系统负载
    8.1 说明
    Load 就是对计算机干活多少的度量(WikiPedia:the system Load is a measure of the amount of work that a compute system is doing)简单的说是进程队列的长度 。Load Average 就是一段时间(1分钟、5分钟、15分钟)内平均Load 。
    8.2 分析工具
    Linux 问题故障定位,看这一篇就够了

    文章插图
     
     
    8.3 使用方式
    //查看负载情况uptimetopvmstat//统计系统调用耗时情况strace -c -p pid//跟踪指定的系统操作例如epoll_waitstrace -T -e epoll_wait -p pid//查看内核日志信息dmesg9. 火焰图
    9.1 说明
    【Linux 问题故障定位,看这一篇就够了】火焰图(Flame Graph是 Bredan Gregg 创建的一种性能分析图表 , 因为它的样子近似 ?而得名 。
    火焰图主要是用来展示 CPU的调用栈 。
    y 轴表示调用栈 , 每一层都是一个函数 。调用栈越深 , 火焰就越高 , 顶部就是正在执行的函数 , 下方都是它的父函数 。
    x 轴表示抽样数 , 如果一个函数在 x 轴占据的宽度越宽 , 就表示它被抽到的次数多 , 即执行的时间长 。注意 , x 轴不代表时间 , 而是所有的调用栈合并后 , 按字母顺序排列的 。
    火焰图就是看顶层的哪个函数占据的宽度最大 。只要有”平顶”(plateaus) , 就表示该函数可能存在性能问题 。颜色没有特殊含义 , 因为火焰图表示的是 CPU 的繁忙程度 , 所以一般选择暖色调 。
    常见的火焰图类型有On-CPU、Off-CPU、Memory、Hot/Cold、Differential等等 。
    9.2 安装依赖库
    //安装systemtap , 默认系统已安装yum install systemtap systemtap-runtime//内核调试库必须跟内核版本对应 , 例如:uname -r 2.6.18-308.el5kernel-debuginfo-2.6.18-308.el5.x86_64.rpmkernel-devel-2.6.18-308.el5.x86_64.rpmkernel-debuginfo-common-2.6.18-308.el5.x86_64.rpm//安装内核调试库debuginfo-install --enablerepo=debuginfo search kerneldebuginfo-install --enablerepo=debuginfo search glibc9.3 安装
    git clone https://github.com/lidaohang/quick_location.gitcd quick_location9.4 CPU级别火焰图
    cpu占用过高 , 或者使用率提不上来 , 你能快速定位到代码的哪块有问题吗?
    一般的做法可能就是通过日志等方式去确定问题 。现在我们有了火焰图 , 能够非常清晰的发现哪个函数占用cpu过高 , 或者过低导致的问题 。
    9.4.1 on-CPU
    cpu占用过高 , 执行中的时间通常又分为用户态时间user和系统态时间sys 。
    使用方式:
    //on-CPU usersh ngx_on_cpu_u.sh pid//进入结果目录cd ngx_on_cpu_u//on-CPU kernelsh ngx_on_cpu_k.sh pid//进入结果目录cd ngx_on_cpu_k//开一个临时端口8088Python -m SimpleHTTPServer 8088//打开浏览器输入地址127.0.0.1:8088/pid.svg


    推荐阅读