1。后台有时会遇到一些疑难杂症,监控插件无法第一时间找到问题的根源。这时候就需要登录服务器进一步分析问题的根源。那么分析问题需要一定的技术经验积累,有些问题涉及的领域非常广泛,才能定位问题。所以,分析问题,踩坑,是一个人成长和自我提升的一大锻炼。如果我们有一套好的分析工具,就会事半功倍。它可以帮助你快速定位问题,为你节省大量时间去做更深入的事情。说明本文主要介绍各种问题定位工具,并结合案例分析问题。作者:Lucien_168链接:https://www.jianshu.com/p/0bb...二、分析问题的方法论应用5W2H方法,可以提出性能分析的几个问题What-whatisthephenomenonlikeWhen-whenWhy-whyithappenWhere-哪里出问题了Howmuch-howmuchresourceswereconsumedHowtodo-howtosolvetheproblem3.cpu3.1Description对于应用程序,我们通常关注内核CPU调度器的功能和性能。线程状态分析主要是分析线程时间花在了哪里,线程状态的分类一般分为:a.on-CPU:execution,执行时间通常分为用户态时间user和系统态时间sys。b.off-CPU:等待下一轮CPU,或等待I/O、锁、分页等,其状态可细分为可执行、匿名分页、睡眠、锁、空闲等状态。如果在CPU上花费了大量时间,对CPU进行性能分析可以快速说明原因;如果系统长时间处于off-cpu状态,定位问题会花费很多时间。不过,还是有一些概念需要明确:处理器核心硬件线程CPU内存缓存时钟频率CPI和每周期指令数IPCCCPU指令使用率用户时间/内核时间调度器运行队列抢占多进程多线程字长3.2分析工具注:uptime、vmstat、mpstat、top、pidstat只能查询cpu和load的使用情况。perf可以跟踪进程内部具体函数的耗时情况,可以指定内核函数进行统计,指的是命中到哪里。3.3如何使用//查看系统cpu使用率top//查看所有cpu核心信息mpstat-PALL1//查看cpu使用率和平均负载vmstat1//进程cpu统计pidstat-u1-ppid//跟踪内部进程perftop-ppid-ecpu-clock4,memory4.1的function-levelcpuusage可见内存是为提高效率而生的。在实际分析问题的时候,内存问题可能不仅会影响性能,还会影响服务或者引发其他问题。还有内存的一些概念需要弄清楚:主存虚拟内存驻留内存地址空间OOMpagecachepagefaultpagechangeswapspaceswapuserallocatorlibc,glibc,libmallocandmtmallocLINUXkernel-levelSLUBallocator4.2分析工具说明:free、vmstat、top、pidstat、pmap只能统计内存信息和进程内存使用情况。Valgrind可以分析内存泄漏。dtrace动态跟踪。需要对核函数有深入的理解,通过用D语言编写脚本完成trace。4.3如何使用//查看系统内存使用情况free-m//虚拟内存统计vmstat1//查看系统内存top//1s获取周期,获取内存统计pidstat-ppid-r1//查看进程内存映像信息pmap-dpid//检测程序内存问题valgrind--tool=memcheck--leak-check=full--log-file=./log.txt./programname5、diskIO5.1descriptiondisk通常是最慢的磁盘是计算机的子系统,也是最容易出现性能瓶颈的地方,因为磁盘距离CPU最远,CPU对磁盘的访问涉及机械操作,如转轴、跟踪等。访问硬盘和访问内存的速度差异是按数量级计算的,就像1天和1分钟的差异一样。监控IO性能,需要了解基本原理,了解Linux是如何处理硬盘和内存之间IO的。在了解磁盘IO之前,我们还需要了解一些概念,比如:文件系统VFS文件系统缓存页缓存页缓存缓冲区缓存缓冲区缓存目录缓存inodeinode缓存noop调用策略5.2分析工具5.3用法//查看系统io信息iotop//统计io详细信息iostat-d-x-k110//查看进程级别的io信息pidstat-d1-ppid//查看系统IO请求,比如发现系统IO异常时,可以使用这个命令可以用来排查,可以指定是什么原因导致IO异常perfrecord-eblock:block_rq_issue-ag^Cperfreport6,network6.1可见网络监控是linux所有子系统中最复杂的,太多了其中的因素,如:延迟、阻塞、冲突、丢包等,更糟糕的是,Linux主机连接的路由器、交换机、无线信号等都会对整个网络造成影响,很难判断是否是因为Linux网络子系统或其他设备问题增加了监控和判断的复杂性。我们现在使用的所有网卡都称为自适应网卡,意思是可以根据网络上不同网络设备造成的不同网速和工作模式进行自动调整。6.2分析工具6.3如何使用//显示网络统计netstat-s//显示当前UDP连接状态netstat-nu//显示UDP端口号使用情况netstat-apu//统计机器各状态下的网络连接数netstat-一个|awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'//显示TCP连接ss-t-a//显示套接字摘要信息ss-s//显示所有udpsocketsss-u-a//tcp,etcpstatussar-nTCP,ETCP1//查看网络IOsar-nDEV1//抓包并在包中输出tcpdump-ieth1host192.168.1.1andport80//抓包并以流量为单位显示数据内容tcpflow-cphost192.168.1.17,系统负载7.1一个计算系统正在做的)只是进程队列的长度。LoadAverage是一段时间内(1分钟、5分钟、15分钟)的平均Load。7.2分析工具7.3如何使用//查看负载状态uptimetopvmstat//统计系统调用耗时strace-c-ppid//跟踪epoll_wait等指定系统操作strace-T-eepoll_wait-ppid//查看内核日志资料dmesg8,FlameGraph8.1讲解FlameGraph(FlameGraph是BredanGregg创建的性能分析图,因长得像?而得名。火焰图主要用于显示CPU的调用堆栈。y轴代表调用栈,每一层都是一个函数。调用栈越深,火焰越高,上面是正在执行的函数,下面是它的父函数。x轴代表样本数。如果一个函数在x轴上占据的宽度越宽,说明它被绘制的次数越多,也就是执行时间越长。注意x轴不代表时间,而是所有的调用栈合并并按字母顺序排列,火焰图就是看哪个函数占据了顶层宽度??最大。只要有一个“平台期”,就意味着该函数可能存在性能问题。颜色没有特殊意义,因为火焰图表示CPU的繁忙程度,所以一般选择暖色。常见的火焰图类型包括On-CPU、Off-CPU、Memory、Hot/Cold、Differential等。8.2安装依赖库//安装systemtap,默认系统已经安装yuminstallsystemtapsystemtap-runtime//内核调试库必须对应内核版本,例如:uname-r2.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=debuginfosearchkerneldebuginfo-install--enablerepo=debuginfosearchglibc8.3installgitclonehttps://github.com/lidaohang/quick_location.gitcdquick_location8.4CPUlevelflamegraphCPU占用率过高,或者利用率提不上来,请问快速定位到哪一段代码有问题?一般的做法可能是通过日志等方式来判断问题。现在有了火焰图,我们就可以清楚地找出是哪个函数占用cpu太多了,还是太低导致的问题。8.4.1on-CPUCPU占用率过高,执行时间通常分为用户态timeuser和系统态timesys。Usage://on-CPUusersshngx_on_cpu_u.shpid//进入结果目录cdngx_on_cpu_u//on-CPUkernelshngx_on_cpu_k.shpid//进入结果目录cdngx_on_cpu_k//打开一个临时端口8088python-mSimpleHTTPServer8088//打开浏览器输入地址127.0.0.1:8088/pi??d.svgDEMO:#include
