iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >分布式数据库调优实践
  • 394
分享到

分布式数据库调优实践

分布式数据库调优实践 2019-12-18 11:12:29 394人浏览 绘本
摘要

数据库调优实践案例   数据库作为基础数据支撑层的核心部分,对于应用和平台整体性能表现有着决定性的影响。因此,数据库性能优化可以说是最考验DBA能力的工作了。本文我们就由数据库内核专家来,以 SequoiaDB 5.0 内核的部分性能优

分布式数据库调优实践

数据库调优实践案例

 

数据库作为基础数据支撑层的核心部分,对于应用和平台整体性能表现有着决定性的影响。因此,数据库性能优化可以说是最考验DBA能力的工作了。本文我们就由数据库内核专家来,以 SequoiaDB 5.0 内核的部分性能优化为例,带领各位数据库爱好者揭开数据库性能优化的“神秘面纱”。

 

通常优化思路:

提高数据库性能的方式有很多,总结起来从易到难无外乎如下三种:

  1. 最简单直观的是通过使用数据库提供的工具,找到sql语句执行中消耗资源最大或耗时最长的部分,也即性能瓶颈。然后通过调整数据本身或数据库配置解决这些性能瓶颈。比如说发现数据分布不均匀,我们可以通过切分数据(split)达到数据均衡(rebalance);再比如我们发现某些网络时延较长,在确定不是网络本身的问题后,我们可以通过调整连接端口数和通讯处理线程提高数据库消息处理能力;再比如单点磁盘io过多,需要调整缓存或调整部分数据的分布。SequoiaDB提供了图形化的性能诊断工具SequoiaPerf,可以协助用户完成上述的调优。
  2. 业界经验证明,效果最明显,成本最低的方法其实是SQL语句的调优,通常是通过理解分析访问计划,对比实际语句执行时的开销来判断语句是否优化。比如对比索引读和表读的个数判断否创建使用了合适的索引;对比访问计划的打分和时间执行开销来判断表/集合/索引的统计信息是否反映当前最新的状态;观察等待时间来判断系统中是否存在应用持锁时间过长阻塞其他应用而;对比join两边表的返回数据集以及使用的过滤条件判断使用join的类型是否合理。SequoiaDB 提供了完善监控功能,通过结合图形化的sequoiaPerf 与snapshot,用户可以相对容易的定位和实现SQL语句的调优。
  3. 前两种方式通常是DBA或应用开发者就能完成的任务,第三种是数据库内核的优化。这主要是数据库厂商在不断的实践中,通过各种相对底层的性能诊断工具,定位和优化数据引擎的性能。

 

内核调优

在数据库内核的调优中,开发人员通常会跑一定的workload或benchmark,使用操作系统或三方提供的工具,持续监控系统各类资源的使用情况,在高并发系统中,也会关注并发控制中使用的锁和原子变量带来的开销。下面我们通过TPCC场景下的逐步优化SequoiaDB内核的过程,来了解我们是如何使用工具来定位优化数据引擎的。

 

  1. CPU usage

我们常使用两大神器观察CPU使用情况:top 和 perf。top能动态的显示linux 系统中各进程/线程以及内存使用的汇总信息。

/

以上图为例,我们知道这台机器的CPU基本上被用满了,其中系统CPU占13%,用户CPU占81.7%。如果CPU出现过多的空闲,往往意味着系统要么还可以增加负载提高性能,要么有瓶颈导致CPU上不去,比如说并发不好,太多等待,串行化太多。在这个例子中,我们没有看到等IO的情况,idle的比例也非常小,这都是好的现象。在CPU用满的情况下,优化系统也意味着要尽量减少开销,让系统能尽可能的跑多点任务。需要注意的是,如果系统CPU过高,意味着CPU不是在执行跟程序逻辑相关的指令,也可以理解为是overhead。根据以往的经验,这里系统CPU占比还是偏高。使用线程模式,更进一步分析,我们可以看到潜在的问题可能是在系统调用,context switch和并发控制的mutex上。

 

至于更精确的定位,就要perf出马了。注意的是SequoiaDB 的代码编译时加入了debug symbol,这样会带来一定的性能损失,但能够极大的方便问题诊断和定位。

 

perf 是linux提供的一种基于event的性能搜集分析工具,能够分析CPU/内存/锁等资源的统计信息。perf本身已经提供了相当完整的文字的报表输出功能。

 

比如这里能看到system_call 也是跟sys_futex 相关的,通常是线程/进程同步共享资源互踩时造成的,还有部分是通讯线程相关的。这样我们的方向就可以从各种锁冲突入手。Perf也能提供锁冲突的信息。

 

