在企业遭遇的 IT 故障中,约有 30% 与数据库相关。当这些故障涉及到应用系统、网络环境、硬件设备时,恢复时间可能达到数小时,对业务连续性造成破坏,影响用户体验甚至营收。在复杂分布式系统场景下,如何提高数据库的可观测性,帮助运维人员快速诊断问题,优化故障处理流程一直是困扰着企业的一大难题。

一次海量数据场景下的性能排查经历

没有 continuous profiling 的客户故障排查案例

  • 19:15 新节点上线
  • 19:15 - 19:32 上线的节点由于 OOM 反复重启,导致其他节点上 Snapshot 文件积累,节点状态开始异常
  • 19:32 收到响应时间过长业务报警
  • 19:56 客户联系 PingCAP 技术支持,反映情况如下:
  • 集群响应延迟很高,一个 TiKV 节点加入集群后发生掉量,而后删除该节点,但其他 TiKV 节点出现 Disconnect Store 现象,同时发生大量 Leader 调度,集群响应延迟高,服务挂掉。
  • 20:00 PingCAP 技术支持上线排查
  • 20:04 - 21:08 技术支持对多种指标进行排查,从 metrics 的 iotop 发现 raftstore 线程读 io 很高,通过监控发现有大量的 rocksdb snapshot 堆积,怀疑是 region snapshot 的生成导致的,建议用户删掉之前故障 TiKV 节点上的 pending peer,并重启集群。
  • 20:10 ~ 20:30 技术支持同时对 profiling 信息排查,抓取火焰图,但因为抓取过程中出问题的函数没有运行,没有看到有用的信息。

