一篇文章搞定Linux故障定位
  

CQxxk 1474

{{ttag.title}}
本帖最后由 CQxxk 于 2019-10-18 10:20 编辑

1. 背景
有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提升自我能力。如果我们有一套好的分析工具,那将是事半功倍,能够帮助大家快速定位问题,节省大家很多时间做更深入的事情。
2.分析问题的方法论
套用5W2H方法,可以提出性能分析的几个问题
  • What-现象是什么样的
  • When-什么时候发生
  • Why-为什么会发生
  • Where-哪个地方发生的问题
  • How much-耗费了多少资源
  • How to do-怎么解决问题


3. cpu
3.1 说明
针对应用程序,我们通常关注的是内核CPU调度器功能和性能。
线程的状态分析主要是分析线程的时间用在什么地方,而线程状态的分类一般分为:
a.>b. off-CPU:等待下一轮上CPU,或者等待I/O、锁、换页等等,其状态可以细分为可执行、匿名换页、睡眠、锁、空闲等状态。
如果大量时间花在CPU上,对CPU的剖析能够迅速解释原因;如果系统时间大量处于off-cpu状态,定位问题就会费时很多。
3.2 分析工具
说明:
  • uptime,vmstat,mpstat,top,pidstat只能查询到cpu及负载的的使用情况。
  • perf可以跟着到进程内部具体函数耗时情况,并且可以指定内核函数进行统计,指哪打哪。


3.3 使用方式
  1. //查看系统cpu使用情况
  2. top

  3. //查看所有cpu核信息
  4. mpstat -P ALL 1

  5. //查看cpu使用情况以及平均负载
  6. vmstat 1

  7. //进程cpu的统计信息
  8. pidstat -u 1 -p pid

  9. //跟踪进程内部函数级cpu使用情况
  10. perf top -p pid -e cpu-clock
复制代码

4. 内存
4.1 说明内存是为提高效率而生,实际分析问题的时候,内存出现问题可能不只是影响性能,而是影响服务或者引起其他问题。
4.2 分析工具
说明:
  • free,vmstat,top,pidstat,pmap只能统计内存信息以及进程的内存使用情况。
  • valgrind可以分析内存泄漏问题。
  • dtrace动态跟踪。需要对内核函数有很深入的了解,通过D语言编写脚本完成跟踪。


4.3 使用方式
  1. //查看系统内存使用情况
  2. free -m

  3. //虚拟内存统计信息
  4. vmstat 1

  5. //查看系统内存情况
  6. top

  7. //1s采集周期,获取内存的统计信息
  8. pidstat -p pid -r 1

  9. //查看进程的内存映像信息
  10. pmap -d pid

  11. //检测程序内存问题
  12. valgrind --tool=memcheck --leak-check=full --log-file=./log.txt  ./程序名
复制代码

5. 磁盘IO
5.1 说明
磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。
5.2 分析工具
5.3 使用方式
  1. //查看系统io信息
  2. iotop

  3. //统计io详细信息
  4. iostat -d -x -k 1 10

  5. //查看进程级io的信息
  6. pidstat -d 1 -p  pid

  7. //查看系统IO的请求,比如可以在发现系统IO异常时,可以使用该命令进行调查,就能指定到底是什么原因导致的IO异常
  8. perf record -e block:block_rq_issue -ag
  9. ^C
  10. perf report
复制代码

6. 网络
6.1 说明
网络的监测是所有 Linux 子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与 Linux 主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。
6.2 分析工具
6.3 使用方式
  1. //显示网络统计信息
  2. netstat -s

  3. //显示当前UDP连接状况
  4. netstat -nu

  5. //显示UDP端口号的使用情况
  6. netstat -apu

  7. //统计机器中网络连接各个状态个数
  8. netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

  9. //显示TCP连接
  10. ss -t -a

  11. //显示sockets摘要信息
  12. ss -s

  13. //显示所有udp sockets
  14. ss -u -a

  15. //tcp,etcp状态
  16. sar -n TCP,ETCP 1

  17. //查看网络IO
  18. sar -n DEV 1

  19. //抓包以包为单位进行输出
  20. tcpdump -i eth1 host 192.168.1.1 and port 80

  21. //抓包以流为单位显示数据内容
  22. tcpflow -cp host 192.168.1.1
复制代码

7. 系统负载
7.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。
7.2 分析工具
7.3 使用方式
  1. //查看负载情况
  2. uptime

  3. top

  4. vmstat

  5. //统计系统调用耗时情况
  6. strace -c -p pid

  7. //跟踪指定的系统操作例如epoll_wait
  8. strace -T -e epoll_wait -p pid

  9. //查看内核日志信息
  10. dmesg
复制代码

打赏鼓励作者,期待更多好文!

打赏
1人已打赏

sangfor_闪电回_小六 发表于 2019-10-18 11:02
  
非常认同分析问题和踩坑是非常锻炼一个人的成长和提升自我能力这句话,感谢楼主用心的分享,楼主总结的很好!
zl113x 发表于 2019-10-23 17:19
  
非常实用的干货,感觉这个活动炸出好多厉害的大牛
新手439201 发表于 2021-1-19 20:10
  
感谢楼主分享,这个很实用。
蟲爺 发表于 2022-3-3 12:48
  
感谢分享
发表新帖
热门标签
全部标签>
每日一问
功能体验
技术笔记
新版本体验
技术咨询
2023技术争霸赛专题
干货满满
技术盲盒
标准化排查
信服课堂视频
GIF动图学习
产品连连看
安装部署配置
秒懂零信任
技术晨报
自助服务平台操作指引
深信服技术支持平台
每日一记
答题榜单公布
卧龙计划
畅聊IT
答题自测
云计算知识
通用技术
安全攻防
sangfor周刊
资源访问
排障笔记本
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
上网策略
测试报告
日志审计
问题分析处理
流量管理
运维工具
用户认证
原创分享
解决方案
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
迁移
地址转换
虚拟机
存储
加速技术
产品预警公告
玩转零信任
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
社区帮助指南
纪元平台
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
每周精选

本版版主

12
185
6

发帖

粉丝

关注

本版达人

LoveTec...

本周分享达人

新手24116...

本周提问达人