前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >多核处理器下数据库系统日志管理器优化技术探讨

多核处理器下数据库系统日志管理器优化技术探讨

原创
作者头像
腾讯架构师
修改于 2017-11-14 03:09:40
修改于 2017-11-14 03:09:40
1.4K0
举报

摘要

传统数据库的设计假设磁盘为主要存储设备,其性能取决于基于I/O代价模型的优化。然而,当前数据库运行的平台已逐渐转移到由多核处理器、大内存和以闪存为代表的低延迟存储所构成的新型硬件平台上。在大多数情况下,工作数据集能够全部加载到内存或者闪存等高速存储器中。这样,数据库的性能瓶颈由传统的I/O转移到了CPU上。而传统数据库的加锁操作、闩锁竞争、日志管理以及缓冲区管理在设计时均未考虑到多核处理器的使用,因而成为了限制CPU利用率的明显瓶颈。改变传统数据库的优化重点以适应硬件的发展对应用而言是十分必要的。本文针对当前新的应用背景,主要围绕数据库中日志管理器、在多核平台下已有的优化技术进行详细介绍和归纳总结。

背景

摩尔定律揭示了集成电路上晶体管集成度的增长规律,摩尔定律首先表现为CPU主频的持续增长,然后又表现为CPU核心数量的持续增长。CPU的频率持续逐年增长,加上其指令执行的并行度也在增加,使得单线程的工作性能不断提高。早在2002年,CPU的频率就已经达到3GHZ。然而,高频率的CPU带来的是更多的能耗,现实应用中不一定会带来高的性价比,因而阻止CPU主频的进一步发展。这个问题使得近年来CPU的发展方向产生了转变。为了进一步优化CPU的性能,生产商倾向于在单个CPU上增加更多的处理核心。CPU开始转向使用并行多线程和片上多处理器技术,以替代单处理流的高度复杂CPU技术。生产商不再竞争速度而是转向提高并行度。按照最近多核的发展趋势,单个CPU上的核数基本每两年翻一倍。大部分研究人员预测,CPU的核数会继续增长一段时间。为了更好地利用新CPU的并行处理能力,工程师需要修改或重新设计软件系统。而基础软件,包括操作系统、web服务器和数据库等,则最先遇到复杂的多核架构带来的扩展性问题。

从一开始,数据库存储引擎的研究就是定位在高负载下的高性能和可靠性。一方面,数据的可靠性和一致性大都通过在共享数据结构上的封锁机制实现;另一方面,在现代多核架构下,性能的提升必须通过利用更高程度的并行性。如何解决这两者之间的矛盾是一个很大的挑战。现实中,关系数据库系统大部分是基于优化I/O和面向单处理器的陈旧设计思想,并不适合多核处理器的架构。

以事务处理为主的数据库系统多数依赖并发取得高吞吐率。并发是通过多线程或者多进程实现的。理想情况下,随着硬件上下文的增加他们应该具备良好的扩展性,特别是针对以读为主工作负载。实际上,为了维护一致性和持久性,数据库系统大量使用共享数据结构和同步原语。在高度并行的环境下,对共享数据进行频繁的原子更新不得不由线程串行地执行。因此,用于保护共享数据结构的同步原语会导致很大的同步开销。这些同步原语大量存在于共享内存缓冲区、锁表、索引与日志管理器中。此外,丰富的硬件上下文使得并行线程竞争硬件资源,例如,高速缓存的争用将降低缓存命中率从而增加内存访问延迟。另外,传统的封锁方式例如阻塞和忙等待策略在多核环境下效率低下。增加的并行度还会导致更大异构的工作负载,这给索引数据结构里的读写同步控制原语也造成更多的压力。总之,所有这些原因导致了运行在多核架构上的数据库系统的性能瓶颈。近年来,学者们提出许多不同的思想和方法,用于重新构建多核环境下的数据库系统。

本文主要对数据库的日志管理器的多核优化技术做整理归纳。

日志管理器优化技术

日志管理器是数据库系统的一个重要部件。几乎所有的数据库系统都使用集中式的预先写日志策略避免在系统崩溃的时候带来的数据的损坏和丢失已提交工作,以保证事务的持久性。由于其集中式的设计和对I/O的依赖使得它很容易成为性能瓶颈。较长的日志刷新时间、由日志带来的锁竞争、日志缓冲区上的竞争都会影响系统的扩展性。日志操作给系统带来的延迟主要是四类:1) 系统必须保证事务提交之前日志必须写到非易失性存储介质;因为磁盘的访问时间是毫秒级别的,日志刷盘通常为事务中执行时间最长的部分;此外,当很多小的I/O请求使得记录日志的设备例如SSD上达到饱和状态时,写日志的延迟为串行执行时间;2)在写日志的过程中,事务一直持有写锁,直到I/O结束;在很多工作负载中,这都会造成瓶颈,特别是锁竞争激烈的场景;3)日志刷盘除了I/O延迟以外还有其他开销;在等待I/O完成的过程中,事务不能继续执行,代理线程必须被挂起,直到I/O完成;与I/O延迟不同,上下文切换和调度决策会消耗CPU时间,不能重叠执行其它任务;多核硬件环境下同时运行的线程很多,这使得操作系统调度器会负载过重;4)除了锁的竞争和上下文切换的开销,许多线程同时想要执行日志插入操作;集中式的日志缓冲区有明显的临界区,其上的竞争显然也会影响系统的扩展性。