火焰图的查看方式:(源自:[https://www.brendangregg.com/flamegraphs.html](https://www.brendangregg.com/flamegraphs.html))

y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。

x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。火焰图就是看顶层的哪个函数占据的宽度最大。只要有 “平顶”(plateaus),就表示该函数可能存在性能问题。颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

从以上查看方式可以发现,这次抓取到的火焰图并没有一个大的 “平顶”,所有函数的宽度(执行时间长)都是不会太大。在这个阶段,没能直接从火焰图发现性能瓶颈是令人失望的。这时候客户对于恢复业务已经比较着急。

  • 21:10 通过删除 pod 的方式重启了某个 TiKV 节点之后,发现 io 并没有降下来。
  • 21:08 - 21:53 客户继续尝试通过删除 pod 的方式重启 TiKV 节点。
  • 21:50 再次抓取火焰图,发现 raftstore::store::snap::calc_checksum_and_size 函数处占用的大量的 CPU,确认根因。


这次抓取到的火焰图发现一个明显的 “大平顶”,可以明显看到是 raftstore::store::snap::calc_checksum_and_size 函数。这个函数占用了大量的 CPU 执行时长,可以确定整体性能瓶颈就在这里函数相关的功能。到这一步,我们确定了根因,并且也可以根据根因确定恢复方案。

  • 22:04 采取操作:停止 TiKV pod,删除流量大的 TiKV 节点 snap 文件夹下所有 gen 文件。目前逐渐恢复中。
  • 22:25 业务放量,QPS 恢复原先水平,说明操作有效。
  • 22:30 集群完全恢复

集群恢复耗时:19:56 - 22:30,共 2 小时 34 分(154 分)。
确认根因,提出有效操作耗时:19:56 - 22:04,共 2 小时 8 分(128 分)。

在这个案例中,如果我们能够有一个在故障前、中、后期,连续性地对集群进行性能分析的能力,我们就可以直接对比故障发生时刻和故障前的火焰图,快速发现占用 CPU 执行时间较多的函数,极大节约这个故障中发现问题根因的时间。因此,同样的案例,如果有 continuous profiling 功能:

  • 19:15 新节点上线
  • 19:15 - 19:32 上线的节点由于 OOM 反复重启,导致其他节点上 snapshot 文件积累,节点状态开始异常
  • 19:32 收到响应时间过长业务报警
  • 19:56 客户联系 PingCAP 技术支持,反映情况如下:
    • 集群响应延迟很高,一个 TiKV 节点加入集群后发生掉量,而后删除该节点,但其他 TiKV 节点出现 Disconnect Store 现象,同时发生大量 Leader 调度,集群响应延迟高,服务挂掉
  • 20:00 PingCAP 技术支持上线排查
  • 20:04 - 21:40 技术支持对多种指标进行排查,从 metrics 的 iotop 发现 raftstore 线程读 io 很高,通过监控发现有大量的 rocksdb snapshot 堆积,怀疑是 region snapshot 的生成导致的
  • 20:10 ~ 20:40 技术支持同时对 continuous profiling 信息排查,查看故障发生时刻的多个火焰图,与未发生故障的正常火焰图对比,发现 raftstore::store::snap::calc_checksum_and_size 函数占用的大量的 CPU,确认根因
  • 20:55 采取操作:停止 TiKV pod,删除流量大的 TiKV 节点 snap 文件夹下所有 gen 文件。目前逐渐恢复中
  • 21:16 业务放量,QPS 恢复原先水平,说明操作有效
  • 21:21 集群完全恢复

集群恢复(预期)耗时:19:56 ~ 21:21,共 1 小时 25 分(85 分),相比下降 44.8 %。
确认根因,提出有效操作(预期)耗时:19:56~20:55,共 59 分,相比下降 53.9 %。

可以看到该功能可以极大缩短确定根因时间,尽可能帮助客户换回因性能故障造成的业务停摆损失。

“持续性能分析” 功能详解

在刚刚发布的 TiDB 5.3 版本中,PingCAP 率先在数据库领域推出 “持续性能分析”(Continuous Profiling)功能(目前为实验特性),跨越分布式系统可观测性的鸿沟,为用户带来数据库源码水平的性能洞察,彻底解答每一个数据库问题。

“持续性能分析” 是一种从系统调用层面解读资源开销的方法。引入该方法后,TiDB 提供了数据库源码水平的性能洞察,通过火焰图的形式帮助研发、运维人员定位性能问题的根因,无论过去现在皆可回溯。

持续性能分析以低于 0.5% 的性能损耗实现了对数据库内部运行状态持续打快照(类似 CT 扫描),以火焰图的形式从系统调用层面解读资源开销,让原本黑盒的数据库变成白盒。在 TiDB Dashboard 上一键开启持续性能分析后,运维人员可以方便快速地定位性能问题的根因。

火焰图示例

主要应用场景

  • 当数据库意外宕机时,可降低至少 50% 诊断时间

在互联网行业的一个案例中,当客户集群出现报警业务受影响时,因缺少数据库连续性能分析结果,运维人员难以发现故障根因,耗费 3 小时才定位问题恢复集群。如果使用 TiDB 的持续性能分析功能,运维人员可比对日常和故障时刻的分析结果,仅需 20 分钟就可恢复业务,极大减少损失。

  • 在日常运行中,可提供集群巡检和性能分析服务,保障集群持续稳定运行

持续性能分析是 TiDB 集群巡检服务的关键,为商业客户了提供集群巡检和巡检结果数据上报。客户可以自行发现和定位潜在风险,执行优化建议,保证每个集群持续稳定运行。

  • 在数据库选型时,提供更高效的业务匹配

在进行数据库选型时,企业往往需要在短时间内完成功能验证、性能验证的流程。持续性能分析功能能够协助企业更直观地发现性能瓶颈,快速进行多轮优化,确保数据库与企业的业务特征适配,提高数据库的选型效率。

深入了解和体验 “持续性能分析”:https://docs.pingcap.com/zh/tidb/stable/continuous-profiling

TiDB 故障诊断与性能排查:发生即看见,一切可回溯,Continuous Profiling 应用实践相关推荐

  1. 【读书笔记】实战JAVA虚拟机JVM故障诊断与性能优化 读书笔记

    文章目录 1.概述 1.1 **第一章:初探java虚拟机** 1.2 认识java虚拟机的基本结构 1.3 常用Java虚拟机参数 1.4 垃圾回收器 1.5 垃圾收集器以及内存分配 1.6 性能监 ...

  2. 实战java虚拟机 百度云_《实战JAVA虚拟机 JVM故障诊断与性能优化》pdf百度云下载...

    内容简介· · · · · · 随着越来越多的第三方语言(Groovy.Scala.JRuby等)在Java虚拟机上运行,Java也俨然成为了一个充满活力的生态圈.<实战Java虚拟机--JVM ...

  3. java性能实战_【从零单排】Java性能排查实战模拟

    当线上发生了性能问题时,需要我们快速定位问题.本文模拟了一次内存泄漏,从零教学一步步手动排查. 模拟事故现场 使用如下代码模拟内存泄漏.起了几个问题线程(在不停地创建很大的StringBuilder) ...

  4. androbench跑分性能排查

    androbench跑分对应IO特性分析 在博文:手机IO workload解析里面已经指出androbench测试时,产生的IO都是direct IO. 因为对手机反复androbench测试多次, ...

  5. Linux性能排查——系统中出现大量不可中断进程和僵尸进程排查

    1.进程状态 top 和 ps 是最常用的查看进程状态的工具,我们就从 top 的输出开始.下面是一个 top 命令输出的示例,S 列(也就是 Status 列)表示进程的状态.从这个示例里,你可以看 ...

  6. 一次网站性能排查的经历

    第一次接手JAVA项目,在上线后就遇到了网站性能问题.说实话,对于JAVA我不是很了解,同时有点感冒. 客户内网网站的是用JAVA+TOMCAT6+ORACLE9I开发的.上线后,客户单位有二百多人, ...

  7. linux+性能排查,Linux系统性能排查基础

    此文已由作者李晶授权网易云社区发布. 欢迎访问 上一期运维季刊中,我们重点从CPU方面分析了Linux系统性能瓶颈,除了CPU之外,内存.IO和网络也是常见的造成系统出现问题的根源,本篇我们继续介绍如 ...

  8. 天下武功唯快不破:TiDB 在线 DDL 性能提升 10 倍

    作者: TiDB社区小助手 原文来源: https://tidb.net/blog/4f85e64a 导读 随着业务规模和单表容量的增大,DDL 变更耗时越来越长,给 DBA.研发.业务同学带来了越来 ...

  9. [案例] java项目故障诊断和性能调优(window版)

    做这次性能调优主要是项目每当在使用高峰期就会出现卡顿,加载速度慢,严重影响工作效率,因此开始排查故障和调优 一,问题定位 在故障出现时优先打开任务管理器和资源监视器主要查看CPU和内存的使用情况(后面 ...

最新文章

  1. QT中使用QSettings保存应用程序配置信息
  2. vc 运行c语言步骤,第1章_C语言概述(vc++环境如何运行c语言程序)[精选].ppt
  3. 用原生JS读写CSS样式的方法总结
  4. JavaWeb-RESTful_用SpringMVC开发RESTful
  5. mysql @符号_MySQL 数值类型
  6. 【转载】]基于RedHatEnterpriseLinux V7(RHEL7)下SPEC CPU 2006环境搭建以及测试流程 介绍、安装准备、安装、config文件以及运行脚本介绍...
  7. mysql pdo 安全_使用PDO查询Mysql来避免SQL注入风险
  8. Sentinel-1 影像与精轨数据下载(经常更新中)
  9. piap.excel 微软 时间戳转换mssql sql server文件时间戳转换unix 导入mysql
  10. creo外观库_Proe/Creo外观着色与贴图
  11. 一、玩转小米路由器mini之刷openwrt固件
  12. java int64 类型_详解 Java 的八大基本类型,写得非常好!
  13. 《2022爱分析·银行数字化厂商全景报告》发布,菊风连续入选「视频银行」优质代表厂商
  14. 最新BBS上的变态网名大全
  15. 使用结构体输入参加某会议成员的信息,并计算男女比例C++
  16. 用FFmpeg保存JPEG图片
  17. glib使用之哈希表
  18. PDF技术(一)-Java实现Office系列文件转PDF文件
  19. 32岁,我从公司离职了,是裸辞......
  20. 计算机哪个按键可以和弦,钢琴键盘和弦图解大全!作曲必看!老师和家长快收藏起来...

热门文章

  1. Debian搭建SVN服务器
  2. JScript 06 根据成绩平均分划分等级
  3. 郦旭东小可爱的大数据算法课程期末复习
  4. 一款网易云音乐歌词制作软件
  5. 1w字详解 ClickHouse漏斗模型实践方案(收藏)
  6. java时间戳转换_Java编程实现时间和时间戳相互转换实例
  7. LeetCode不浪费原料的汉堡制作方案
  8. CAS配置数据库,实现数据库用户认证
  9. 网页微信公众平台登录电脑版
  10. python中国社区-Python中文社区名称的统一