MySQL Insert语句单个批次数量过多导致的CPU性能问题分析
【问题】
最近有台服务器比较频繁的CPU报警,表现的特征有CPU sys占比偏高,大量慢查询,大量并发线程堆积。后面开发对insert的相关业务限流后,服务器性能恢复正常。
【异常期间线程处理情况】
下图是当时生产环境异常时抓取的信息,该事务正在执行insert,已经执行5秒,线程运行在innodb内核,状态是thread declared inside InnoDB,还有4906 tickets可用
统计了下有64个线程在innodb层,同时看到还有280个线程在排队等待进入innodb线程,状态是sleeping before entering InnoDB
innodb层的并发线程执行的SQL比较慢,产生了阻塞,导致了mysql的并发线程堆积。
【哪些SQL执行慢】
从正在执行的SQL中,看到了insert的慢查询SQL语句,统计了下这句SQL批量插入大于342条记录(SQL被截断)
【批量insert的性能测试】
类似这种批量的insert SQL会对MySQL性能造成影响吗,多大的批次比较合理呢,做了下面测试
在测试服务器上新建测试表(表结构同生产环境),并定义了5个插入脚本,分别为单条insert,每10条1个批次insert,每50条1个批次insert,每100条1个批次insert,每340条1个批次insert
用压测工具模拟512个并发线程的情况下,不同类型的SQL插入100W条记录服务器的性能情况,下表是压测统计
数据量 |
并发线程 |
执行时间(秒) |
每秒insert |
慢查询数量 |
Context switch |
CPU使用率 |
CPU sys占比 |
|
普通insert(1条) |
1000000 |
512 |
33 |
3W |
0 |
79W |
73% |
39% |
批量SQL(10条) |
1000000 |
512 |
23 |
4.3W |
0 |
49W |
78% |
56% |
批量SQL(50条) |
1000000 |
512 |
21 |
4.7W |
0 |
42W |
80% |
60% |
批量SQL(100条) |
1000000 |
512 |
15 |
6.6W |
20 |
53W |
70% |
45% |
批量SQL(340条) |
1000000 |
512 |
15 |
6.6W |
200 |
38W |
86% |
70% |
下图是批量SQL(340条)执行时的性能情况,可以看到当每100条记录一个批次执行insert时,开始出现慢查询,每340条1个批次执行insert时,在高并发的情况下,会产生大量的慢查询,这个现象接近于我们目前生产环境异常时的情况
【优化方案】
对于MySQL需要插入大量数据时,每次单条的insert性能较差,为了提升insert性能,我们采用了每批次多条记录同时insert的方法。
但当批次增大到一定数量时,在高并发访问的情况下,单个批次执行的性能会出现较大的下降,出现大量慢查询,并发线程堆积,CPU上升出现瓶颈, innodb层的并发线程处理被慢查询阻塞,后面只能通过限流来缓解性能问题。
根据上面的测试结论,建议控制热表单个批次insert的记录条数,最好单个批次控制在10条左右(因为即使调大到50条,插入性能没有大的提升,在高并发场景下,首先要保证当前SQL的执行性能)。
【优化后CPU告警消失,运行平稳】
MySQL Insert语句单个批次数量过多导致的CPU性能问题分析的更多相关文章
- 使用 xlrd 模块实现对excel 的读取、excel转json 、excel 转 mysql insert 语句
#-*- coding:utf-8 -*- # 处理 excel 中的 area 为 Mysql insert 语句 import xlrd, json, codecs, os # data = xl ...
- mysql INSERT语句 语法
mysql INSERT语句 语法 作用:用于向表格中插入新的行. 语法:INSERT INTO 表名称 VALUES (值1, 值2,....)或者INSERT INTO table_name (列 ...
- MySQL INSERT语句
insert的语法 INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [(col_name,...)] ...
- Mysql查询语句使用select.. for update导致的数据库死锁分析
近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁住获取数据的数据段,保证多台机器不拿到相同的数据. 我们My ...
- MySQL insert语句锁分析
最近对insert的锁操作比较费解,所以自己动手,一看究竟.主要是通过一下三个sql来看一下执行中的sql的到底使用了什么锁. select * from information_schema.INN ...
- Mysql insert语句的优化
1) 如果你同时从同一客户插入很多行,使用多个值表的INSERT语句.这比使用分开INSERT语句快(在一些情况中几倍). Insert into test values(1,2),(1,3), ...
- mysql insert语句错误问题解决
好久没有复习数据库了,竟然忘记了mysql中的关键字(保留字),导致今天一晚上都在查找sql语句错误,特此记录此错误,教训啊. 我在mysql数据库中有一个名为order 的表,啊啊啊啊啊,为啥我给他 ...
- 简例 一次执行多条mysql insert语句
package com.demo.kafka;import java.sql.Connection;import java.sql.DriverManager;import java.sql.Prep ...
- excel 里面拼接 MySQL insert 语句
="('"&A2&"',"&" '"&B2&"','"&C2&& ...
随机推荐
- Eclipse安卓插件安装
首先说明下载的ADT专门真安卓开发的Eclipse下载下来后就集成了可以直接使用了 但是使用j2EE版本的Eclipse就需要安装插件支持安卓开发了 首先下载ADT Eclipse安卓插件 下载完成后 ...
- 有用的Javascript,长期更新...
1,点击目标区域以外隐藏,运用场景:点击遮罩层,弹层关闭. // 点击目标区域以外隐藏 $(document).on("click", function (event) { var ...
- 最佳的MongoDB客户端管理工具
<最佳的MongoDB客户端管理工具> 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 一个好的MongoD ...
- .net WebService 大数据量时性能的提高
1.直接返回DataSet对象 [WebMethod(Description = "直接返回DataSet对象")] public DataSet GetUserListDateS ...
- 【bzoj4942】[Noi2017]整数 压位+线段树
题目描述 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 $x$ ,一开始为0. 接下来有 $n$ 个操作,每个操作都是以下两种类型中的一种: 1 a b :将 $x$ 加上整数 ...
- input新类型详解
http://www.webhek.com/post/html5-input-type.html
- Vue 项目添加 promise polyfill
1. 安装依赖 npm install es6-promise --save 2. 在 main.js 上面引入: import 'es6-promise/auto'
- 翻译:CommonJS的wiki
CommonJS的wiki资料原文 Modules/AsynchronousDefinition 异步定义的模块(国内一般叫AMD模块定义) STATUS: PROPOSAL 现状:提案 Implem ...
- 2016.5.19——vector型的输入输出
vector型的输入输出 在上节2015.5.18——leetcode:Majority Element中纠结vector的动态输入输出问题,但是发现vector传参型的不可以动态输入输出,但是vec ...
- 使用idea的的第一个坑-----javax.xml.ws.WebServiceRef
新建项目启动报错的时候,一直报这个错,类找不到,郁闷了半天,都没百度到结果,后来发现是添加tomcat的时候jre没 指定..... 哈哈哈,太懵逼了,指定就ok了