当前位置: 首页 > Linux

Linux问题故障定位,看完这篇文章就够了

时间:2023-04-06 19:18:23 Linux

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#includevoidfoo3(){}voidfoo2(){inti;for(i=0;i<10;i++)foo3();}voidfoo1(){inti;for(i=0;i<1000;i++)foo3();}intmain(void){inti;for(i=0;i<1000000000;i++){foo1();foo2();}}DEMO火焰图:8.4.2off-CPUcpu太低,利用率不高。等待下一轮CPU,或者等待I/O、锁、换页等,其状态又可以细分为可执行、匿名换页、睡眠、锁、空闲等状态。Usage://off-CPUusersshngx_off_cpu_u.shpid//进入结果目录cdngx_off_cpu_u//off-CPUkernelshngx_off_cpu_k.shpid//进入结果目录cdngx_off_cpu_k//打开一个临时端口8088python-mSimpleHTTPServer8088//打开浏览器输入地址127.0.0.1:8088/pi??d.svg官网DEMO:8.5内存级火焰图线上程序如果出现内存泄漏,只会出现在特定场景。这个时候怎么办?有没有什么好的方法和工具可以快速找到代码问题?另外,内存级别的火焰图可以帮助您快速分析问题的根源。使用方法:shngx_on_memory.shpid//进入结果目录cdngx_on_memory//打开一个临时端口8088python-mSimpleHTTPServer8088//打开浏览器输入地址127.0.0.1:8088/pi??d.svg官网DEMO:8.6性能回退-红蓝差分火焰图你能快速定位CPU性能回退的问题吗?如果您的工作环境非常复杂且瞬息万变,那么使用现有工具定位此类问题可能具有挑战性。当您花了数周时间找出根本原因时,代码又经历了几轮,新的性能问题已经浮出水面。主要可以在每次构建时使用,每次上线时对比。如果损失严重,可以立即修复。通过抓取两个普通的火焰图,比较它们,并对差异进行颜色编码:红色表示上升,蓝色表示下降。微分火焰图基于当前(“修改后”)的profile文件,形状和大小保持不变。所以,通过颜色的差异,可以直观的发现差异,就可以看出为什么会有这样的差异。Usage:cdquick_location//捕获profile1文件perfrecord-F99-ppid-g--sleep30perfscript>out.stacks1//捕获profile2文件perfrecord-Fafterthecodemodified99-ppid-g--sleep30perfscript>out.stacks2//生成微分火焰图:./FlameGraph/stackcollapse-perf.pl../out.stacks1>out.folded1./FlameGraph/stackcollapse-perf.pl../out.stacks2>out.folded2./FlameGraph/difffolded.plout.folded1out.folded2|./FlameGraph/flamegraph.pl>diff2.svgDEMO://test.c#include#includevoidfoo3(){}voidfoo2(){inti;for(i=0;i<10;i++)foo3();}voidfoo1(){inti;for(i=0;i<1000;i++)foo3();}intmain(void){inti;for(i=0;i<1000000000;i++){foo1();foo2();}}//test1.c#include#includevoidfoo3(){}voidfoo2(){inti;for(i=0;i<10;i++)foo3();}voidfoo1(){inti;for(i=0;i<1000;i++)foo3();}voidadd(){inti;for(i=0;i<10000;i++)foo3();}intmain(void){inti;for(i=0;i<1000000000;i++){foo1();foo2();添加();插件发现2017年9月25日19点在nginx集群请求流量中出现大量499和5xx状态码,发现机器CPU占用率升高,一直持续。9.2nginx相关指标分析a)_**_nginx请求流量分析:结论:根据上图发现流量没有突然增加,而是减少了,与突然增加无关在请求流量中。b)_**_nginx响应时间分析结论:通过上图发现,nginx响应时间的增加可能与nginx本身有关,也可能与后端上游响应时间有关。c)_**_nginx上游响应时间分析结论:从上图发现nginx上游响应时间有所增加。目前推测可能是后端upstream响应时间延迟了nginx,导致nginx请求流量异常。9.3分析系统cpu情况a)_**_通过top观察系统指标top结论:发现nginxworkercpu比较高b)_**_分析nginx进程内部cpu情况perftop-ppid结论:发现主要开销是free,malloc,json分析上面9.4火焰图分析cpua)_**_生成用户态cpu火焰图//on-CPUusersshngx_on_cpu_u.shpid//进入结果目录dngx_on_cpu_u//openatemporaryport8088python-mSimpleHTTPServer8088//打开浏览器输入地址127.0.0.1:8088/pi??d.svg结论:发现代码中有频繁解析json的操作,发现这个json的性能库不高,CPU占用率挺高的。9.5案例总结a)分析异常请求流量,发现nginx上游后端机器响应时间延长b)分析nginx进程高cpu,得出nginx内部模块代码有问题耗时的JSON解析和内存分配回收操作9.5.1深入分析根据以上两点的分析结论,我们进一步深入分析。后端上游响应时间变长,最多影响nginx的处理能力。但是不可能影响nginx内部模块过多的cpu运行。而当时占用cpu高的模块,都是请求时才走的逻辑。不太可能是upstram后端拖了nginx,触发了这个cpu的耗时操作。9.5.2解决方案遇到此类问题,我们优先解决已知且非常明确的问题。那就是cpu高的问题。解决方法是降级关闭占用CPU过多的模块,然后观察。降级关闭模块后,cpu下降了,nginx请求流量也正常。之所以会影响上游时间,是因为上游后端服务调用的接口可能是一个循环,又回到了nginx。10.参考文献http://www.brendangregg.com/i...http://www.brendangregg.com/F...http://www.brendangregg.com/F...http://www.brendangregg.com/F...http://www.brendangregg.com/b...https://github.com/openresty/...https://github.com/brendangre...https://www.slideshare.net/br...