在巡检线上环境的时候,随便点击了一个报告页面,导致页面直接转圈卡死,等了 5 分钟才反应过来。起初还以为是网络问题导致的,就没有太在意,过了一会,又尝试了一下,还是慢,又对比了一下其它网页,发现其它网页都是正常的,只有这个页面的列表很慢。好巧不巧,我这该死的好奇心又被勾起来了,开始探寻之路.......
既然是页面卡顿,那么我们从下面几个方面来逐一排查,定位问题。
首先是想到的肯定是网络问题,但是,线上环境使用的是公司的内网,按道理来讲,出现这种可能性很低,于是我就找到负责网络的人员,得知,网络是没有问题的。我也从其他小伙伴那里尝试去访问,但最终结果是,访问其它页面都没有问题,唯独之后这个页面慢。所以网络这个问题也就排除掉了。
排除掉了网络问题,那么来看一下服务器配置是否有问题,通过堡垒机( JumpServer 推荐一下,挺好用的)登录到服务器,通过一番操作之后,服务器配置是 8c32g,磁盘 400g,磁盘使用率 18%, 内存使用率 65%,有持续跟踪了一下,点击页面的时候,cpu 和内存并没有出现明显的飙升现象。所以,这么一圈分析下来,服务器配置的问题也就排除了。
通过图中显示出,这条 sql 中已经使用到了索引,所以也不是索引的问题。
添加了之后,然并卵...... ,该慢的还是慢。
服务器配置也添加了,索引、慢 sql 也排查了,都没有问题,那么问题在哪里呢?以重新开始的态度继续排查,就排查到了一个重要的指标—— mysql 的缓存池使用率
这个指标很有用,简单说一下:
当我们使用 InnoDB 存储引擎时,它会将数据缓存在内存中,以提高查询性能。以下是关于 InnoDB 缓存的三个重要概念:
1. InnoDB缓存读命中率:指在查询数据时,InnoDB引擎从缓存中读取数据的比率。如果数据已经存在于缓存中,InnoDB就会从缓存中读取,而不是从磁盘中读取。因此,高缓存读命中率表示查询性能较好。
- 计算方法:InnoDB缓存读命中率 = (1 -(Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests)) * 100%
2. InnoDB缓存使用率:指InnoDB缓存中已经使用的内存比例。因为InnoDB缓存的内存大小是有限的,所以高缓存使用率表示需要增加缓存大小,以避免频繁的磁盘读写。
- 计算方法:InnoDB缓存使用率 = (Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_total) * 100%
3. InnoDB脏块率:指InnoDB缓存中已修改但尚未写回磁盘的数据块比例。因为脏块需要写回磁盘,所以高脏块率会影响性能。
- 计算方法:InnoDB脏块率 = (Innodb_buffer_pool_pages_dirty / Innodb_buffer_pool_pages_total) * 100%
综上所述,以下是关于 InnoDB 缓存的三个重要概念及其计算方法的列表:
概念 | 定义 | 计算方法 |
---|---|---|
InnoDB 缓存读命中率 | InnoDB 引擎从缓存中读取数据的比率 | (1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)) * 100% |
InnoDB 缓存使用率 | InnoDB 缓存中已经使用的内存比例 | (Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_total) * 100% |
InnoDB 脏块率 | InnoDB 缓存中已修改但尚未写回磁盘的数据块比例 | (Innodb_buffer_pool_pages_dirty / Innodb_buffer_pool_pages_total) * 100% |
查询命令:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';