首页 > 数据库 >MYSQL 8 一个实例打开的表被那些参数和资源限制 分析

MYSQL 8 一个实例打开的表被那些参数和资源限制 分析

时间:2023-06-21 12:04:20浏览次数:45  
标签:-- cache 实例 参数 mysql table MYSQL size sysbench


MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_数据库

再开始这个问题之前,我们先的准备一下环境, mysql 8.027 8G 内存  SSD 磁盘 4核心CPU 。同时通过sysbench来对系统进行测试数据的填充。

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_java_02

首先安装sysbench 并通过下面的命令来对mysql test 数据库产生 10000万张表。

sudo sysbench /usr/share/sysbench/oltp_common.lua --mysql-host=192.168.198.101 --mysql-port=3306 --mysql-user=admin --mysql-password=Huayang3 --mysql-db=test  --tables=10000--table_size=1 prepare

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_数据库_03

在产生这些表后,就需要通过sysbench对其进行压测,在压测的过程中发现报错max_prepared_stmt_count 提出测试的过程中,测试中的无法进行线程的初始化。

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_数据库_04

sudo sysbench /usr/share/sysbench/oltp_read_only.lua --mysql-host=192.168.198.101 --mysql-port=3306 --mysql-user=admin --mysql-password=Huayang3 --mysql-db=test  --tables=100 --table_size=1 --threads=200 --time=1200 --report-interval=3 run

其中我们需要初始化 200个线程, 而默认的 max_prepared_stmt_count

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_java_05

的值是 16382.

也就是说我们要产生200个并发,默认的  max_prepared_stmt_count  16382的值无法满足我们。这个值是限制程序对数据库产生的prepare 语句的数量,同时也有方式通过一次性增加prepare 语句让数据库系统内存消耗出现问题。  这里我们调整值为 1000000  ,一百万测试可以正常进行

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_java_06

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_linux_07

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_java_08

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_mysql_09

我们将测试的线程更改为500  ,测试程序提示,太多连接数,无法承接,看来是有触发了之前有一篇文字中出现的问题,最大linux 句柄不修改,导致mysql无法修改max_connection的问题。这里我们修改linux的句柄。

/etc/security/limits.conf

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_python_10

修改完毕后,我们再次测试,这次直接将线程数改为3000

 sudo sysbench /usr/share/sysbench/oltp_read_only.lua --mysql-host=192.168.198.101 --mysql-port=3306 --mysql-user=admin --mysql-password=Huayang3 --mysql-db=test  --tables=500 --table_size=1 --threads=3000 --time=1000 --report-interval=3 run

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_java_11

测试开始20秒后,MYSQL8.027 直接被系统KILL 了。

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_linux_12

系统整体的出先问题的原因在于vm 已经占用了10G ,而内存才8G mysql 占用的内存太多,导致OOM

添加内存到16G, 将线程添加到3000 内存吃不消了,降到2000,测试勉强可以进行。但sysbench 报初始化线程超时, 经过查询,这里和table_open_cache 有关, 默认的cache 是 400 这里将cache 调整到 1000

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_mysql_13

在次测试,数据库直接又被KILL  vm的分配已经超过16G 了

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_linux_14

在此调整系统的参数 table_open_cache 到5000, 测试当中 100个表 1000个并发的情况下,我们的系统基本上已经处于无响应的状态了。

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_mysql_15

到这里暂时先总结一下,一个INSTANCE 可以打开表的数量与什么有关

1  与应用程序的并发度有关,与并发度有关的有

    1  table_open_cache  这里table_open_cache 与并发当中打开多少表的数量有关,实际上每个表在访问中,不会频繁的被打开,句柄是放到table_open_cache 当中. 系统设置的table open  cache 越大,可以并发中同时打开的表就越多。

需要注意的是,如果一个语句中包含多个表的访问,则一个语句就需要更多的tbale_open_cache.

   2 系统的内存,在mysql中打开每个连接都是需要内存的支持的,在刨除 innodb_buffer_pool  +  20% 后,就是我们数据库本身可以支持的连接内存,除以每个session  可能最大的内存使用量,计算后就是我们最保守的最大可以支持的连接数。

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_linux_16

