MySQL 压测
https://mp.weixin.qq.com/s/vKJZp5cGUetHokGh2EZUXg
mysqlslap --iterations=100 --create-schema=‘test‘ --query="query.sql" --number-of-queries=20000 --delimiter=";" --concurrency=100
3.2.2 网络参数问题
问题描述
使用 mysqlslap 压测某个语句,当并发数提升到200或400时,CDB性能下降,不符合业务预期。
排查过程
这里只和高并发有关,CDB团队首先想到的是MySQL是否开启了thread pool功能,对于CDB和自建均未开启thread pool功能,而在CDB上打开了thread pool功能后问题仍然存在。而且在本地和远程压测都存在同样问题,这也排除了网络的因素。
有一个细节是CDB团队观察到压测过程中数据库的连接数并不稳定,忽上忽下,就开始怀疑是mysqlslap压测工具的问题。于是CDB团队开始查看mysqlslap源码, 确认mysqlslap用的是否是短连接。然而mysqlslap用的是长连接,并不是短连接。但有一种情况,当mysqlslap执行完一轮(number_of_querys)语句后会新建连接。当压测参数iterations设置较大,number_of_querys较小,并且调大并发数时,每个连接执行的语句相对就少了。也就是说,当并发数增大时,压测过程中的新建连接增加了。为了验证这个问题, CDB团队调大压测参数number_of_querys后,压测性能就上去了。
到这里,问题可以归结为大量建立连接影响了性能。于是CDB团队开始查找TCP相关系统参数的区别,通过修改主机参数tcp_rmem/tcp_wmem/tcp_max_syn_backlog/somaxconn,解决了高并发下的性能下降问题。
问题原因
mysqlslap的实现方式是每次迭代都后重新建立连接,即所有客户端执行完number_of_queries数量的SQL后会重新建连连接,当并发增加时,每个客户端执行的sql相对较少,mysqlslap这种长连接测试方式退化类似于短连接的测试方式,而CDB主机对短连接处理的不是特别好。解决方案
修改主机参数, 提高了建立连接效率
tcp_rmem="4096 873800 4194304" (原"4096 87380 4194304", TCP receive memory buffers)
tcp_wmem = "4096 163840 4194304" (原"4096 16384 4194304", TCP send memory buffers)
tcp_max_syn_backlog=3240000 (原4096, sync queue size)
somaxconn = 2048(原128, accept queue size)
方案效果
通过优化腾讯云CDB主机参数tcp_rmem/tcp_wmem/tcp_max_syn_backlog/somaxconn,解决了通过短连高并发下的性能下降问题。