如何通过火焰图快速定位Cassandra性能瓶颈

本文涉及的产品
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 如何通过火焰图快速定位Cassandra性能瓶颈

运维大规模分布式系统的比较重要的一个挑战是可以有能力指出关键问题所在。在没有证据支持某种说法的情况下,当故障出现时,总是责怪组件(通常是数据库)的偶然性问题是很常见的一件事。我们已经讨论过监控工具、图形化输出、以及报警metric的重要性,并使用分布式tracing系统(比如zikin)去正确的辨别复杂系统的根源问题。

一旦你把问题缩小到一个单一的系统上面,你会怎么做?通常我们都会说这个会具体问题具体对待。有的问题是临时的,比如坏盘。有的问题却涉及到人为引入的变化,比如部署或者是错误的配置。这些都是有直接简单的解决办法:换盘或者是回滚部署。

但是如果出现的问题超出简单变化的范畴,那怎么办?到现在为止还没有提到的是规模增长造成的问题。规模可以成为另一个困难的问题,因为复现这个问题一般情况下是很微妙且复杂的。这些挑战有时是通过吞吐量(每秒请求数)、大小(兆字节)或延迟(5ms p99)来衡量的。例如,如果数据库服务器能够在内存不足的情况下为每个请求提供服务,那么它可能获得极好的吞吐量。随着数据集大小的增加,随机查找越来越可能进入磁盘,从而降低吞吐量。Time Window Compaction Strategy 是解决规模问题的一个很好的例子,除非有数字表明,否则还是很难理解的。除非遇到很大量的数据,否则你不会体会到compaction带来的痛苦,下规模情况下,很难遇到什么问题。

在失败期间,我们经常会把机器以及他们的程序执行过程当做一个黑盒子。几十亿条指令每秒都在执行,但是我们却没有办法看到内部的奥秘。很幸运的是,我们并没有完全忽略机器在做什么。多年来我们已经有了debugger以及profiler工具。 Oracle的JDK也为我们提供了Java Flight Recorder,我们可以使用它来分析本地或者生产中运行的流程。

mission_control

通过 flight recorder 进行profile是简单而直白的,但是想要翻译这个结果却需要一定的工作量。把上面的列表一一展开并查找需要的问题更消耗劳动力。 但是我们如果可以将信息可视化展出的话那么就更好了。 但是这却需要商业的license且仅能在Oracle的JDK上运行。

这就引入了我们上面列出的标题:一种可以展示可视化信息的方法,叫做火焰图。火焰图让我们可以快速的找出系统中的性能瓶颈。 由Brendan Gregg 发明。这也是一系列非常长的性能调整文章的第一部分,我们将在深入研究Cassandra的内部结构时再次提到它。

Swiss Java Knife

我们在本文中研究的方法将要用到Swiss Java Knife ,通常叫做SJK,用它来获取JVM的数据并生成火焰图。SJK是一个很不错的工具集,除了生成火焰图以外,我们可以使用它收集统计信息、监视线程以及执行各种其他诊断任务。它可以在MAC、Linux以及oracle JDK和Open JDK上工作。

我已经下载了jar,把它放在$home/bin中,并设置了一个shell函数来轻松调用它:

sjk(){
    java -jar ~/bin/sjk-plus-0.8.jar "@"
}

在我的电脑上,我使用cassandra-stress进行压测,我已经部署好了我的数据库,并开始使用下面的命令压测:

cassandra-stress read n=1000000

在分析的第一步中,我们需要使用SJK的stcap特性捕获正在运行的java应用程序的堆栈帧。为此,我们需要传入进程id和将数据转储到的文件。转储是以二进制格式编写的,我们稍后可以查询:

sjk stcap -p 92541 -i 10ms -o dump.std

然后我们可以分析数据。如果我们只有一个终端,我们可以打印出分析的柱状图。如果有明显的问题,这一点本身就非常有用。在这种情况下,我们可以看到很多时间都花在sun.misc.unsafe.park上,这意味着线程只是在等待,停在:

$ sjk ssa -f dump.std --histo
Trc     (%)  Frm  N  Term    (%)  Frame
372447  96%  372447       0   0%  java.lang.Thread.run(Thread.java:745)
309251  80%  309251  309251  80%  sun.misc.Unsafe.park(Native Method)
259376  67%  259376       0   0%  java.util.concurrent.locks.LockSupport.park(LockSupport.java:304)
254388  66%  254388       0   0%  org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:87)
 55709  14%  55709        0   0%  java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
 52374  13%  52374        0   0%  org.apache.cassandra.concurrent.NamedThreadFactory$$Lambda$6/1758056825.run(Unknown Source)
 52374  13%  52374        0   0%  org.apache.cassandra.concurrent.NamedThreadFactory.lambda$threadLocalDeallocator$0(NamedThreadFactory.java:81)
 44892  11%  44892        0   0%  io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:138)
 44887  11%  44887        0   0%  java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 42398  11%  42398        0   0%  io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:409)
 42398  11%  42398        0   0%  io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
 42398  11%  42398        0   0%  io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:753)
 42398  11%  42398        0   0%  sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:198)
 42398  11%  42398        0   0%  sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:117)
 42398  11%  42398    42398  11%  sun.nio.ch.KQueueArrayWrapper.kevent0(Native Method)
 42398  11%  42398        0   0%  sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
 42398  11%  42398        0   0%  sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)