为了提高日志管理器的扩展性,必须设法提高日志的I/O效率,并且减少日志临界区的数量和缩短关键路径的长度。

成组提交技术通过将许多小的日志刷盘的请求组合到单个I/O操作减缓磁盘的压力,减少I/O等待时间。成组提交技术能够减少磁盘访问次数和增大写入的磁盘块,进而减少磁头转动获得更好的响应时间。但是成组提交技术不能消除不必要的上下文切换开销,因为过多的事务会阻塞来自日志管理器的挂起通知。异步提交技术结合了成组提交技术的优点将许多日志刷盘的请求组合到一起,并且允许事务结束而不用等待刷新日志操作完成。这个优化将日志刷盘操作从关键路径上完全移除,但是牺牲了事务持久性这个特性,也就是说,已提交工作有可能由于系统崩溃而丢失。

有研究人员针对多核平台优化了的写日志操作。他们重新审视了提前锁释放技术(Early Lock Release,ELR),并在四个不同延迟的非易失性设备上测试了ELR的有效性。ELR技术是指事务在commit记录到达磁盘之前可以释放锁,减少持有锁的时间。在ELR技术下,只有提交事务需要等待I/O结束。不存在其它事务需要等待提交事务的锁而与提交事务一起等待I/O结束。实验结果表明在越慢的设备上,ELR获得收益越好。即使是在像SSD上的快速磁盘设备,ELR也可以获得比较好的收益(短事务的执行时间比I/O要短得多)。另外,数据的偏斜程度也对ELR造成影响。如果数据偏斜度小,对锁的竞争不激烈,ELR减缓锁的竞争效果不大。如果数据的偏斜度大,锁的竞争很激烈,即使在没有等待日志刷盘的情况下, ELR效果也不好。按照80%的访问都是集中在20%的数据上的原则,对应数据的偏斜度为0.85左右,这时候锁的竞争程度刚好是ELR的优化点。针对多核平台上过多的调度而导致的系统瓶颈和上下文切换带来的开销,流水线方式写日志是一种新的记录日志的方法。流水线刷新日志类似异步提交方式不用在等待I/O的时候将线程挂起,从而不会有上下文切换的开销。但是不同于异步提交方式,流水线刷新不将结果返回给客户端,而是转而执行其它事务。守护进程在完成日志刷盘动作以后,通知代理线程/进程返回继续执行后续事务。实验表明,流水线刷新和ELR组合的效果能够达到异步提交的性能,而且在系统崩溃的时候具有可恢复性。

为减缓多核情况下日志缓冲区上的竞争,技术人员设计了三种新的日志缓冲区管理方法。传统的写日志缓冲区需要以下三个步骤:1)首先获取写日志缓冲区上的排他锁。如果当时正好有其它的服务子线程在写日志缓冲区,则此子线程必须等待直到获得写日志缓冲区上的写锁; 2)线程将日志记录复制到相应的日志缓冲区 3)释放缓冲区上的锁。由于它的简单性,这种方法具有吸引力。这个方法的缺点是:即使是缓冲区从来不会重叠的情况下,填充日志缓冲区的操作也是串行化执行。图1(B)展示了由于单一的长日志记录会给后续的线程造成比较大的延迟。日志记录由一个头部加上任意长度的值组成。日志记录结构体空间的申请是可复合的,也就是两个连续的日志记录的缓冲区申请也可以由一个头部加上任意长度的属性值组成。可以利用这种空间的可复合性将线程对日志缓冲区的填充按组进行。每一个组都有一个组织者。

一个组只有组织者才要竞争缓冲区上的锁,且一个组只有最后离开的线程需要等待锁的释放。组织者在等待互斥变量的时候,后面到来的请求可以“回退”到一个数组将他们的请求组合到一起。如图1(C)所示,组内日志缓冲区的填充可以并行执行,但组之间仍然串行执行。由于日志缓冲的填充不具有串行特征,只要满足以LSN的顺序将日志写回即可。因此,线程申请的锁可以在获得缓冲区以后马上释放。因此将缓冲区填充与锁的持有解耦合。缓冲区的填充可以按流水线的方式进行:下一个缓冲区的填充可以立刻开始,只要线程获得日志缓冲区空间。如图1(D)所示,将锁的持有与缓冲区的填充解耦合可以消除长日志记录对缓冲区填充的影响。前面讨论的两种方法具有互补性,因此将两种方法组合 一起日志缓冲区上的竞争限制在某一个常数下,同时也消除日志记录的大小对刷新日志的影响。

