sysbench压测时遇到max_prepared_stmt_count相关错误
参考文章: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 的基本工作流程:
- 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千万行。 - 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语句-->执行预编译语句 - 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相关错误相关推荐
- LoadRunner 11压测时碰到错误Error: missing newline in E:\xx\RCV.dat
HP LoadRunner 11 压力测试工具 脚本录制ok后进行加压测试, 报错信息 : Error: missing newline in E:\LR_test\RCV Transactions ...
- 05:Sysbench压测-innodb_deadlock_detect参数对性能的影响
目录 sysbench压测-innodb_deadlock_detect参数对性能的影响 一.OLTP测试前准备 二.进行OLTP测试 三.测试结果解读: 四.关于测试后的结论: 五.关于测试后的性能 ...
- 负载不变,响应时间随压测时间逐渐变长,TPS下降【性能分析】
出现这种情况,主要考虑和压测机.磁盘.日志的性能瓶颈 相关推荐: 1.服务器IO高问题定位和优化 2.Mysql数据库高CPU问题定位和优化 3.应用服务器CPU高性能定位和排查 4.负载增加,TPS ...
- 金蝶中间件部署报栈溢出_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒...
618大促演练进行了全链路压测,在此之前刚好我的热key探测框架也已经上线灰度一周了,小范围上线了几千台服务器,每秒大概接收几千个key探测,每天大概几亿左右,因为量很小,所以框架表现稳定. 借着这次 ...
- 关于压电式雨量传感器技术相关问答的回复
关于压电式雨量传感器技术相关问答的回复 很多用惯了翻斗式雨量传感器的便宜,可能对压电式雨量计的很多问题不是很清楚,这篇文章会就大家心里的疑问做出回答: 在解答之前,先带大家了解什么是压电式雨量传感器 ...
- 京东618大促压测时自研中间件暴露出的问题总结,压测级别数十万/秒
前天618大促演练进行了全链路压测,在此之前刚好我的热key探测框架(点击可跳转到开源地址)也已经上线灰度一周了,小范围上线了几千台服务器,每秒大概接收几千个key探测,每天大概几亿左右,因为量很小, ...
- Scrapy运行中常见网络相关错误
错误类型 错误名称 defer.TimeoutError 当延迟超时时,默认情况下会引发此错误(链接) TimeoutError 用户超时导致连接失败 DNSLookupError DNS查找失败 C ...
- 常见的 ChatGPT 相关错误提示及解决办法
我汇总了一些大家在使用 ChatGPT 过程中,可能会遇到的一些问题以及相关错误提示,大家可以根据遇到的情况查看解决办法. 注册登陆问题: 错误提示:Too many signups from the ...
- 接口压测时MySql对CPU占用过高
记录MySql过多占用CPU资源的排查过程及解决方案 场景: 1.需要对项目的接口进行压力测试 2.大部分接口压测是正常的 3.只有部分接口压测时MySql对CPU的占用达到90% 压测: 压测线 ...
最新文章
- 最新Java面试题2021年,常见面试题及答案汇总
- CTreeCtrl 控件实现多选并取得选中项
- 数据库:分布式事务的解决方案
- matlab可达性分析,毕业论文 Petri网系统的可达性研究
- 2016 linux发行版排行_选择困难症必看!云服务器如何选择操作系统,Windows和Linux哪个更好?...
- Java运行原理研究(未完待续)
- JS如何判断安卓还是iOS 一种比较被认同的方式
- bzoj1132:[POI2008]Tro
- SAP License:求职最受欢迎的十大技能
- 自动化wms仓储系统发展五个阶段?
- openwrt+php+not+found,openwrt路由翻车,等高手
- python简单代码-Python简单进程锁代码实例
- 【渝粤教育】国家开放大学2018年春季 0653-21T机电控制与可编程控制技术 参考试题
- asp.net 旅游网站 源码+配置文档
- 机器视觉中图像颜色识别理论
- 如何在单片机中用汇编优雅的点灯
- java中倒出pdf增加高宽_java – 如何扩展PDF的页面大小以添加水印...
- moses binarize-all问题
- 13、用 k8s 管理机密信息Secret、查看 Secret、volume 方式使用 Secret、环境变量方式使用 Secret、用 ConfigMap 管理配置
- 如何提高接收机的灵敏度
热门文章
- Python实战从入门到精通第十三讲——返回多个值的函数
- Pagerank-2
- 经典排序算法及其Python实现
- 找出两个字符串中所有共同的字符_面试中的两个字符串问题竟给我整懵了?!| 原力计划...
- python安装在哪个盘比较好_python编写器用哪个比较好?
- pte模拟考试_PTE猩际PC版-PTE猩际电脑版下载 v5.6.1--PC6电脑版
- python数据库管理软件_数据库管理工具神器-DataGrip,可同时管理多个主流数据库[SQL Server,MySQL,Oracle等]连接 - Python社区...
- java等待页面加载_java selenium (十三) 智能等待页面加载完成
- python接口自动化(十九)--Json 数据处理---实战(详解)
- python实时策略_Python策略模式