然后我们就有了我们的stcap的dump,通过下面的命令,可以生成我们的火焰图:

sjk ssa --flame -f dump.std > flame-sjk.svg

当你使用浏览器打开svg的文件的时候,你可以看到下面的图:

flame_sjk_screen

如果打开机器上的flame图,可以将鼠标移到不同的部分上,查看方法调用和所用时间的百分比。横坐标长度越宽,在stack里出现的频率就越高。浏览图表很容易理解我们的程序在哪里花费时间。

这并不是生成火焰图的唯一技术。Brendan Gregg 有一长串的链接和参考资料,我建议详细阅读在他的火焰图页。我打算编写一个实用程序,将SJK格式导出为brendan在他的博客上使用的格式,因为它看起来更好一些,鼠标悬停更好,支持向下钻取,还有搜索功能。它们还支持不同的flame图,如果您要在不同的构建中进行性能比较,这是很好的方式。

我希望你喜欢这篇关于用火焰图可视化Cassandra文章。我们已经与我们合作过的团队多次使用这个工具来调整Cassandra的配置并优化性能。在本系列的下一篇文章中,我们将研究如何调整垃圾收集参数以最大化吞吐量,同时将延迟保持在最低限度。

译者注:

1.生成火焰图的方式很多,文章中说的是一种方式,可以参考Brendan Gregg 一系列文章;

2.上述是针对Cassandra生成的火焰图,对于其他的java平台软件也适用,比如HBase、Spark等;

3.可以生成c++ 等其他平台的软件的火焰图,不仅仅限于java程序,使用的profile工具不仅仅是SJK,也可以是perf、systemtap;

4.火焰图不仅仅限于cpu(on-cpu、off-cpu),还可以绘制出内存、磁盘等的火焰图。

翻译自:https://thelastpickle.com/blog/2018/01/16/cassandra-flame-graphs.html

入群邀约
为了营造一个开放的 Cassandra 技术交流环境,社区建立了微信群公众号和钉钉群,为广大用户提供专业的技术分享及问答,定期开展专家技术直播,欢迎大家加入。另外阿里云提供免费Cassandra试用:https://www.aliyun.com/product/cds
8a55f5a99463a7276265074b1079d74f4ab3d164

目录
相关文章
|
存储 Java 测试技术
记一次堆内外内存问题的排查和优化
记一次堆内外内存问题的排查和优化
749 0
|
Dubbo Java 应用服务中间件
Dubbo-线程池调优实战分析
Dubbo-线程池调优实战分析
1147 0
|
7月前
|
安全 Java
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
前言 你是否在线程池工具类里看到过它的身影? 你是否会好奇LinkedBlockingQueue是啥呢? 没有关系,小手手点上关注,跟上主播的节奏。 什么是LinkedBlockingQueue? ...
280 1
【Java并发】【LinkedBlockingQueue】适合初学体质的LinkedBlockingQueue入门
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
491 1
|
12月前
|
前端开发 JavaScript
如何在 CSS3 动画中添加缓动效果?
在上述示例中,页面中有一个蓝色的方块元素和几个按钮,点击不同的按钮可以为方块的移动动画设置不同的缓动效果。通过JavaScript获取方块元素,根据用户点击按钮传递的缓动函数值,修改方块的`transitionTimingFunction`属性,从而实现动态切换缓动效果的功能。每次点击按钮后,方块会向右移动100px,并在1秒后回到初始位置,以便用户观察不同缓动效果下的动画表现。
350 57
|
12月前
斗地主单机游戏HTML源码
斗地主单机游戏HTML源码,可以作为课程设计项目参考,喜欢的朋友可以拿去
238 5
|
设计模式 关系型数据库
设计模式的六大原则:理解设计模式的关键思想和应用
设计模式的六大原则:理解设计模式的关键思想和应用
338 2
|
消息中间件 PHP 数据库
【PHP开发专栏】PHP在微服务架构中的应用
【4月更文挑战第29天】微服务架构将大型应用拆分成独立小服务,PHP在其中可作为API网关、微服务提供者,参与服务发现、消息队列处理和事件驱动。最佳实践包括选择合适PHP框架、使用容器化技术、定义服务契约、采用分布式缓存、实现服务发现、监控和日志收集、优化数据库设计以及注重安全性。遵循这些实践,PHP开发者能构建高效、可扩展的微服务应用。
301 0
|
Java 关系型数据库 MySQL
“阿里爸爸”上新!《2023阿里Java性能调优手册(实战参考)》
现在行业变化太快,裁员缩招屡见不鲜,而应对的方法即是--核心竞争力。打磨自己的专业技能,成为本职行业的前百分之二十,行业再怎么变动,你总能安身立命。 在任何一个细分领域内,成为前1%,拼的是天赋,是智力决定的。但若仅仅想要成为20%,成为被二八定律眷顾的那波人,拼的就是努力了,没有学霸的智商,得有学渣不要脸的劲!!
|
SQL 存储 关系型数据库
「一份成本、两种引擎」-- Babelfish for RDS PostgreSQL发布
2022年5月16号,阿里云RDS重磅发布Babelfish for RDS PostgreSQL,兼容SQL Server生态版本,本篇文章从以下角度探讨Babelfish的方方面面: - Babelfish是什么 - 为什么使用PostgreSQL来实现 - Babelfish的架构 - 受众与场景 - 最佳实践 - Babelfish的未来发展 # Babelfish是什么 基于Bab