这几天我对比了mysql的最新官方版本percona-mysql-8.0.22与 kunlun-percona-mysql-8.0.18的性能,发现kunlun-percona-mysql的性能仍然全方位大大领先于percona-mysql-8.0.22。要知道在2020年6月我已经做过percona-mysql-8.0.18与kunlun-percona-mysql-8.0.18的性能对比,当时就是kunlun-percona-mysql的性能大大领先。现在半年多过去了,mysql最新官方版本的性能仍然没有显著改善。
根据过往的经验,mysql的性能问题是mysql官方版本造成的,而不是percona造成的。如果使用mysql-8.0.22由于没有线程池,连接数达到500特别是1000时性能已经惨不忍睹。另外截止本文撰写时(2021年2月初),mysql最新的版本mysql-8.0.23还没有percona版本,因此使用percona-mysql-8.0.22作为官方版本做性能对比测试。
测试配置
InnoDB表文件总size: 20GB, 20 个表, 每个表含有4百万行. innodb buffer pool size: 16GB。sysbench参数配置详见附录1.
update_non_index_xa测例全部使用两阶段提交的XA事务, oltp_xa测例使用95%的XA事务和5%的普通事务,在这些XA事务中20%使用一阶段提交,80%使用两阶段提交。
percona-mysql-8.0.22和kunlun-percona-mysql-8.0.18的数据库实例进程都使用完全相同的配置参数设置并且都使用了jemalloc库,并且都不挂备机。而且二者的程序文件都是在Ubuntu-20.04下build的release版本。
sysbench程序与mysql服务器运行在同一台机器上以便最小化网络开销。根据观察纯写入测试并没有用尽CPU所以这样的部署不影响测试结果。
用于测试的服务器有32GB DDR4 3200内存,CPU是8个物理核心,16个逻辑核心的AMDRyzen 7 3700X,存储使用2个NVME SSD,innodb redo日志文件以及数据文件存储在一个存储设备中,binlog文件存储在另一个存储设备中。
测试结果和对比
结果表格说明
NO. conns是指测例使用的sysbench连接数量;min,avg,max,95%分别是指最小延时,平均延时,最大延时,95%的语句的延时上限; r/w qps是指平均每秒执行的读写语句(select,update,delete,insert语句)数量;tps是指平均每秒执行的事务数量。
结果详情

结果分析
只使用500个连接做分析,因为1000个连接的情况下,延时普遍都是同版本同测例500个连接的约2倍,而qps并没有大的提升,说明500个连接时系统资源已经充分利用了,1000个连接的大量请求仅仅是排队了更久而已,反而不利于说明问题。本分析中使用的延时是95%语句的延时上限这个指标。
测试结果中的QPS的不同并不是因为执行DML(insert/delete/update/select)语句本身耗时不同(同类型的DML语句耗时基本相同,并且运行逻辑完全相同),而是因为执行事务提交的耗时不同。而QPS的计算方法是把一个sysbench测例执行的总的语句数量除以该sysbench测例运行的总秒数得出的,因而事务提交的时耗不同就导致了QPS结果的不同;TPS是用QPS除以该测例里面的DML语句数量得出的,因此我们只考虑QPS即可。
1. 非XA纯写入测例update_non_index和oltp,percona-mysql-8.0.22的QPS和TPS只有kunlun-percona-mysql-8.0.18的64%和53%,而且延时比kunlun-percona-mysql高42% 和 70%
2. XA纯写入测例update_non_index_xa 和 oltp_xa ,percona-mysql-8.0.22的QPS和TPS只有kunlun-percona-mysql-8.0.18的35%和42%,而延时达到了kunlun-percona-mysql的2.77倍!
3. 对于同一个纯写入测例update_non_index和oltp,percona-mysql-8.0.22的XA事务的QPS只有非XA事务QPS的34%(update_non_index) 和59%(oltp),而延时却分别是非XA事务的2.5倍和1.7倍;
4. 对于同一个纯写入测例update_non_index和oltp,kunlun-percona-mysql的XA事务的QPS达到非XA事务QPS的60%(update_non_index) 和72%(oltp),延时也只有非XA事务的1.33倍和1.02倍
5. 对于读写混合测试oltp read&write,kunlun-percona-mysql的XA事务的QPS达到非XA事务QPS的95%以上,延时也几乎相同。也就是说两者性能几乎完全相同。
6. 对于读写混合测试oltp read&write,percona-mysql-8.0.22的XA事务的QPS只有非XA事务QPS的2/3,延时是非XA事务的1.5倍。
7. 对于读写混合的XA测试,也就是oltp_xa read&write,percona-mysql-8.0.22的QPS和TPS只有kunlun-percona-mysql-8.0.18的45%,而延时达到了kunlun-percona-mysql的2.2倍!
8. 对于读写混合的非XA测试,也就是oltp read&write,percona-mysql-8.0.22的QPS和TPS只有kunlun-percona-mysql-8.0.18的61%,而延时是kunlun-percona-mysql的1.44倍。
附录
1. sysbench参数配置:./sysbench --max-time=300 --test=tests/db/update_non_index_xa.lua --mysql-host=192.168.0.105 --mysql-port=$port --mysql-db=test --oltp_tables_count=20 --oltp-table-size=4000000 --oltp-write-only=on --oltp-read-only=off --init-rng=on --num-threads=500 --max-requests=0 --oltp-dist-type=uniform --mysql-user='abc' --mysql-password='abc' --oltp_auto_inc=off --db-driver=mysql --oltp_use_xa_pct=100 --oltp_use_xa_2pc_pct=100 --report-interval=3




