使用sysbench压力测试MySQL(二)
公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2017-03-15 23:58:51 · 原文链接
昨天有了第一篇的测试之后,仅仅是一个开始。
我接下来做sysbench压测的主要思路是根据现有的配置作出调整,能够持续性的优化和压力测试达到目的,而不是简单的去对比连接数在不同数量级会有多大的差别,所以你会在里面看到一些问题的排查,一些问题的解决,可能有些又不是压测相关的。
压测连接数300跑不上去
我设置了max_connections为3000,但是压测的时候到了300个线程就跑不上去了。这个问题很有典型性。
sysbench抛出的错误如下:
FATAL: mysql_stmt_prepare() failedFATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"FATAL: `thread_init' function failed: /usr/local/share/sysbench/oltp_common.lua:282: SQL API errorMySQL的错误日志信息如下:
2017-03-14T15:01:57.839154Z 348 [Note] Aborted connection 348 to db: 'sysbenchtest' user: 'root' host: 'localhost' (Got an error reading communication packets)2017-03-14T15:01:57.839185Z 346 [Note] Aborted connection 346 to db: 'sysbenchtest' user: 'root' host: 'localhost' (Got an error reading communication packets)看起来两者关联不大,所以有些信息就会有一些误导了。
根据错误的信息,当前的参数max_prepared_stmt_count设置值为16382,是安装后的默认值。
mysql> show variables like 'max_prepared_stmt_count';+-------------------------+-------+| Variable_name | Value |+-------------------------+-------+| max_prepared_stmt_count | 16382 |+-------------------------+-------+而packet的参数设置为4M的样子,也是默认值
mysql> show variables like '%pack%';+--------------------------+------------+| Variable_name | Value |+--------------------------+------------+| max_allowed_packet | 4194304 || slave_max_allowed_packet | 1073741824 |+--------------------------+------------+到底是不是参数max_allowed_packet引起的呢,我们可以简单模拟一下。
set global max_allowed_packet=33554432;
然后继续运行sysbench脚本:
sysbench /home/sysbench/sysbench-1.0.3/src/lua/oltp_read_write.lua --mysql-user=root --mysql-port=3306 --mysql-socket=/home/mysql/s1/s1.sock --mysql-host=localhost --mysql-db=sysbenchtest --tables=10 --table-size=5000000 --threads=200 --report-interval=5 --time=10 run
结果还是抛出了同样的错误,这也就间接证明了这个问题和这个参数无关,所以我恢复了原来的设置。
然后我们继续调整这个参数max_prepared_stmt_count,把值从16382调整到30000
set global max_prepared_stmt_count=30000;然后再次运行200个线程,就可以看到没问题了,运行过程中我们可以使用show global status的方式来查看这个值的变化,这个参数的主要含义是应对瞬间新建的大量prepared statements,通过max_prepared_stmt_count 变量来控制,这个值是怎么算出来的,还需要细细挖挖。
mysql> show global status like 'Prepared_stmt_count';+----------------------------+----------+| Variable_name | Value |+----------------------------+----------+| Prepared_stmt_count | 18200 |+----------------------------+----------+执行完200个线程后,继续300个,打算以此类推,一直到1000个线程。
执行300个线程的时候,抓取了一下这个参数值,发现已经快溢出了。
mysql> show global status like '%stmt%';+----------------------------+----------+| Variable_name | Value |+----------------------------+----------+| Prepared_stmt_count | 27300 |+----------------------------+----------+所以自己简单做了个计算,
200个线程参数值为 18200
300个线程参数值为 27300
通过简单的计算可以看出100个线程对应参数值9100,按照这个参数设置,我要运行500个线程,30000这个参数值是肯定不够的。很快就验证了我的这个想法,抛出错误了。所以我调整了参数值为100000,在900个线程都没有任何问题。
这是分别对应50个,300个,500个线程时候的TPS测试结果,QPS基本是TPS的20倍。

