jbd2/dm-2-8 硬盘IO高的问题

/ 默认分类 / 0 条评论 / 3610浏览

[root@mysqlDev ~]# yum install iotop -y

[root@mysqlDev ~]# iotop

Total DISK READ: 0.00 B/s | Total DISK WRITE: 63.34 K/s

TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND

1122 be/3 root 0.00 B/s 3.96 K/s 0.00 % 100 % [jbd2/dm-2-8]

15764 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 0.03 % mysqld --basedir=/usr --datadir=/home/mysqlData/mysql --plugin-dir=/usr/lib64/mysql/plug~log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=3306 15877 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 0.03 % mysqld --basedir=/usr --datadir=/home/mysqlData/mysql --plugin-dir=/usr/lib64/mysql/plug~log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=3306 15793 be/4 mysql 0.00 B/s 3.96 K/s 0.00 % 0.00 % mysqld --basedir=/usr --datadir=/home/mysqlData/mysql --plugin-dir=/usr/lib64/mysql/plug~log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=3306 15786 be/4 mysql 0.00 B/s 7.92 K/s 0.00 % 0.00 % mysqld --basedir=/usr --datadir=/home/mysqlData/mysql --plugin-dir=/usr/lib64/mysql/plug~log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=3306 15804 be/4 mysql 0.00 B/s 7.92 K/s 0.00 % 0.00 % mysqld --basedir=/usr --datadir=/home/mysqlData/mysql --plugin-dir=/usr/lib64/mysql/plug~log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock --port=3306 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]

mysql> show variables like '%sync_binlog%';

+---------------+-------+ | Variable_name | Value | +---------------+-------+ | sync_binlog | 1 | +---------------+-------+ 1 row in set (0.00 sec)

mysql> set global sync_binlog=10;

Query OK, 0 rows affected (0.00 sec)

sync_binlog 值更改 当前值为1,表示每次提交事务后,将binlog_cache中的数据强制写入磁盘。当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务

当设置为0时,表示当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。

在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。

sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

所以sync_binlog=1,导致事务写入太频繁,从而出现[jbd2/dm-2-8]这个进程占用IO100%。

因此将sync_log设置为10

mysql> show variables like '%innodb_flush_log_at_trx_commit%';

+--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | innodb_flush_log_at_trx_commit | 1 | +--------------------------------+-------+ 1 row in set (0.01 sec)

mysql> set global innodb_flush_log_at_trx_commit=2;

Query OK, 0 rows affected (0.00 sec)

innodb_flush_log_at_trx_commit是配置MySql日志何时写入硬盘的参数:

0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。

1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。

2:每次事务提交时mysql都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作\

一般设置为2