参考文章:https://zhuanlan.zhihu.com/p/67188414

问题现象:报错 FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)

sysbench压测异常终止

问题引入

在做压力测试的时候,我使用了sysbench 1.1.0-faaff4f版本,测试命令如下:

sysbench oltp_read_only.lua --mysql-host=*.*.*.* --mysql-port=3306 --mysql-user=root --mysql-password=1234 --tables=10 --table-size=10000000 --time=600 --report-interval=10 --threads=1024 prepare

问题主要出现在这个--threads身上,我的压测线程数增长是从 1,2,4,8,16,32,64,128,256,512,1024,在1024前压测都是没有问题了,但当线程数增长到了1024后,sysbench 报错了。

FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"

这个问题很好解决,上网一查就知道怎么解决,登录mysql,调整这个变量值的大小即可。

mysql> show global status like 'com_stmt%';

查看如下3个参数值:

Com_stmt_close prepare语句关闭的次数

Com_stmt_execute prepare语句执行的次数

Com_stmt_prepare prepare语句创建的次数

Com_stmt_prepare 减去 Com_stmt_close 大于 max_prepared_stmt_count 就会出现这种错误。那么我们手动调高max_prepared_stmt_count(取值范围:0 - 1048576,默认16382)即可解决

mysql> set global max_prepared_stmt_count=500000;

那这里就容易再次引发一个问题,我们设置max_prepared_stmt_count为50万,但是我们其实现在是知其然不知其所以然,max_prepared_stmt_count是干什么的,为什么会超过默认值这个才是我们真正应该关心的。

max_prepared_stmt_count基本介绍

这个参数是MySQL的一个基本参数,其是用来限制一个session内最多可以有多少条预编译语句,什么是sql的预编译,下面这篇文章讲得很好,网上也有很多参考,大家可以直接查。

https://www.cnblogs.com/geaozhang/p/9891338.html

那为什么我们会超过max_prepared_stmt_count的默认大小16382呢?下面我们就先来介绍一下sysbench工具中关于压测数据库的lua脚本。

sysbench 压测数据库的lua脚本个人理解

sysbench官方默认帮我们配置了默认压测数据库的脚本:

这几个脚本里面的功能我们简单说明一下:

oltp_common.lua 脚本是提供给其他脚本如oltp_read_only.lua调用的,是基本的一系列函数。oltp_read_only.lua 主要的工作根据压测需求来调用oltp_common.lua中的函数。

sysbench 的基本工作流程:

  1. prepare:
    sysbench oltp_read_only.lua --mysql-host=x.x.x.x --mysql-port=3306 --mysql-user=root --mysql-password=password --tables=10 --table-size=10000000 --threads=1024 prepare
    这个语句的基本作用就是调用建表语句,建立十张表,每张表大小1千万行。
  2. run:
    sysbench oltp_read_only.lua --mysql-host=10.191.1.235 --mysql-port=6446 --mysql-user=root --mysql-password=vm000 --tables=10 --table-size=10000000 --threads=1024 --time=600 --report_interval=10 run
    这个的过程实际是:建立数据库连接-->预编译SQL语句-->执行预编译语句
  3. cleanup:
    sysbench oltp_read_only.lua --mysql-host=x.x.x.x --mysql-port=3306 --mysql-user=root --mysql-password=password --tables=10 --table-size=10000000 --threads=1024 cleanup
    这里的实际过程是:直接将数据库的表drop掉。

从第二步run 我们就可以知道我们为什么会出现超过max_prepared_stmt_count的默认大小16382的报错了。我们先来看一下oltp_read_only.lua代码内容:

这里面函数 function prepare_statements()中的两个if判断结果均为true,这个是因为在默认情况下oltp_common.lua中已经指定skip_trx=false, range_selects=true

oltp_common.lua

所以这里一共需要调用7个预编译函数:

prepare_point_selects()

prepare_begin()

prepare_commit()

prepare_simple_ranges()

prepare_sum_ranges()

prepare_order_ranges()

prepare_distinct_ranges()

因为我们一共有10张表,相对于每一张表都需要执行7个预编译语句,所以我们可以计算:

在512个线程并发下,每一个线程我们可以视之为一个用户,每一个用户需要在每一张表上预编译7条SQL语句,所以一共prepare的语句是:

Com_stmt_prepare = 512 * 10 * 7 = 35840 > 16382(max_prepared_stmt_count statements 默认16382)

所以就出现上面的错误:

FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"

这个是一个大概的推测值,因为实际执行时还会有出入。这个数字可以方便我们在出现上面问题后,设置max_prepared_stmt_count_statements的值有一个参考的方向,而不是盲目地设置成最大。

以上仅是个人的见解,如果有什么出错的,请大佬们指正,谢谢。

