innodb_thread_concurrency参数的作用是控制InnoDB并发线程上限。当并发线程数达到这个值,InnoDB在接收新请求时就会进入等待状态,直到有线程退出。

所以场景里session D的select 1能执行成功,但实际实例已无法查询。

InnoDB将该参数的默认值设为0,但不限制并发线程数实际上是不行的,因为一个机器的CPU核数有限,线程全进来会有很大的上下文切换成本。通常情况下,建议把该值设为64-128之间的值。

这里可能会产生几个疑问。第一,线上的并发连接数动不动就上千了,设置为128有什么用?

这是搞混了并发连接和并发查询。在show processlist结果里,看到的几千个连接指的是并发连接,而当前正在执行的语句才是并发查询。并发连接数达到几千个影响并不大,只是多占一些内存,而并发查询高会造成CPU占用高,因此需要加以控制。

第二,当出现同一行热点更新,由于会等待锁,128是否会很快消耗完,系统是否会挂?

这也是不会的,在线程进入锁等待后,并发线程的计数会减1,即等行锁(包括间隙锁)的线程是不算在128里的。

这个设计是必须的,否则可能整个系统锁死。假设处于锁等待的线程也占并发线程的计数,设想:

线程1执行begin;update t set c=c+1 where id=1,启动事务trx1,然后保持该状态。此时线程处于空闲状态,不算在并发线程里;

线程2到线程129执行update t set c=c+1 where id=1,由于等行锁而进入等待状态,这样就有128个线程处于等待状态;

如果处于锁等待状态的线程计数不减1,InnoDB会认为线程数用满,阻止其他语句进入引擎执行,那么线程1将不能提交事务,而其他128个线程又处于锁等待,整个系统堵住。

该例子里InnoDB不能响应任何请求,但CPU占用却是0,明显不合理。

而如果真正执行查询,比如之前例子三个事务的select sleep(100) from t,是要算进并发线程的计数的。

该部分主要说明,使用select 1会有问题,因此使用select 1进行判断的逻辑需要修改。

查表判断

为了能检测并发线程数过多导致的系统,需要找一个访问InnoDB的场景。可以在系统库里建一个表(比如命名为check),里面只放一行数据,然后定期执行:

select * from mysql.check;

使用该方法,可以检测出由于并发线程过多导致的数据库不可用的情况。但假如binlog所在磁盘的空间占用率达到100%,那么所有更新语句和事务提交的commit语句都会被堵住,但系统仍能正常读数据,此时这种方法失效。

更新判断

可以把上面的查询改为更新,比如:

update mysql.check set t_modified=now();

节点可用性检测包括主库和备库,由于一般会把主库A和备库B的主备关系设为双M结构,所以在备库B上执行的检测命令也要发回给主库A,此时如果都用相同的更新命令就可能出现行冲突,导致主备同步停止。所以,此时表里不能只有一行数据:

