原文链接: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技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。