searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

sysbench压力测试问题汇总

2023-04-10 07:59:57
158
0

一、Can't create more than max_prepared_stmt_count statements

问题原因:

mysql参数:
mysql>
show global status like 'com_stmt%';​
查看以下参数:
Com_stmt_close prepare语句关闭的次数
Com_stmt_execute prepare语句执行的次数
Com_stmt_prepare prepare语句创建的次数

mysql的原因:
Com_stmt_prepare 减去 Com_stmt_close 大于 max_prepared_stmt_count 就会出现这种错误。而max_prepared_stmt_count的取值范围:0 - 1048576,默认为16382

sysbench的原因:
sysbench初始化线程时会预编译SQL语句,但是语句时处于准备状态(Com_stmt_prepare),而这些语句在sysbench初始化所有线程完成前不会执行,所以prepare语句关闭的次数为0(Com_stmt_close),所以会出现这个问题。

解决方法:

1. 使用sysbench参数 --db-ps-mode=disable

使用--db-ps-mode参数并指定为disable,禁用预处理语句的模式。
通过`sysbench --help`查看。
 
2. 手动调整max_prepared_stmt_count参数
max_prepared_stmt_count的取值范围:0 - 1048576

sysbench中oltp_read_write.lua的默认预处理语句个数:`threads × (2 + 9 × tables)`;
其中那9条语句分别是 point-select、4 × range _ select、2 × update、 delete 和 insert。最上面两条为begin与commit语句。
 
SET GLOBAL max_prepared_stmt_count=...

另外如果sysbench过程中产生的预处理语句个数超过了max_prepared_stmt_count参数的最大值,那么可以适当减少表个数,或者通过其最大值来预先计算一下最大表的数量,以规避这个错误。
但是此方法仅临时有用,因为`Com_stmt_prepare`生成后,若sysbench产生报错,其不会减少而是会积累,若其突破了max_prepared_stmt_count的限制,那么仍会出现问题。

二、sysbench FATAL: error 2004: Can't create TCP/IP socket (24) FATAL:

 FATAL: error 2004: Can't create TCP/IP socket (24)
FATAL: `thread_init' function failed: /usr/local/share/sysbench/oltp_common.lua:356: connection creation failed
FATAL: /usr/local/share/sysbench/oltp_read_write.lua:22: module 'oltp_common' not found:
	no field package.preload['oltp_common']
	no file './oltp_common.lua'
	no file './oltp_common/init.lua'
	no file './src/lua/oltp_common.lua'
	no file '/root/.luarocks/share/lua/5.1/oltp_common.lua'
	no file '/root/.luarocks/share/lua/5.1/oltp_common/init.lua'
	no file '/root/.luarocks/share/lua/oltp_common.lua'
	no file '/root/.luarocks/share/lua/oltp_common/init.lua'
	no file '/usr/local/share/lua/5.1/oltp_common.lua'
	no file '/usr/share/lua/5.1/oltp_common.lua'
	no file '/usr/local/share/sysbench/oltp_common.lua'
	no file './oltp_common.so'
	no file '/root/.luarocks/lib/lua/5.1/oltp_common.so'
	no file '/root/.luarocks/lib/lua/oltp_common.so'
	no file '/usr/local/lib/lua/5.1/oltp_common.so'
	no file '/usr/lib/lua/5.1/oltp_common.so'
	no file '/usr/local/lib/sysbench'
FATAL: unable to connect to MySQL server on host '172.16.0.177', port 13306, aborting...
FATAL: error 2004: Can't create TCP/IP socket (24)
FATAL: `thread_init' function failed: /usr/local/share/sysbench/oltp_common.lua:356: connection creation failed
FATAL: Threads initialization failed!

解决方法:

`ulimit -a`
调整openfile大小
`ulimit -n 65535`
 

三、PANIC: unprotected error in call to Lua API (not enough memory)

PANIC: unprotected error in call to Lua API (not enough memory)
FATAL: `thread_init' function failed: not enough memory
原因:sysbench的LuaJIT组件最多分配了2G内存
解决:
使用sysbench 1.1.0-df89d34
 
sysbench1.1编译安装:
参考:
> [sysbench1.1编译安装](https://github.com/akopytov/sysbench#build-and-install)
> 缺少依赖可以先用[centos安装sysbench](https://github.com/akopytov/sysbench#rhelcentos)安装一下依赖

编译sysbench1.1过程:
Github编译失败缺少mysqlclient

可以先从github用yum包装,或者下载mysqlclient库
在编译在sysbench/src/sysbench得到1.1
 

四、FATAL: Worker threads failed to initialize within 30 seconds!

sysbench线程初始化时间超过30s,sysbench默认最多初始化为30s

解决方法:

1. 使用sysbench1.1的`--thread-init-timeout=N`参数调整,安装sysbench1.1见上
2. 修改sysbench源码修改宏定义,并重新编译
 

五、sysbench过程中报错,原因mysql中打开的表太多了,具体报错忘了

问题原因:

mysql中有个参数table_open_cache用来限制mysql引擎能够打开的最大表数

解决方法:

调整mysql的参数table_open_cache
`set global table_open_cache=65535`
 

六、mysql error 110_ERROR 2003 (HY000): Can't connect to MySQL server on 'x.x.x.x' (110)

主要就是连不上mysql数据库

可能原因:

1. 网络不通
   * 可以尝试`ping ip`看server端网络情况
2. 端口不能访问
   * 可以尝试`telnet ip port`,查看端口是否开放
3. mysql连接数到达最大值
   * 尝试查看mysql错误日志
   * 尝试调整mysql的`max_connections`参数
   * vpc通道限制
 
 
0条评论
0 / 1000
qinyl
3文章数
0粉丝数
qinyl
3 文章 | 0 粉丝