现象
今日,数据库服务器连接数出现突然激增?导致有些应用拿不到数据库链接,数据库各种DML和DDL大面积超时,而各个web应用对应同一个数据库(微服务不拆封数据库就是坑),每个应用的数据库连接池最大连接数总和远远大于数据库服务器的max_connections(连接池总数设置不合理)。
- 数据库服务器
- SQL语句层面:DML语句在某个时刻出现指数级增长,DDL语句出现大面积超时(大部分语句的open-table特别慢)。
- 操作系统层面:IO压力很大,计算压力基本没有。
分析
- IO对于数据库而言就是读写磁盘压力变大,而数据库的操作来源与SQL语句。DML语句和DDL语句可能都会让数据库Server进行IO的操作。
- DML语句一般会进行数据的落盘操作,这里就会引起数据的IO,而数据库DML的突然增加会增大数据库服务器的IO,从而出现IO被拉高。
- 对于DDL语句,一般会进行相关缓存,不会太多的IO操作,我们发现很多DDL语句的open-table操作很慢。因为DML语句占据了大量IO,而DDL的open-table操作会进行IO。那么,自然会很慢。
方案
- 将突增的DML语句进行分散,以降低数据库IO的负载。
- 优化DDL语句的open-table参数设置。在Mysql中table_open_cache参数就是用来设置对DDL语句对打开表的缓存。对于table_open_cache = max_connections * N ( the count of tables ) / 0.85