南大通用GBase 8c分布式集群消除锁s_lock的方法介绍

原文链接:https://www.gbase.cn/community/post/4217
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在使用分布式数据库时,如果使用不当很容易触发数据库的锁,从而降低数据库的性能。对于南大通用GBase 8c分布式数据库,在面临这种场景时,我们可以通过监控发现底层的锁,进而监控数据库的锁,并通过合理调整数据库参数,将锁消除解决数据库集群故障,从而达到提升性能的作用。

本文讲解南大通用GBase 8c中s_lock锁的消除方法。


什么是s_lock?

s_lock是自旋锁的硬件相关实现。是spinlock的底层实现。spinlock是数据库的三个级别的锁的底层锁。特点是封锁时间短,没有等待队列和死锁检测机制,事务结束不能自动释放,不单独使用。spinlock作为最底层锁,实现与操作系统和硬件环境相关。数据库中实现了两个spinlock,其中一个是与机器相关的实现,利用了TAS指令集实现,通过s_lock.h和s_lock.c来实现。TAS是Test and set的缩写,原子操作。同一个内存地址同一时刻只允许一个进程做TAS操作,该操作实现了进程的互斥。


说完s_lock,我们演示一下GBase 8c数据库怎么监测到s_lock。测试环境如下:

IP

硬件

软件

100.0.0.84

鲲鹏920 128cpus 

1TMEM/512GB 

硬盘NVME 

网络万兆

GBase 8c V5
100.0.0.85
100.0.0.71
100.0.0.80

鲲鹏920 96cpus 

256GB 

硬盘SSD

网络万兆

Benchmarksql5.0
100.0.0.89
100.0.0.79

  (1)部署GBase8c V5分布式版本后,检查集群状态并获取部署配置。执行:

gha_ctl monitor all -H -l http://100.0.0.84:2379

返回如下信息:

  (2)向数据库中使用benchmarksql5.0加载1000仓数据,然后对数据库进行压测,1000并发压测20分钟。

  (3)使用perf top监控s_lock相关热点函数(如图中红框标注):

  (4)发现有s_lock热点函数,利用perf和Flame Graph工具生成火焰图。⽣成和创建⽕焰图需要如下⼏个步骤:

a)安装perf⼯具和Flame Graph工具,例如:

apt install linux-tools-common
git clone https://github.com/brendangregg/FlameGraph

b)⽣成折叠后的调⽤栈,执行命令:

 perf script -i perf.data &> perf.unfold

c) 分析堆栈信息⽣成⽕焰图,执行命令:

./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded
#最后⽣成 svg 图
./FlameGraph/flamegraph.pl perf.folded > perf.svg

生成如下所示的火焰图:

将s_lock部分(上图黑框标注处)放大:

从图中分析,是由GetSnapshotGTMLite调用引起。

  (5)调整线程池参数

GBase 8c出于性能考虑,充分利用硬件每个numa节点对应的内存,避免多个进程并发访问同一块内存造成性能问题。GTM Proxy提供了线程池模型。可以按照NUMA Node为单位配置线程池,每个NUMA Node上可以指定1个或多个Proxy线程为此NUMA Node上的Backend服务。

在sysctl.conf配置文件中,线程池参数格式:

gtm_proxy_thread_attr = 'total_number_of_threads, total_number_of_groups,(bind_type: bind_ranges....)'
  • total_number_of_threads:所有的gtm proxy线程数量
  • total_number_of_groups:所有gtm proxy线程组的数量 (每个组内的线程数 =     total_number_of_threads / total_number_of_groups)
  • bind_type: 可选范围 {nobind, allbind, cpubind, nodebind} 分别表示:{不绑定,绑定所有,按照CPU绑定,按照NUMA绑定}。其中后2者,需要提供bind_ranges
  • bind_ranges:使用逗号分隔的范围,范围定义是begin-end。例如 (cpubind: 0-3, 8-11 )表示绑定到CPU0~3和8~11;(numabind:0-1,3)表示绑定到NUMA NODE 0~1,3

基于此优化,在每台机器的cn上添加配置,84、71上有4个numa节点,添加如下参数:

gtm_proxy_thread_attr='4,4,(nodebind:0-3)' 

85上有2个nuam节点,添加如下参数:

gtm_proxy_thread_attr='2,2,(nodebind:0-1)'

  (6)重启数据库后,再次进行TPCC 20分钟压测。

  (7)监测数据库各个节点20分钟,检查s_lock一直没有在出现。

通过增加 gtm_proxy_thread_attr等参数以上操作,能够有效消除s_lock热点函数,性能可以提升10%左右。

原文链接:https://www.gbase.cn/community/post/4217
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值