开发者
资源
mysql性能优化案例
mysql性能优化案例
发表于2022/10/18
2191

问题背景描述

使用sysbench对mysql5.7.21进行256并发压测时,x86下TPS为10685,Kunpeng920 下压测结果为4197,性能较原有X86环境下有较大差距。

问题分析过程

Top命令查看cpu资源使用情况

执行脚本进行压测时发现,top命令下mysql进程cpu使用率6000%左右,其中系统调用占用较高,为进一步明确mysql进程在执行哪些过程进行perf 热点函数和火焰图分析。

perf命令查看热点函数

通过在压测过程中执行perf top命令,查看到相关函数调用较高:

1.png

进一步明确分析函数调用栈关系,使用perf record命令抓取一段时间perf 数据,进行解析后生成相应火焰图:

2.png

分析发现mysql中调用的热点函数MVCC::view_open和PolycyMutex_在底层调用的是spin_lock相关函数,进而导致系统调用高,大量线程都在进行自旋空转,消耗cpu资源。

问题解决措施及结果

修改Mysql源码中CacheLine(可选优化项)

通过github上mysql相关issue发现,在mysql中存在对cacheLine的硬编码现象,mysql中cachline大小是适配X86平台的为64字节,Kunpeng 920下cacheLine为128字节。可参考以下issue链接https://github.com/mysql/mysql-server/pull/66/files对mysql源码进行修改,此措施可获得相应的性能提升。

Cacheline机制理解:

CPU标识Cache中的数据是否为有效数据不是以内存位宽为单位,而是以Cacheline为单位。这个机制可能会导致伪共享(false sharing)现象,从而使得CPU的Cache命中率变低。出现伪共享的常见原因是高频访问的数据未按照Cacheline大小对齐,而在高并发压测mysql时,其中加锁的全局变量或数据一般是在高频的访问,这就可能导致性能的下降。(对于高频访问的锁变量,实际是对锁变量进行高频的读写操作,容易发生伪共享问题)

修改mysql数据库配置参数

Mysql中主要影响spin_lock相关性能参数的主要有:innodb_thread_concurrency、innodb_spin_wait_delay、innodb_sync_spin_loops。其中nnodb_thread_concurrency推荐设置为cpu的核心数,通过上调innodb_spin_wait_delay和innodb_sync_spin_loops参数,同时使用perf top命令观测MVCC::view_open和PolycyMutex_热点函数使用率,当使用率下降到合理范围内时,即达到预期效果。

由于原子操作在x86和kunpeng 920平台上的实现存在差异,加上kunpeng920的核心数较多,导致在mysql高并发压测时出现了spin_lock相关系统调用较高,通过相应的mysql参数优化即可实现性能提升,结合Mysql下相关自旋锁的代码实现,可更好的理解这两个参数的作用,参考链接如下:

https://blog.csdn.net/sun_ashe/article/details/81291347

优化后测试结论

通过对mysql的相关优化,最终在256并发下,kunpeng 920上TPS达到了11700,优于原X86压测结果(TPS 10685)。

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