sysbench压测时遇到max_prepared_stmt_count相关错误相关推荐

  1. LoadRunner 11压测时碰到错误Error: missing newline in E:\xx\RCV.dat

    HP LoadRunner 11 压力测试工具 脚本录制ok后进行加压测试, 报错信息 :  Error: missing newline in E:\LR_test\RCV Transactions ...

  2. 05:Sysbench压测-innodb_deadlock_detect参数对性能的影响

    目录 sysbench压测-innodb_deadlock_detect参数对性能的影响 一.OLTP测试前准备 二.进行OLTP测试 三.测试结果解读: 四.关于测试后的结论: 五.关于测试后的性能 ...

  3. 负载不变,响应时间随压测时间逐渐变长,TPS下降【性能分析】

    出现这种情况,主要考虑和压测机.磁盘.日志的性能瓶颈 相关推荐: 1.服务器IO高问题定位和优化 2.Mysql数据库高CPU问题定位和优化 3.应用服务器CPU高性能定位和排查 4.负载增加,TPS ...

  4. 金蝶中间件部署报栈溢出_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒...

    618大促演练进行了全链路压测,在此之前刚好我的热key探测框架也已经上线灰度一周了,小范围上线了几千台服务器,每秒大概接收几千个key探测,每天大概几亿左右,因为量很小,所以框架表现稳定. 借着这次 ...

  5. 关于压电式雨量传感器技术相关问答的回复

    关于压电式雨量传感器技术相关问答的回复 很多用惯了翻斗式雨量传感器的便宜,可能对压电式雨量计的很多问题不是很清楚,这篇文章会就大家心里的疑问做出回答: 在解答之前,先带大家了解什么是压电式雨量传感器  ...

  6. 京东618大促压测时自研中间件暴露出的问题总结,压测级别数十万/秒

    前天618大促演练进行了全链路压测,在此之前刚好我的热key探测框架(点击可跳转到开源地址)也已经上线灰度一周了,小范围上线了几千台服务器,每秒大概接收几千个key探测,每天大概几亿左右,因为量很小, ...

  7. Scrapy运行中常见网络相关错误

    错误类型 错误名称 defer.TimeoutError 当延迟超时时,默认情况下会引发此错误(链接) TimeoutError 用户超时导致连接失败 DNSLookupError DNS查找失败 C ...

  8. 常见的 ChatGPT 相关错误提示及解决办法

    我汇总了一些大家在使用 ChatGPT 过程中,可能会遇到的一些问题以及相关错误提示,大家可以根据遇到的情况查看解决办法. 注册登陆问题: 错误提示:Too many signups from the ...

  9. 接口压测时MySql对CPU占用过高

    记录MySql过多占用CPU资源的排查过程及解决方案 场景: 1.需要对项目的接口进行压力测试 2.大部分接口压测是正常的 3.只有部分接口压测时MySql对CPU的占用达到90%   压测: 压测线 ...

最新文章

  1. 最新Java面试题2021年,常见面试题及答案汇总
  2. CTreeCtrl 控件实现多选并取得选中项
  3. 数据库:分布式事务的解决方案
  4. matlab可达性分析,毕业论文 Petri网系统的可达性研究
  5. 2016 linux发行版排行_选择困难症必看!云服务器如何选择操作系统,Windows和Linux哪个更好?...
  6. Java运行原理研究(未完待续)
  7. JS如何判断安卓还是iOS 一种比较被认同的方式
  8. bzoj1132:[POI2008]Tro
  9. SAP License:求职最受欢迎的十大技能
  10. 自动化wms仓储系统发展五个阶段?
  11. openwrt+php+not+found,openwrt路由翻车,等高手
  12. python简单代码-Python简单进程锁代码实例
  13. 【渝粤教育】国家开放大学2018年春季 0653-21T机电控制与可编程控制技术 参考试题
  14. asp.net 旅游网站 源码+配置文档
  15. 机器视觉中图像颜色识别理论
  16. 如何在单片机中用汇编优雅的点灯
  17. java中倒出pdf增加高宽_java – 如何扩展PDF的页面大小以添加水印...
  18. moses binarize-all问题
  19. 13、用 k8s 管理机密信息Secret、查看 Secret、volume 方式使用 Secret、环境变量方式使用 Secret、用 ConfigMap 管理配置
  20. 如何提高接收机的灵敏度

热门文章

  1. Python实战从入门到精通第十三讲——返回多个值的函数
  2. Pagerank-2
  3. 经典排序算法及其Python实现
  4. 找出两个字符串中所有共同的字符_面试中的两个字符串问题竟给我整懵了?!| 原力计划...
  5. python安装在哪个盘比较好_python编写器用哪个比较好?
  6. pte模拟考试_PTE猩际PC版-PTE猩际电脑版下载 v5.6.1--PC6电脑版
  7. python数据库管理软件_数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接 - Python社区...
  8. java等待页面加载_java selenium (十三) 智能等待页面加载完成
  9. python接口自动化(十九)--Json 数据处理---实战(详解)
  10. python实时策略_Python策略模式