本文介绍异步执行架构的技术原理。
简介
为了解决传统线程模型高并发下CPU争抢、频繁上下文切换等导致的性能问题,PolarDB MySQL版设计了基于协程的全异步执行架构,实现了鉴权、事务提交、锁等待等核心逻辑的异步化执行,显著提升了PolarDB MySQL版的高并发处理能力。基于异步执行架构,数据库前台线程能够专注于执行代码指令,避免不必要的上下文切换开销,开启异步执行功能后,通用写入性能提升超过70%,长尾延迟降低60%以上。
CPU资源消耗问题分析
在典型OLTP核心业务场景(如电商交易、金融支付等)中,数据库Buffer Pool命中率普遍超过95%,性能瓶颈主要集中于CPU计算密集型操作。传统MySQL架构在高并发场景压力下,暴露出的线程调度低效、上下文切换冗余、事务锁竞争等内核问题,往往导致CPU资源无法有效转化为实际业务吞吐量。
因此在OLTP业务系统中,数据库性能损耗主要发生在内核层的以下方面:
线程调度风暴:传统线程模型在高并发场景下产生上下文切换,CPU时间片被无效切割。
同步阻塞陷阱:事务提交流程中的事务持久化、锁等待等关键路径存在同步点,导致线程陷入空转等待。
原子操作雪崩:全局资源管理(如Lock Sys、Trx Sys等核心Mutex)的集中访问,争抢触发CAS操作导致访问指数级增长。
PolarDB MySQL版基于协程的全异步执行架构正是瞄准以上核心痛点,通过重构数据库核心调度模块,突破线程模型对CPU资源的低效利用模式。
PolarDB异步执行方案设计
在MySQL历史代码的异步化执行改造中,我们深入重构了连接管理、SQL执行和事务处理等多个核心模块,这一过程面临巨大挑战。改造的核心目标是在确保事务完整性的前提下,显著提升系统吞吐量并有效减少长尾延迟。PolarDB MySQL版异步执行方案通过协程技术实现了用户请求与执行线程的解耦,并利用eventfd机制高效完成协程间通信,为系统性能优化提供了创新解决方案。
PolarDB MySQL版全异步执行流程图如下:
具体实现方案包括以下核心设计:
请求协程化:将事务请求封装为独立的协程单元,由用户态调度器统一管理。
主动让出机制:协程在执行过程中可主动挂起并释放执行权,调度器能够立即切换到其他就绪协程。
资源高效复用:单线程可并行处理数百个协程,显著降低了线程切换和调度的开销。
基于协程的请求处理
在传统数据库架构中,用户请求的生命周期与执行线程紧密绑定。具体而言,每个请求从开始到返回结果都由一个固定的线程负责执行。这种设计导致当请求执行过程中遇到锁竞争或I/O等待时,执行线程会被操作系统挂起,直至等待条件满足后才能继续执行,这严重影响了系统的并发处理能力和资源利用率。
为解决这一问题,PolarDB MySQL版全异步执行方案中引入协程技术,通过将每个请求封装到独立的协程中执行,实现了请求生命周期与协程的绑定,而非传统的线程绑定。这种架构设计使得单个内核线程能够同时处理多个协程请求,显著提升了系统的并发处理能力。该框架的核心思想是将SQL执行与线程解耦,具体实现方案是采用协程技术。通过将每个用户请求封装在独立的协程中执行,实现了请求生命周期与协程的绑定,而非传统的线程绑定。这种架构设计使得单个内核线程能够同时处理多个协程请求,显著提升了系统的并发处理能力。
高效同步机制
PolarDB MySQL版创新性地设计了一套线程-协程两级调度模型,结合精准事件驱动的唤醒机制,彻底突破了传统线程模型的性能瓶颈。该机制通过以下核心设计实现三大突破:零无效唤醒、纳秒级响应和百万级并发管理能力。
请求调度
PolarDB MySQL版的全异步执行架构中,系统采用多维度的智能任务调度机制,通过综合分析客户端IP地址、用户类型、请求类型、事务类型以及当前挂起点等多个关键维度,对请求(任务)进行精准的优先级划分。
异步执行动态开关设计
PolarDB该方案通过全局变量形式实现了一键式开关功能,用户可根据实际需求快速启用或禁用异步执行模式。更重要的是,该方案支持对多个关键执行路径进行独立控制,包括但不限于:系统鉴权流程、binlog/redo log写入操作、行级锁等待等核心模块。详细功能使用请参见PolarDB异步执行功能使用介绍。
性能测试
测试环境配置:
通用规格:4核 16 GB,独享规格:8核 32GB
测试工具:Sysbench 1.1.0
测试数据量:25张表,每张表250000行数据。
测试结果如下:
通用规格4核 16 GB高并发事务写性能提升90%以上。
独享规格8核 32 GB高并发事务写性能提升50%以上。