mysql> CREATE TABLE `check` (

`id` int(11) NOT NULL,

`t_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;

/* 检测命令 */

insert into mysql.check(id, t_modified) values (@@server_id, now()) on duplicate key update t_modified=now();

更新判断存在“判定慢”的问题。所有的检测逻辑都需要一个超时时间N,执行一条更新语句,超过N秒后还不返回,就认为系统不可用。设想一个日志盘的IO利用率已经是100%的场景,此时整个系统响应很慢,已经需要做主备切换了。但我们检测使用的update命令需要的资源很少,是有可能在拿到IO资源时提交成功,并且在超时时间N秒未到达之前就返回给检测系统的。

那么就会出现:业务系统上正常SQL已经执行很慢,但检测系统由于update命令没超时得到“系统正常结论的情况。

之所以出现这个现象,根本原因是上面说的方法都是基于外部检测的,天然有随机性的问题,因为外部检测都需要定时轮询,所以系统可能已经出问题了,但是却需要等到下一个检测发起执行语句的时候,才有可能发现问题。而且,如果运气不好,可能第一次轮询还不能发现,就会导致切换慢的问题。

内部统计

针对磁盘利用率的问题,如果MySQL可以告诉我们内部每一次IO请求的时间,那判断数据库是否出问题的方法就会可靠许多。

MySQL 5.6版本以后提供的performance_schema库,就在file_summary_by_event_name表里统计了每次IO请求的时间。该表里有很多行数据,先看event_name='wait/io/file/innodb/innodb_log_file'这一行:

该行表示统计的是redo log的写入时间,第一列EVENT_NAME表示统计的类型,接下来三组数据显示的是redo log操作时间统计。

第一组五列是所有IO类型的统计,COUNT_STAR是所有IO的总次数,下面四列是具体统计项。

第二组六列是读操作的统计,SUM_NUMBER_OF_BYTES_READ统计的是总共从redo log里读了多少字节。

第三组六列是写操作的统计,第四组是对其他类型数据的统计。uOsM.uvwxy.info
wap.qKoI.uvwxy.info
itkU.uvwxy.info
wap.ySwQ.uvwxy.info
CgAe.uvwxy.info
wap.8c6a.uvwxy.info
D4om.uvwxy.info
wap.GkEi.uvwxy.info
2W0U.uvwxy.info
wap.ySwQ.uvwxy.info
EIwG.uvwxy.info
wap.uhoY.uvwxy.info
ImGk.uvwxy.info
wap.EiCg.uvwxy.info
7H8s.uvwxy.info
wap.MqKo.uvwxy.info
7b5Z.uvwxy.info
wap.3X1V.uvwxy.info
FjDh.uvwxy.info
wap.Bf9d.uvwxy.info
3E5p.uvwxy.info
wap.JnHl.uvwxy.info
X1Vz.uvwxy.info
wap.TxRv.uvwxy.info
FJxH.uvwxy.info
wap.OCJ3.uvwxy.info
pJnH.uvwxy.info
wap.lFjD.uvwxy.info
eofP.uvwxy.info
wap.tNrL.uvwxy.info
fjNh.uvwxy.info
wap.L8Fz.uvwxy.info
EEEm.uvwxy.info
wap.MWN7.uvwxy.info
cgJd.uvwxy.info
wap.H5Cw.uvwxy.info
iCgA.uvwxy.info
wap.e8c6.uvwxy.info
qKoI.uvwxy.info
wap.mGkE.uvwxy.info
4epg.uvwxy.info
wap.uOsM.uvwxy.info
Ae8c.uvwxy.info
wap.6a4Y.uvwxy.info
ImGk.uvwxy.info
wap.EiCg.uvwxy.info
SwQu.uvwxy.info
wap.OsMq.uvwxy.info
AiMg.uvwxy.info
wap.K7Ey.uvwxy.info
kEiC.uvwxy.info
wap.gAe8.uvwxy.info
tNrK.uvwxy.info
wap.oImG.uvwxy.info
hsjT.uvwxy.info
wap.xRvP.uvwxy.info
hBf9.uvwxy.info
wap.d7b5.uvwxy.info
BVgX.uvwxy.info
wap.HlFD.uvwxy.info
VzTx.uvwxy.info
wap.RvPt.uvwxy.info
d7b5.uvwxy.info
wap.Z3X1.uvwxy.info
ptXr.uvwxy.info
wap.VIP9.uvwxy.info
RvPt.uvwxy.info
wap.rLpJ.uvwxy.info
Qkul.uvwxy.info
wap.VzTx.uvwxy.info
jDhB.uvwxy.info
wap.f9d7.uvwxy.info
9QT7.uvwxy.info
wap.R5sz.uvwxy.info
riSw.uvwxy.info
wap.QuOs.uvwxy.info
Ae8c.uvwxy.info
wap.6a42.uvwxy.info
ImGk.uvwxy.info
wap.EiCg.uvwxy.info
SwQu.uvwxy.info
wap.OsMq.uvwxy.info
Qlvm.uvwxy.info
wap.W0Uy.uvwxy.info
GkEi.uvwxy.info
wap.gAe8.uvwxy.info
fw0e.uvwxy.info
wap.ycPW.uvwxy.info
2W0U.uvwxy.info
wap.ySwQ.uvwxy.info
b1sc.uvwxy.info
wap.6a4Y.uvwxy.info
NLpJ.uvwxy.info
wap.nHlF.uvwxy.info
9n6k.uvwxy.info
wap.YfPt.uvwxy.info
9d7b.uvwxy.info
wap.5Z3X.uvwxy.info
1lFj.uvwxy.info
wap.DhBf.uvwxy.info
xRvP.uvwxy.info
wap.tNrL.uvwxy.info
FtDr.uvwxy.info
wap.eFzT.uvwxy.info
FjDh.uvwxy.info
wap.Bf9d.uvwxy.info
NrLp.uvwxy.info
wap.JnHl.uvwxy.info
1VzT.uvwxy.info
wap.xRvP.uvwxy.info
ge8b.uvwxy.info
wap.5Z3X.uvwxy.info
UfWG.uvwxy.info
wap.kEiC.uvwxy.info
epgQ.uvwxy.info
wap.uOsM.uvwxy.info
8c6a.uvwxy.info
wap.4Y2W.uvwxy.info
KO2M.uvwxy.info
wap.znue.uvwxy.info
QuOs.uvwxy.info
wap.MqoI.uvwxy.info
FPG0.uvwxy.info
wap.UySw.uvwxy.info
iCgA.uvwxy.info
wap.e8c6.uvwxy.info
XhYI.uvwxy.info
wap.mGkE.uvwxy.info
W0US.uvwxy.info
wap.wQuO.uvwxy.info
jmQk.uvwxy.info
wap.OCI2.uvwxy.info
JnHl.uvwxy.info
wap.FjDh.uvwxy.info
n7I9.uvwxy.info
wap.tNrL.uvwxy.info
8fjN.uvwxy.info
wap.hK8F.uvwxy.info
nHlF.uvwxy.info
wap.jDhB.uvwxy.info
vPtN.uvwxy.info
wap.rLpJ.uvwxy.info
3X1V.uvwxy.info
wap.zTxR.uvwxy.info
SjnR.uvwxy.info
wap.lPCJ.uvwxy.info
LpJn.uvwxy.info
wap.lFjD.uvwxy.info
AKBv.uvwxy.info
wap.PtNr.uvwxy.info
e8c6.uvwxy.info
wap.a4Y2.uvwxy.info
mGkE.uvwxy.info
wap.iCgA.uvwxy.info
alcM.uvwxy.info
wap.qKoI.uvwxy.info
a4Y2.uvwxy.info
wap.W0Uy.uvwxy.info
mqUo.uvwxy.info
wap.RFM6.uvwxy.info
sMqK.uvwxy.info
wap.oImG.uvwxy.info
qBLC.uvwxy.info
wap.wQuO.uvwxy.info
O8ca.uvwxy.info
wap.4Y2W.uvwxy.info
KoIm.uvwxy.info
wap.GkEi.uvwxy.info
6k4i.uvwxy.info
wap.VcMq.uvwxy.info
7b5Z.uvwxy.info
wap.3X1V.uvwxy.info
FjDh.uvwxy.info
wap.Bf9d.uvwxy.info
tNrL.uvwxy.info
wap.pJnH.uvwxy.info
Pjul.uvwxy.info
wap.VzTx.uvwxy.info
hBf9.uvwxy.info
wap.d7b5.uvwxy.info
rLpJ.uvwxy.info
wap.nHlF.uvwxy.info
VzTx.uvwxy.info
wap.RvtN.uvwxy.info
HvFt.uvwxy.info
wap.Drel.uvwxy.info
HlFj.uvwxy.info
wap.DhBf.uvwxy.info
neOs.uvwxy.info
wap.MqJn.uvwxy.info
6aY2.uvwxy.info
wap.W0Uy.uvwxy.info
sWpT.uvwxy.info
wap.HO8c.uvwxy.info
sMqK.uvwxy.info
wap.oImG.uvwxy.info
0UyS.uvwxy.info
wap.wQuO.uvwxy.info
0LVM.uvwxy.info
wap.6a4Y.uvwxy.info
oImG.uvwxy.info
wap.kECg.uvwxy.info
ySwQ.uvwxy.info
wap.uOsM.uvwxy.info
778f.uvwxy.info
wap.mW0U.uvwxy.info
nHkE.uvwxy.info
wap.iCgA.uvwxy.info
BvPN.uvwxy.info
wap.rLpJ.uvwxy.info
7b5Z.uvwxy.info
wap.3X1V.uvwxy.info
tXrU.uvwxy.info
wap.IP9d.uvwxy.info
tNrL.uvwxy.info
wap.pJnH.uvwxy.info
1VzT.uvwxy.info
wap.xRvP.uvwxy.info
2td7.uvwxy.info
wap.b5Z3.uvwxy.info
pJnH.uvwxy.info
wap.lFjD.uvwxy.info
xRvP.uvwxy.info
wap.tNrL.uvwxy.info
pZ3X.uvwxy.info
wap.1VzT.uvwxy.info
ImGk.uvwxy.info
wap.Eif9.uvwxy.info
4i1f.uvwxy.info
wap.TaKo.uvwxy.info
4Y2W.uvwxy.info
wap.0UyS.uvwxy.info
CgAe.uvwxy.info
wap.8c6a.uvwxy.info
sMKo.uvwxy.info
wap.ImGk.uvwxy.info
0UyS.uvwxy.info
wap.wQuO.uvwxy.info
Cjqa.uvwxy.info
wap.4Y2W.uvwxy.info
6Q4r.uvwxy.info
wap.yiCg.uvwxy.info
SwQu.uvwxy.info
wap.OsMq.uvwxy.info
TK4Y.uvwxy.info
wap.2W0y.uvwxy.info
HlFj.uvwxy.info
wap.DhBf.uvwxy.info
PtNr.uvwxy.info
wap.LpJn.uvwxy.info
Bp9m.uvwxy.info
wap.ahRv.uvwxy.info
hBfd.uvwxy.info
wap.7b5Z.uvwxy.info
pJnH.uvwxy.info
wap.lFjD.uvwxy.info
KBvP.uvwxy.info
wap.tNrL.uvwxy.info
7b5Z.uvwxy.info
wap.3X1V.uvwxy.info
cTDh.uvwxy.info
wap.Bf9d.uvwxy.info
vPtN.uvwxy.info
wap.rLpn.uvwxy.info
hLfJ.uvwxy.info
wap.6DxR.uvwxy.info
iCgA.uvwxy.info
wap.e8c6.uvwxy.info
D4oI.uvwxy.info
wap.mGkE.uvwxy.info
W0US.uvwxy.info
wap.wQuO.uvwxy.info
1sc6.uvwxy.info
wap.a4Y2.uvwxy.info
oImG.uvwxy.info
wap.kEiC.uvwxy.info
k4iV.uvwxy.info
wap.cMqK.uvwxy.info
pTK4.uvwxy.info
wap.Y2W0.uvwxy.info
mGkE.uvwxy.info
wap.iCgA.uvwxy.info
uOsM.uvwxy.info
wap.qKoI.uvwxy.info
3X1V.uvwxy.info
wap.zSwQ.uvwxy.info
pSmQ.uvwxy.info
wap.EL5Z.uvwxy.info
LpJn.uvwxy.info
wap.lFjD.uvwxy.info
qhRv.uvwxy.info
wap.PtNr.uvwxy.info
9d7b.uvwxy.info
wap.5Z3X.uvwxy.info
eVFj.uvwxy.info
wap.DhBf.uvwxy.info
xRPt.uvwxy.info
wap.NrLp.uvwxy.info
5Z3X.uvwxy.info
wap.1VzT.uvwxy.info
rVpT.uvwxy.info
wap.GN7b.uvwxy.info
NrLp.uvwxy.info
wap.JnHl.uvwxy.info
tkUy.uvwxy.info
wap.SwQu.uvwxy.info
CgAe.uvwxy.info
wap.8ca4.uvwxy.info
KoIm.uvwxy.info
wap.GkEi.uvwxy.info
pgQu.uvwxy.info
wap.OsMq.uvwxy.info
c6a4.uvwxy.info
wap.Y2W0.uvwxy.info
O2M0.uvwxy.info
wap.nue8.uvwxy.info
QuOs.uvwxy.info
wap.MqKo.uvwxy.info
vmW0.uvwxy.info
wap.UySw.uvwxy.info
iCgA.uvwxy.info
wap.e8c6.uvwxy.info
rLoI.uvwxy.info
wap.mGkE.uvwxy.info
9m6k.uvwxy.info
wap.Y9tN.uvwxy.info
9d7b.uvwxy.info
wap.5Z3X.uvwxy.info
1lFj.uvwxy.info
wap.DhBf.uvwxy.info
xRvP.uvwxy.info
wap.tNrL.uvwxy.info
ypZX.uvwxy.info
wap.1VzT.uvwxy.info
YptX.uvwxy.info
wap.rVIP.uvwxy.info
PtNr.uvwxy.info
wap.LpJn.uvwxy.info
X1Vz.uvwxy.info
wap.TxRv.uvwxy.info
f9d7.uvwxy.info
wap.b5Z3.uvwxy.info
0B2m.uvwxy.info
wap.FjDB.uvwxy.info
0UyS.uvwxy.info
wap.wQuO.uvwxy.info
ozqa.uvwxy.info
wap.4Y2W.uvwxy.info
ImGk.uvwxy.info
wap.EiCg.uvwxy.info
aEYf.uvwxy.info
wap.TaKo.uvwxy.info
a4Y2.uvwxy.info
wap.W0Uy.uvwxy.info
iCgA.uvwxy.info
wap.e8c6.uvwxy.info
D4oI.uvwxy.info
wap.mGkE.uvwxy.info
20Uy.uvwxy.info
wap.SwQu.uvwxy.info
oSmQ.uvwxy.info
wap.DK4Y.uvwxy.info
pJnH.uvwxy.info
wap.lFjD.uvwxy.info
xRvP.uvwxy.info
wap.tNrL.uvwxy.info
SJ3X.uvwxy.info
wap.1VzT.uvwxy.info
HlFj.uvwxy.info
wap.Dhf9.uvwxy.info
mdNr.uvwxy.info
wap.LpJn.uvwxy.info
Z3X1.uvwxy.info
wap.VzTx.uvwxy.info
hBf9.uvwxy.info
wap.d7b5.uvwxy.info
T7R5.uvwxy.info
wap.szjD.uvwxy.info
zTxR.uvwxy.info
wap.vPtN.uvwxy.info
VL5Z.uvwxy.info
wap.3X1V.uvwxy.info
oImG.uvwxy.info
wap.kEiC.uvwxy.info
JAuO.uvwxy.info
wap.sMqK.uvwxy.info
c6a4.uvwxy.info
wap.Y2W0.uvwxy.info
kEiC.uvwxy.info
wap.gAe8.uvwxy.info
WAU7.uvwxy.info
wap.v2mG.uvwxy.info
2W0U.uvwxy.info
wap.ySwQ.uvwxy.info
3u8c.uvwxy.info
wap.6a4Y.uvwxy.info
qKoI.uvwxy.info
wap.mGkE.uvwxy.info
ySwQ.uvwxy.info
wap.uOsM.uvwxy.info
uEsg.uvwxy.info
wap.nW0U.uvwxy.info
HlFj.uvwxy.info
wap.DhBf.uvwxy.info
I9tN.uvwxy.info
wap.rLpn.uvwxy.info
5Z3X.uvwxy.info
wap.1VzT.uvwxy.info
DhBf.uvwxy.info
wap.9d7b.uvwxy.info
iZJn.uvwxy.info
wap.HlFj.uvwxy.info
p9n4.uvwxy.info
wap.BvPt.uvwxy.info
EFmt.uvwxy.info
wap.d7b5.uvwxy.info
LpJn.uvwxy.info
wap.HlFj.uvwxy.info
k15j.uvwxy.info
wap.3hUb.uvwxy.info
6a4Y.uvwxy.info
wap.2W0U.uvwxy.info
7yiC.uvwxy.info
wap.gAe8.uvwxy.info
uOsM.uvwxy.info
wap.qKoI.uvwxy.info
2W0U.uvwxy.info
wap.ySwQ.uvwxy.info
yIvj.uvwxy.info
wap.qa4Y.uvwxy.info
qKoI.uvwxy.info
wap.mkEi.uvwxy.info
LCwQ.uvwxy.info
wap.uOsM.uvwxy.info
8c6a.uvwxy.info
wap.4Y2W.uvwxy.info
GkEi.uvwxy.info
wap.CgAe.uvwxy.info
mcMq.uvwxy.info
wap.KoIm.uvwxy.info
jMgK.uvwxy.info
wap.8FzT.uvwxy.info
jDhB.uvwxy.info
wap.f9d7.uvwxy.info
E5pJ.uvwxy.info
wap.nHlF.uvwxy.info
1VzT.uvwxy.info
wap.xRvP.uvwxy.info
f9d7.uvwxy.info
wap.bZ3X.uvwxy.info
f0A1.uvwxy.info
wap.lFjD.uvwxy.info
xRvP.uvwxy.info
wap.tNrL.uvwxy.info
5Z3X.uvwxy.info
wap.1VzT.uvwxy.info
2nrV.uvwxy.info
wap.pTGN.uvwxy.info
lcMq.uvwxy.info
wap.JnHl.uvwxy.info
Y2W0.uvwxy.info
wap.UySw.uvwxy.info
gAe8.uvwxy.info
wap.c6a4.uvwxy.info
HFga.uvwxy.info
wap.uXLS.uvwxy.info
wPNI.uvwxy.info
wap.Bz6q.uvwxy.info

在performance_schema库的file_summary_by_event_name表里,binlog对应的是event_name = "wait/io/file/sql/binlog"这一行。各个字段的统计逻辑,与redo log的各个字段完全相同。

由于每次操作数据库,performance_schema都需要额外统计这些信息,所以打开这个统计功能是有性能损耗的,建议只打开自己需要的项进行统计。可以通过下面的方法打开或关闭某个具体项的统计,比如要打开redo log的时间监控:

mysql> update setup_instruments set ENABLED='YES', Timed='YES' where name like '%wait/io/file/innodb/innodb_log_file%';

假设已经开启了redo log和binlog两个统计信息,如何把这个信息用到实例状态诊断上呢?

可以通过MAX_TIMER的值来判断数据库是否出问题。比如设定阈值,单次IO请求时间超过200毫秒属于异常,然后使用类似下面这条语句作为检测逻辑:

mysql> select event_name,MAX_TIMER_WAIT FROM performance_schema.file_summary_by_event_name where event_name in ('wait/io/file/innodb/innodb_log_file','wait/io/file/sql/binlog') and MAX_TIMER_WAIT>200*1000000000;

发现异常后,取到需要的信息,再通过下面的语句:

mysql> truncate table performance_schema.file_summary_by_event_name;

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