为了简单直观的分析结果,我们还使用火焰图(flame graph)来用图形的方式展现结果,以利用更快的发现问题。下面两张图分别提供了CPU和锁的使用统计:从中我们发现的确有几处热的Latch/mutex。比如内存分配时使用共享内存池,这是会造成等锁的现象,我们可以通过使用线程上独享的内存池解决;还要部分内部表的物理锁冲突严重,我们通过增加锁的控制粒度减少冲突;再有就是尽量减少锁内操作,比如内存分配,磁盘IO尽可能的搬出热锁保护范围。通过一系列优化,我们实现了5%左右的性能提升。

CPU 火焰图

锁火焰图

 

2. Memory allocation

内存是个好东西,现在计算机系统内存越来越大,软件也尽量通过使用内存来实现空间换时间以提高系统相应速度。但是动态内存分配常常成为了高性能软件的性能瓶颈。我们通过perf 来抓取系统内存的使用情况,并用火焰图显示出来:

 

这里明显看到的是很多动态内存分配发生在一个set的插入过程中。Std::set内部使用的红黑树,每次结点的插入都要进行内存分配。为了减少系统内存的动态分配与回收,SequoiaDB实现了一整套自己的内存管理机制。最开始尽量在线程预分配好的内存池上分配空间,这点和tcmalloc的原理很接近,这时的开销最小,内存事先已经从操作系统分配好了,而且本线程上分配是无锁的。但是如果线程内存池用完了,我们会到一个共享的预分配好的内存池上分配,这时会多一个锁的开销。但这两处都用完了,我们才向操作系统申请。从火焰图上看,我们基本上都走到向操作系统分配的分支中了。针对这种情况,我们优化了set的实现。当set中结点数量较小时,我们用一个flat的较小的array存放数据,避免了动态内存分配。当结点数较多时,我们再转化成树型结构以提高查找效率。但是我们会提高线程上允许的缓冲池的大小,特别是小结构线程池大小。最终我们避免了绝大多少的动态内存分配与回收,提升了系统性能。通过这块的分析,我们也反过来帮助确定那些query会用到大量数据,并优化对应的query。

 

3.Cache line misses

大家知道现代CPU的主频非常高,常有超过3GHz,执行指令速度非常快。但是我们存储访问速度始终跟不上,高速的内存又非常贵,这就是现代CPU里有几级不同速度不同大小内存的原因,常见的CPU内集成有L1,L2,L3级缓存。CPU执行时需要从缓存中获取指令和数据。在我们编译程序的时候,编译器会试图优化程序,使得CPU能有效的重用或预提取数据和指令。当CPU在缓存中找不到合适的指令和数据时,就不等不从主存甚至磁盘上读取他们,这样的开销非常大,我们用CPU cache line miss来衡量这中情况出现的频繁程度。

我们还是通过perf命令来搜集cache line miss的情况,

 

详细信息分解开来,最大一块是由monitor引起的

然后我们检查monitor相关的代码,发现代码中有个switch语句公有14个分支,但最常用的一个分支放在了后面。我们只需要将其挪到前面,我们的miss就有显著下降。

 

还有另外一种情况造成严重的cache line miss,就是使用原子变量,特别是频繁使用的原子变量。因为一旦该变量被变更了,所有cache 里的值都会变成无效,那么CPU使用时一定会碰到cache line miss。我们通过分析代码逻辑,对于某些常用的确不需要时时精确的值,我们可以在程序逻辑开始存为本地变量,避免过多的直接访问。对于一些只需要单线程访问的变量,我们也避免使用原子变量。

 

小结:

上面我们通过几个例子,为大家展现了如何通过系统工具进行数据库内核性能优化,同样的思路也可以适用于其他底层软件的开发调试。在实际的实践过程中,除了使用合适的工具,更重要的是还要细心,有耐心和钻研的精神,一步步的下手,从现象中抽丝剥茧,找到根本原因。

您可能感兴趣的文档:

--结束END--

本文标题: 分布式数据库调优实践

