PolarDB全异步执行架构原理介绍

本文介绍异步执行架构的技术原理。

简介

为了解决传统线程模型高并发下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全异步执行流程图如下:

image

具体实现方案包括以下核心设计:

  • 请求协程化:将事务请求封装为独立的协程单元,由用户态调度器统一管理。

  • 主动让出机制:协程在执行过程中可主动挂起并释放执行权,调度器能够立即切换到其他就绪协程。

  • 资源高效复用:单线程可并行处理数百个协程,显著降低了线程切换和调度的开销。

基于协程的请求处理

在传统数据库架构中,用户请求的生命周期与执行线程紧密绑定。具体而言,每个请求从开始到返回结果都由一个固定的线程负责执行。这种设计导致当请求执行过程中遇到锁竞争或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%以上。

image