okass 在版块 开源云盘 中回复了话题 nextcloud jbd2/dm-0-8进程占用内存过高 2年, 11个月前
有关jbd2进程的详细分析文章:性能分析解决jbd2引起的高io问题
1> 进入mysql后台
# mysql -uroot -p
mysql> show variables like ‘%sync_binlog%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| sync_binlog | 1 |
+—————+——-+
1 row in set (0.00 sec)
mysql>
sync_binlog 值为1,表示每次提交事务后,将binlog_cache中的数据强制写入磁盘。这是最安全但是性能损耗最大的设置,系统Crash的时候最多丢失binlog_cache中未完成的一个事务;
sync_binlog 值为 0 时,表示当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。默认设置为 0,这时性能是最好的,但风险也是最大的,一旦系统Crash,cache中的所有binlog信息都会丢失;
sync_binlog 值为 n 时,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
所以sync_binlog=1,导致事务写入太频繁,从而出现 [jbd2/dm-0-8] 这个进程占用 IO 95%。
因此将sync_log设置为一个比较大的数,如 200。
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>
0x04 设置 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 ,[jbd2/dm-2-8]已明显降低。
最后在线: 活跃于 6个月, 2周前
评论: 7
获赞: 0
文章: 0
粉丝: 68
关注: 68
好友: 8
User Rating: ( vote)