内核分析之mysql诡异重启故障
实例中全部都是活动连接
大量执行简单的单行insert
没有行/表锁阻塞
我司针对java和C#开发了sdk和连接中间件,但是这个业务的应用是C写的,无法接入中间件,所以数据库的连接数会一直涨到满。
修改内核参数
禁用自适应哈希索引。
耗时第一个多的是mtr_s_lock方法,这个是对B树操作的原子锁。
耗时第二多的是rw_lock_s_lock_func方法,这个是innodb的latch原子锁。
一类是不会回旋的锁,
一类是带回旋的锁(相当于oracle里的latch)。
代码描述
将max_connection改成1.5万,跑了下压力,发现insert语句依旧卡着,说明竞争依旧很激烈,但是,不再出现自动重启的现象了,而且当应用停止后,这些残留的sql会慢慢的执行完。
将max_connection改成3000,发现insert语句基本上2分钟执行完,竞争已经减轻很多了。
将max_connection改成300,语句执行毫无压力,但明显没有发挥出服务器的真正实力。
mariadb10.0.24
mysql5.7.30
这里有个小插曲,并发达到3万2千多的时候,死活就打不上去了。 操作系统的ulimit,实例的innodb_buffer_pool_instances和innodb_open_files都调过了,没有任何作用,只有调整了操作系统的max_map_count,才能够成功突破这个限制,顺利达到6万并发。
这里还有个小插曲,当并发打到6万5千多并发后,就上不去了,如果强行打上去,会报Not enough resources to complete lock request的错误,应该是哪里设置了65535的限制,以后翻源码瞅瞅。