前段时间,一个Mysql数据库服务器磁盘IO写非常高,经过排查,发现是mysql线程导致的,磁盘读写情况,如下图所示
从上图可以看到磁盘IO已经达到6.77M/S,mysql的版本是5.6,这个版本还没有performance_schema.threads视图的THREAD_OS_ID字段,没办法将操作系统的thread_id和mysql数据库线程id进行关联,不能精确定位是mysql那个线程产生的磁盘IO写操作。
于是登录mysql数据库,临时开始Mysql数据库的general_log,查看日志记录,也没有发现什么特殊操作
这就很诡异了,到底是什么原因呢,只能祭出终极武器perf了,看看此时mysql数据库什么函数操作占用资源最多。
[root@mysql ~]# ps -ef|grep -i mysqldmysql 11650 1 0 8月29 ? 00:00:00 /bin/sh /data/mysql-8.0.21/bin/mysqld_safe --defaults-file=/data/mysql/mysql8/conf/3308/my.cnfmysql 12694 11650 2 8月29 ? 00:59:29 /data/mysql-8.0.21/bin/mysqld --defaults-file=/data/mysql/mysql8/conf/3308/my.cnf 电脑--basedir=/data/mysql-8.0.21 --datadir=/data/mysql/mysql8/data/3308 --plugin-dir=/data/mysql-8.0.21/lib/plugin --log-error=/data/mysql/mysql8/log/3308/error.log --open-files-limit=65535 --pid-file=/data/mysql/mysql8/run/3308/mysql.pid --socket=/data/mysql/mysql8/run/3308/mysql.sock --port=3308root 49777 49737 0 15:58 pts/0 00:00:00 grep --color=auto -i mysqld[root@mysql ~]# [root@mysql ~]# [root@mysql ~]# perf top -p 12694
观察结果如下图所示
从图中可以看到,buf_calc_page_new_checksum 函数操作占用的资源最多。
那么buf_calc_page_new_checksum 这个函数到底是做什么的呢?
在mysql刷盘时,会调用这个函数,这个函数的作用是checksum,并写入页中。,其调用顺序如下所示
buf_flush_page-->buf_flush_write_block_low-->buf_flush_init_for_writing-->buf_calc_page_new_checksum
从上面可以看出,是Mysql数据库在做刷脏页操作,导致磁盘的IO写特别高,这也是为什么在general_log看不出什么特殊操作的原因。
喜欢的朋友,可以添加关注电脑