SELECT ( @@read_buffer_size
+ @@read_rnd_buffer_size
+ @@sort_buffer_size
+ @@join_buffer_size
+ @@binlog_cache_size
+ @@thread_stack
+ @@tmp_table_size
+ 2*@@net_buffer_length
) / (1024 * 1024) AS MEMORY_PER_CON_MB;
3  打开的表的数量与LINUX 中文件的句柄有关

echo  6553560 > /proc/sys/fs/file-max
上面是临时生效方法,重启机器后会失效;
永久生效方法:
修改 /etc/sysctl.conf, 加入
fs.file-max = 6553560 重启生效
对单独的线程的控制打开文件的句柄数,上面的设置是针对整体的LINUX 系统打开句柄的数量

echo "* soft nofile 65535"  >> /etc/security/limits.conf
echo "* hard nofile 65535"  >> /etc/security/limits.conf

另有一些开大 open_table_cache 后产生的性能问题反馈,可以从下面的文字里有相关的介绍可以从下面的网址找到

https://www.percona.com/blog/2009/11/16/table_cache-negative-scalability/

MYSQL  8  一个实例打开的表被那些参数和资源限制 分析_mysql_17

标签:--,cache,实例,参数,mysql,table,MYSQL,size,sysbench
From: https://blog.51cto.com/u_14150796/6528064

相关文章

  • Win10本地计算机上的MySQL服务启动后停止,通用解决方案
    这问题一搜,CSDN都让删data文件夹????解决方案:1、查看启动错日志  很明显我这里是端口占用导致的(没动过配置文件,之前能用,突然起不来了,大概率是这个问题) 具体问题具体分析,搜报错信息比直接搜“MySQL服务启动后停止”靠谱一些......
  • Springboot api的controller如何接口一个List<Object>参数
    1.正常情况下,你可能会这样写:@PostMapping("/delete")@ApiOperation("Deletelistdata")@ResponseStatus(HttpStatus.OK)@ResponseBodypublicDBUpdateStatusdeleteTestCaseDatas(List<TestCaseInfo>testCaseInfoList){......
  • 解决IDEA中注释@param 参数名称不存在时提示报错
    File->Settings->Editor->Inspections搜索Javadoc,找到DeclarationhasproblemsinJavadocreferences将提示级别修改为Warning  ......
  • mysql分页
    本来是基础知识,但是今天才发现有两种写法,之前一直用简写,两种方法[偏移量OFFSET ]和[取出最大数据条数LIMIT ]两个数字位置有所区别,特此记录:1.完全体写法,先写数据条数,再写偏移量也有很多其他数据库也支持这种写法SELECT*FROMtableLIMITrowsOFFSEToffset;......
  • oracle和MySQL区别在大数据上体现
    原文,https://blog.csdn.net/weixin_39569543/article/details/111090287结论:阿里java开发手册禁止三张表join大数据量下使用join导致数据冗余更大,MySQL处理不了过大的数据量,Oracle可以正常处理......
  • Mysql数据库5.6版本安装
    5.6的软件包创建管理组mysql,创建用户解压·mysql的5.6版本移动到指定位置修改目录所有者优化mysql命令检查mysql版本修改主配置文件初始化mysql生成mysql服务控制文件添加到系统文件设置开机自启动启动mysqld并查看状态设置登录数据库密码登录数据库创建数据库查看数据库创建数据库......
  • MySQL 关于缓存的 “杂七杂八”
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。你是否可以想象如果MYSQL没有了innodb_buffer_pool是什么样子的情况,本期需要说说MYSQL的缓存,已经如何使用他更加有效用或者说性......
  • MySQL HeatWave 被添加了机器学习,甲骨文认真了
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。在开始说这个问题前,我们先了解一下什么是heatWave,MySQLHeatWave是Oracle在2020年推出的一个新服务,为MySQL数据库提供高性......
  • MySQL 8 如何解决快速获取数据库中所有业务库表列的distinct 值,不使用SQL
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。最近我们接到一个需求,在数据库内,无准确目标的寻找每个表中的字里面包含某些特殊字符的列。工作了快半辈子了,也是第一次听说这样......
  • MYSQL 8 中间字段有NULL 值,还是无法走索引,所以我高估了MYSQL 的查询智商
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql ,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。基于半瓶子咣当的状态,PG,MYSQL,POLARDB,MONGODB,REDIS还是都能舞刀弄枪几下的,但是这个弄这弄着,这记忆力就会不好,因为我一......