本文链接: https://www.lsjlt.com/news/6840.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么实现分布式图数据库Nebula Graph 的Index实践
    这篇文章将为大家详细讲解有关怎么实现分布式图数据库Nebula Graph 的Index实践,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。导读索引是数据库系...
    99+
    2024-04-02
  • 分布式数据库TDSQL有哪些优势
    TDSQL(TiDB)是一款分布式数据库,它具有以下优势:1. 水平扩展能力:TDSQL可以水平扩展到数百个节点,以满足高并发和大规...
    99+
    2023-09-21
    数据库 TDSQL
  • 分布式数据库优缺点是什么
    这篇文章给大家分享的是有关分布式数据库优缺点是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。什么是分布式数据库?分布式数据库是多个互连的数据库,他们通常位于多个服务器上,但彼...
    99+
    2024-04-02
  • 数据库中分布式数据库有哪些
    小编给大家分享一下数据库中分布式数据库有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!分布式数据库有:1、物联网方向,时序数...
    99+
    2024-04-02
  • 分布式系统中 Golang 函数的优化实践总结
    优化 go 函数以提高分布式系统应用程序的性能,最佳实践包括:利用 go 协程、使用 channels 进行通信、区分并发性和串行性、进行内存优化、进行基准测试和性能分析。 分布式系统...
    99+
    2024-04-19
    golang优化 git golang 优化实践 同步机制
  • Oracle数据库索引的种类及性能调优实践
    Oracle数据库索引的种类及性能调优实践 在数据库领域中,索引是一种提高查询效率的重要工具。Oracle作为一款强大的关系型数据库管理系统,提供了多种不同类型的索引供用户选择,并且还...
    99+
    2024-03-11
    oracle 索引 性能调优 sql语句
  • MariaDBSpider数据库分库分表实践记录
    目录分库分表部署 MariaDB 实例Docker 部署虚拟机部署MariaDB 配置检查每个实例配置 Spider远程表基准性能测试加入后端数据库哈希分片根据值范围分片根据列表分片...
    99+
    2024-04-02
  • 分布式关系型数据库RadonDB有哪些优点
    这篇文章主要讲解了“分布式关系型数据库RadonDB有哪些优点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分布式关系型数据库RadonDB有哪些优点”吧!...
    99+
    2024-04-02
  • 数据库分布式事务的实现原理!
    事务是数据库系统中非常有趣也非常重要的概念,它是数据库管理系统执行过程中的一个逻辑单元,它能够保证一个事务中的所有操作要么全部执行,要么全不执行;在 SOA 与微服务架构大行其道的今天,在分布式的多个服...
    99+
    2024-04-02
  • Oracle数据库中的分布式数据库是什么
    在Oracle数据库中,分布式数据库是指在不同物理位置上的多个数据库实例能够通过网络连接相互通信和协作的系统。分布式数据库可以让用户...
    99+
    2024-03-02
    Oracle
  • 分布式系统中 Golang 函数与分布式数据库的交互
    在分布式系统中,go 函数可以与分布式数据库交互。具体步骤如下:安装必要依赖项。使用 spanner.newclient 函数连接到数据库。使用 query 方法执行查询,并获取迭代器。...
    99+
    2024-04-19
    分布式系统 分布式数据库 golang
  • 分布式数据库对2PC的优化方法是什么
    本篇内容主要讲解“分布式数据库对2PC的优化方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分布式数据库对2PC的优化方法是什么”吧!两阶段提交(2PC...
    99+
    2024-04-02
  • 如何实现MySQL底层优化:数据库分布式架构和性能优化
    抱歉,我无法满足你的要求。...
    99+
    2023-11-08
    性能优化 分布式架构 MySQL优化
  • Redis数据库分布式的示例分析
    这篇文章给大家分享的是有关Redis数据库分布式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。问题:1-2亿数据需要缓存,如何设计?1 哈希取余分区2亿条记录就是2亿个k,v,假设有3台机器构成一个集群...
    99+
    2023-06-28
  • PHP 函数调用性能优化实践分享
    为提升 php 应用性能,优化函数调用至关重要。实践包括:减少不必要的函数调用(如重复调用、传入不必要参数)利用函数别名和缩写使用内联函数(提升简单函数调用的性能) PHP 函数调用性...
    99+
    2024-04-17
    php 函数调用优化 优化实践
  • PHP与数据库分布式的集成
    随着互联网技术的发展,对于一个网络应用而言,对数据库的操作非常频繁。特别是对于动态网站,甚至有可能出现每秒数百次的数据库请求,当数据库处理能力不能满足需求时,我们可以考虑使用数据库分布式。而分布式数据库的实现离不开与编程语言的集成。PHP作...
    99+
    2023-05-15
    分布式 数据库 PHP
  • oracle分布式数据库怎么搭建
    要搭建Oracle分布式数据库,可以按照以下步骤进行操作: 确保已经安装了Oracle数据库软件,并且有适当的许可证。 创建...
    99+
    2023-10-25
    oracle
  • 分布式图数据库 Nebula Graph 中的集群快照实践是怎样进行的
    今天就跟大家聊聊有关分布式图数据库 Nebula Graph 中的集群快照实践是怎样进行的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.1 需求...
    99+
    2024-04-02
  • 分析数据库实例性能调优利器Performance Insights
    这篇文章主要讲解了“分析数据库实例性能调优利器Performance Insights”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分析数据库实例性能调优利...
    99+
    2024-04-02
  • Thinkphp分布式数据库连接代码分析
    Thinkphp作为国内的一款流行框架,相信使用的人一定不在少数。本篇我们来分析一下Thinkphp中比较重要的一部分——分布式数据库的连接。 当然了,我们在这里不是去将如何...
    99+
    2024-02-27
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作