GaussDB关键技术原理——高性能之线程池化

GaussDB线程池化
在OLTP领域中数据库通常需要处理大量的客户端连接。因此,高并发场景的处理能力是数据库的重要能力之一。

对于外部连接最简单的处理模式是per-thread-per-connection模式,即来一个用户连接产生一个线程。这个模式好处是架构上处理简单,但是高并发下,由于线程太多,线程切换和数据库轻量级锁区域的冲突过大导致性能急剧下降,使得系统性能(吞吐量)严重下降,无法满足用户性能的SLA。

归纳起来每当面对高并发业务(线程/CPU核数比大于10)场景时,系统通常面临以下几个方面挑战:

(1)资源耗尽,由于接入的会话数过多导致消耗过多的内存、连接数资源耗尽产生系统宕机、OOM等异常,造成系统可用性降低。

(2)过度争抢,由于并发数过多而具体CPU计算有限,增加了临界区锁、信号量等处理开销,大量资源并未产生客户实际吞吐量。

(3)相互影响,如果某一个会话请求占用过多的CPU、内存资源导致对其他会话资源的挤占,造成单个请求拖垮整个系统的严重问题。因此,对于高并发性能稳定性从本质上分析,数据库系统需要从设计上解耦接入会话数与资源使用量&争抢之间的线性耦合关系,同时对极端“炸弹式”请求需要有有效的管控措施,将其影响控制在有限的范围内。GaussDB主要的解决方案过线程资源池化复用的技术来解决该问题。线程池技术的整体设计思想是线程资源池化,并且在不同连接之间复用。

系统在启动之后会根据当前核数或者用户配置,启动固定一批数量的工作线程,一个工作线程会服务一到多个连接session,这样把session和thread进行了解耦。因为工作线程数是固定的,因此在高并发下不会导致线程的频繁切换,而由数据库层来进行session的调度管理。高斯数据库线程池实现主要体现在以下3个方面:

(1)资源解耦:将接入会话&工作线程进行解耦隔离,确保高并发场景下系统资源不会持续增加而是保持稳定。

(2)多核优化:在多核场景下考虑到NUMA效应,线程池针对工作线程的调度范围根据NUMA node进行分配和限制,避免线程的调度跨numa,降低处理时延提升性能。

(3)资源管控:线程池化基础上实现以工作线程为粒度的过载管控,避免单一线程占用过多资源,提升系统可靠性。

在这里插入图片描述
通过线程池化改进后相比高并发场景下具有明显的性能稳定性,以下是数据库性能稳定性测试,通过标准OLTP负载模型(TPCC)的测试结果。

在这里插入图片描述
总结:在线程池的帮助下数据库系统面对大并发场稳定性、性能两个方面都有明显提升。

(1)稳定性:随着并发数增加MySQL无线程模式的数据库性能在CPU资源满了以后并不会像GaussDB这样保持稳定。

(2)高性能:数据库线程池化考虑多核CPU NUMA亲和以后进一步提升性能,相比MySQL有明显优势。

posted @ 2025-01-22 10:15  喜酱喜酱  阅读(0)  评论(0)    收藏  举报