使用sysbench压力测试MySQL(二)

作者: admin 分类: 公众号存档            3 次浏览 发布时间: 2017-03-15 23:58

公众号:杨建荣的学习笔记 · 作者:杨建荣 · 发布:2017-03-15 23:58:51 · 原文链接

   昨天有了第一篇的测试之后,仅仅是一个开始。

   我接下来做sysbench压测的主要思路是根据现有的配置作出调整,能够持续性的优化和压力测试达到目的,而不是简单的去对比连接数在不同数量级会有多大的差别,所以你会在里面看到一些问题的排查,一些问题的解决,可能有些又不是压测相关的。

压测连接数300跑不上去

  我设置了max_connections为3000,但是压测的时候到了300个线程就跑不上去了。这个问题很有典型性。

sysbench抛出的错误如下:

FATAL: mysql_stmt_prepare() failed
FATAL: 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倍。

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注