<small>图1. 日志记录写入日志缓冲区算法图示<big>

总结

优化日志管理器可以显著提升数据库系统的性能。有相应的实验表明,经过以上优化,数据库系统的性能可以提升10%-30%左右。

值得一提的是随着像固态硬盘的新闪存产品开始进入主流的计算机市场,闪存技术被认为是磁盘技术的替代。最近也有相关研究利用闪存技术提高数据库系统性能。固态硬盘可以显著提高事务写日志的性能。他们的做法主要关注以下四点1)突破带宽限制,利用多闪存设备,并行化I/O提高刷新日志操作性能;2)解决由于设备擦除操作而引起的不同的写延迟;3)高效的系统恢复处理;4)将闪存设备与磁盘设备结合起来获得更好的日志操作和系统恢复性能。

文章来自:腾讯架构师

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
透过新硬件环境下的存储技术,看未来数据库系统崛起(附PPT)
anduin,中国人民大学博士,腾讯基础架构部高级工程师。研究方向主要为数据库系统理论与实现、新硬件平台下的数据库系统以及TP+AP型混合系统。
腾讯 架构师
2021/07/15
8710
透过新硬件环境下的存储技术,看未来数据库系统崛起(附PPT)
【数据库09】数据库系统体系结构
最早的数据库是在单台支持多任务的物理机器上运行的,这种集中式的数据库系统仍然在被广泛使用,如今在集中式数据库系统上运行的企业级应用可能拥有成千上万的用户,数据库的规模从兆字节到数百G字节不等。
半旧518
2022/11/22
6790
【数据库09】数据库系统体系结构
如果有人问你数据库的原理,叫他看这篇文章-4
国内大佬翻译的文章,因为文章较长,不适合碎片化阅读,因此分为几篇文章来转载,满满的干货,外链在微信上不能显示,建议从第一篇文章开始看起
Java识堂
2019/08/13
8540
内存数据库解析与主流产品对比(一)[转]
8月26日,星环邀请来自华东师范大学软件工程学院的博士生导师宫学庆教授带来《数据库前沿技术系列讲座》,分享数据库业内前沿发展和研究热点。现将宫学庆教授的培训第一讲内容:内存数据库的技术发展分享给大家。
matinal
2023/11/22
2560
内存数据库解析与主流产品对比(一)[转]
关系数据库如何工作
当谈到关系数据库时,我不禁想到缺少了一些东西。它们到处都在使用。有许多不同的数据库:从小而有用的 SQLite 到强大的 Teradata。但是,只有几篇文章解释了数据库的工作原理。你可以自己谷歌“关系数据库是如何工作的”,看看有多少结果。而且,这些文章很短。现在,如果您寻找最新的流行技术(大数据、NoSQL 或 JavaScript),您会发现更深入的文章解释了它们的工作原理。
TimeFriends
2022/06/29
9110
关系数据库如何工作
深入理解MySQL innodb日志管理
1、innodb存储引擎是支持事务ACID特性的,这个理论基本就是一个关系型数据库相关的数据恢复原形设计,包括日志、回滚、redo、并发控制、buffer pool等管理方面,内容非常全面;
星哥玩云
2022/08/17
6240
【连载】如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(3)
前面提到,行存储是一个基于磁盘的存储引擎。为了避免IO的高昂开销,存储引擎会缓存一部分页面在内存中,便于随时对其进行检索和更改。存储引擎会对缓存的页面进行筛选、替换和淘汰,保证留存在缓存的页面能够提高整个引擎的执行效率。
数据和云
2021/12/15
8800
【连载】如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(3)
db2 日志管理
DB2日志是以文件的形式存放在文件系统中,分为两种模式:循环日志和归档日志。当创建新数据库时,日志的缺省模式是循环日志。在这种模式下,只能实现数据库的脱机备份和恢复。如果要实现联机备份和恢复,必须设为归档日志模式。
全栈程序员站长
2022/07/01
3.3K0
db2 日志管理
每个Java工程师,都应该掌握数据库事务!
转账是生活中常见的操作,比如从A账户转账100元到B账号。站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成:
本人秃顶程序员
2019/05/02
5010
每个Java工程师,都应该掌握数据库事务!
详解关系型数据库运作机制
一说到关系型数据库,我总感觉缺了点什么。如果你尝试透过“关系型数据库是如何运作的”的关键词句来进行搜索,其搜索结果是少量的而且内容是简短的。难道说是由于它已经太老旧而已经不再流行吗?
kubernetes中文社区
2019/09/05
6550
详解关系型数据库运作机制
硬卷 NoSQL 数据库系列(六):MongoDB 存储引擎 WiredTiger 技术详解
前面介绍了 MongoDB 的安装与基础的 CURD 操作、索引与聚合、基本使用、常用管理命令与授权认证等相关的知识点。今天我将详细的为大家介绍 MongoDB 存储引擎 WiredTiger 相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!
民工哥
2023/08/25
2.2K0
硬卷 NoSQL 数据库系列(六):MongoDB 存储引擎 WiredTiger 技术详解
【数据库08】数据库物理存储系统的选型与管理
当前计算机系统会根据访问速度,介质成本,介质可靠性等,搭配多种不同的存储介质,有代表性的可用存储介质包括。
半旧518
2022/11/18
1.2K0
【数据库08】数据库物理存储系统的选型与管理
可观测平台-3.3: 数据库监控项
开源数据库系统可以分为关系型数据库(如 MySQL, PostgreSQL)和 NoSQL 数据库。下面列举了一些常见的开源数据库和相应的监控配置。
行者深蓝
2023/12/13
2120
MIT 6.830数据库系统 -- lab four
原项目使用ant进行项目构建,我已经更改为Maven构建,大家直接拉取我改好后的项目即可:
大忽悠爱学习
2023/10/11
2970
MIT 6.830数据库系统 -- lab four
Mysql实例 数据库优化--结构和性能优化
当开发人员设计好表语句后,就需要运维工程师进行服务部署,项目上线。这里应该根据需求进行预估访问量,再进行配置的选择和结构设计。
陈不成i
2021/06/16
2.3K0
干货分享 | 腾讯自研数据库CynosDB计算存储分离架构的实现和优化
点击上方蓝字关注每天学习数据库 作者简介:尚博,腾讯云数据库高级工程师,多年数据库内核研发经验,在事务、日志、存储、性能调优、SQL兼容性等方面有较深的研究和开发经验。 腾讯云数据库高级工程师尚博 3月16日,由腾讯云云+社区主办的腾讯云自研数据库 CynosDB 交流会在北京圆满落幕,本次交流会全方位解读了CynosDB,揭秘技术内幕,解读兼容两大主流开源数据库的一主多读架构、高可用架构及快速恢复实现、可计算智能存储和分布式存储。 本文为尚博分享的《CynosDB for MySQL 计算存储分离架
腾讯云数据库 TencentDB
2019/05/16
1.4K0
干货分享 | 腾讯自研数据库CynosDB计算存储分离架构的实现和优化
面试问烂的 MySQL 查询优化,看完屌打面试官!
https://segmentfault.com/a/1190000013672421
Java技术栈
2019/05/13
5230
面试问烂的 MySQL 查询优化,看完屌打面试官!
MySQL中的WAL技术
WAL(Write-Ahead Logging)技术是一种用于数据库系统的日志管理方法,它主要用于确保数据的完整性和恢复能力。在WAL技术中,所有的修改(事务)都会先被写入到日志中,然后才会被应用到数据库文件上。这样做的目的是为了在发生故障时,可以使用这些日志来恢复数据库到最后一次一致的状态。
程序员朱永胜
2024/01/05
4790
POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 数据压缩和打包处理与数据更新
当部分package达到最大容量后,它会被转换为big package并压缩到磁盘上以减少空间消耗。压缩过程采用写时复制模式以避免访问冲突。也就是说,生成一个新package来保存压缩数据,而不对部分package进行任何更改。PolarDB-IMCI在压缩后更新元数据,将部分打包替换为新的package(即以原子方式更新指向新打包的指针),对于不同的数据类型,列索引采用不同的压缩算法。数值列采用参考帧、delta编码和位压缩的组合,而字符串列使用字典压缩。此外,由于打包是不可变的,当活动事务大于所有VID时,即没有活动事务引用插入VID映射时,该打包的插入VID映射是无用的。在这种情况下,PolarDB-IMCI会删除行组中的插入VID映射以减少内存占用。
AustinDatabases
2023/09/06
2440
POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 数据压缩和打包处理与数据更新
资源等待类型sys.dm_os_wait_stats
动态管理视图  sys.dm_os_wait_stats  返回执行的线程所遇到的所有等待的相关信息。可以使用该聚合视图来诊断 SQL Server 以及特定查询和批处理的性能问题。 列名数据类型说明 wait_type nvarchar(60) 等待类型的名称。 waiting_tasks_count bigint 该等待类型的等待数。该计数器在每开始一个等待时便会增加。 wait_time_ms bigint 该等待类型的总等待时间(毫秒)
欢醉
2018/01/22
1.9K0
推荐阅读
相关推荐
透过新硬件环境下的存储技术,看未来数据库系统崛起(附PPT)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文