一、現象
[root@push-5-221 ~]# iotop otal DISK READ: 0.00 B/s | Total DISK WRITE: 6.26 M/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 795 be/3 root 0.00 B/s 0.00 B/s 0.00 % 95.80 % [jbd2/dm-0-8] 22952 be/4 rabbitmq 0.00 B/s 4.04 M/s 0.00 % 50.10 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 8597 be/4 mysql 0.00 B/s 90.05 K/s 0.00 % 16.08 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 22960 be/4 rabbitmq 0.00 B/s 52.53 K/s 0.00 % 13.40 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 22955 be/4 rabbitmq 0.00 B/s 105.06 K/s 0.00 % 11.76 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 22948 be/4 rabbitmq 0.00 B/s 41.27 K/s 0.00 % 10.10 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 22947 be/4 rabbitmq 0.00 B/s 48.78 K/s 0.00 % 7.44 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 22921 be/4 rabbitmq 0.00 B/s 48.78 K/s 0.00 % 6.55 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 22946 be/4 rabbitmq 0.00 B/s 45.03 K/s 0.00 % 6.30 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 23039 be/4 rabbitmq 0.00 B/s 26.27 K/s 0.00 % 6.07 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 23002 be/4 rabbitmq 0.00 B/s 45.03 K/s 0.00 % 6.02 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 22964 be/4 rabbitmq 0.00 B/s 48.78 K/s 0.00 % 4.67 % beam.smp -W w -A 128 -P 10~inet_dist_listen_max 25672 11655 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 2.77 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 30533 be/4 mysql 0.00 B/s 7.50 K/s 0.00 % 2.72 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 4458 be/4 mysql 0.00 B/s 3.75 K/s 0.00 % 1.87 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 6629 be/4 mysql 0.00 B/s 3.75 K/s 0.00 % 1.66 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 6116 be/4 mysql 0.00 B/s 3.75 K/s 0.00 % 1.62 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 19645 be/4 mysql 0.00 B/s 3.75 K/s 0.00 % 1.44 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 25633 be/4 mysql 0.00 B/s 3.75 K/s 0.00 % 1.22 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 8603 be/4 mysql 0.00 B/s 7.50 K/s 0.00 % 0.89 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 11659 be/4 mysql 0.00 B/s 180.11 K/s 0.00 % 0.43 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 22803 be/4 mysql 0.00 B/s 11.26 K/s 0.00 % 0.36 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 4470 be/4 mysql 0.00 B/s 3.75 K/s 0.00 % 0.03 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock 8601 be/4 mysql 0.00 B/s 3.75 K/s 0.00 % 0.02 % mysqld --basedir=/usr --da~=/var/lib/mysql/mysql.sock
發現[jbd2/dm-0-8]這個進程占用IO95%。
二、解決
進入mysql ,查看sync_binlog變量設置
[root@hlsms-fensheng-4 ~]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2118462 Server version: 5.7.22 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show variables like '%sync_binlog%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sync_binlog | 1 | +---------------+-------+ 1 row in set (0.00 sec) mysql>
當前值為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-0-8]這個進程占用IO95%。
因此將sync_log設置為500
mysql> set global sync_binlog=500; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%sync_binlog%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sync_binlog | 500 | +---------------+-------+ 1 row in set (0.00 sec) mysql>
三、設置innodb_flush_log_at_trx_commit變量
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
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) mysql> show variables like '%innodb_flush_log_at_trx_commit%'; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | innodb_flush_log_at_trx_commit | 2 | +--------------------------------+-------+ 1 row in set (0.01 sec)
四、驗證
再次查看iotop
Total DISK READ: 0.00 B/s | Total DISK WRITE: 781.51 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 1458 be/3 root 0.00 B/s 0.00 B/s 0.00 % 6.97 % [jbd2/dm-2-8] 26496 be/4 mysql 0.00 B/s 14.47 K/s 0.00 % 4.02 % mysqld --basedir=/usr --datadir=~ocket=/home/data/mysql/mysql.sock 26500 be/4 mysql 0.00 B/s 665.73 K/s 0.00 % 2.42 % mysqld --basedir=/usr --datadir=~ocket=/home/data/mysql/mysql.sock 26498 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 1.52 % mysqld --basedir=/usr --datadir=~ocket=/home/data/mysql/mysql.sock 26505 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 0.17 % mysqld --basedir=/usr --datadir=~ocket=/home/data/mysql/mysql.sock 26499 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 0.00 % mysqld --basedir=/usr --datadir=~ocket=/home/data/mysql/mysql.sock 14668 be/4 mysql 0.00 B/s 21.71 K/s 0.00 % 0.00 % mysqld --basedir=/usr --datadir=~ocket=/home/data/mysql/mysql.sock 16970 be/4 mysql 0.00 B/s 18.09 K/s 0.00 % 0.00 % mysqld --basedir=/usr --datadir=~ocket=/home/data/mysql/mysql.sock
[jbd2/dm-2-8]明顯降低