Chinaunix首页 | 论坛 | 博客
  • 博客访问: 325285
  • 博文数量: 97
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 811
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-25 19:22
文章分类

全部博文(97)

文章存档

2021年(1)

2020年(18)

2019年(14)

2018年(29)

2017年(16)

2016年(19)

我的朋友

分类: Mysql/postgreSQL

2020-12-16 19:18:17

本系统使用了docker搭建mysql,redis,java环境

top发现load average就算在没什么压力的情况总是保持在5以上,cpu使用率不高,内存也正常
于是检查磁盘io,
iostat -x -k -d 1时%util经常会到90
iotop时有个[jdb2/sda2]的长时间占用io

jbd的全拼是journaling block driver 文件系统的日志功能,jbd2是ext4文件系统版本;可以肯定的是对文件系统的操作太频繁,导致IO压力过大。

导致jbd2 io高的原因有:
1.磁盘故障
2.kernel问题
3.进程的sync操作频繁

主要针对sync操作频繁进行检查
1.先开启内核trace检查
echo 1 > /sys/kernel/debug/tracing/events/jbd2/jbd2_commit_flushing/enable
echo 1 > /sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable
cat /sys/kernel/debug/tracing/trace_pipe
输出结果:

  1. jbd2/sda3-8-506 [002] .... 1090561.509809: jbd2_commit_flushing: dev 8,3 transaction 7037013 sync 0
  2.           mysqld-2507 [002] .... 1090561.559324: ext4_sync_file_enter: dev 8,3 ino 27107339 parent 27107332 datasync 0
  3.           mysqld-2507 [001] .... 1090561.583960: ext4_sync_file_enter: dev 8,3 ino 27107471 parent 27107462 datasync 0
  4.           mysqld-2507 [001] .... 1090561.603836: ext4_sync_file_enter: dev 8,3 ino 27107473 parent 27107462 datasync 0
  5.           mysqld-2513 [006] .... 1090562.186306: ext4_sync_file_enter: dev 8,3 ino 27107337 parent 27107332 datasync 0
  6.      jbd2/sda3-8-506 [002] .... 1090562.186528: jbd2_commit_flushing: dev 8,3 transaction 7037014 sync 0
  7.           mysqld-2516 [003] .... 1090565.296380: ext4_sync_file_enter: dev 8,3 ino 27107334 parent 27107332 datasync 0
  8.      jbd2/sda3-8-506 [001] .... 1090565.299525: jbd2_commit_flushing: dev 8,3 transaction 7037015 sync 0
  9.           mysqld-2516 [007] .... 1090565.393030: ext4_sync_file_enter: dev 8,3 ino 27107334 parent 27107332 datasync 0
  10.      jbd2/sda3-8-506 [005] .... 1090565.393183: jbd2_commit_flushing: dev 8,3 transaction 7037016 sync 0
  11.           mysqld-2509 [010] .... 1090565.453053: ext4_sync_file_enter: dev 8,3 ino 27107333 parent 27107332 datasync 0
  12.      jbd2/sda3-8-506 [001] .... 1090565.453682: jbd2_commit_flushing: dev 8,3 transaction 7037017 sync 0
  13.           mysqld-2506 [005] .... 1090565.502064: ext4_sync_file_enter: dev 8,3 ino 27107333 parent 27107332 datasync 0
  14.      jbd2/sda3-8-506 [002] .... 1090565.502375: jbd2_commit_flushing: dev 8,3 transaction 7037018 sync 0
  15.           mysqld-2516 [002] .... 1090565.508614: ext4_sync_file_enter: dev 8,3 ino 27107334 parent 27107332 datasync 0
  16.      jbd2/sda3-8-506 [001] .... 1090565.628007: jbd2_commit_flushing: dev 8,3 transaction 7037019 sync 0
  17.           mysqld-2506 [003] .... 1090565.628038: ext4_sync_file_enter: dev 8,3 ino 27107473 parent 27107462 datasync 0
  18.           mysqld-2506 [001] .... 1090565.818821: ext4_sync_file_enter: dev 8,3 ino 27107336 parent 27107332 datasync 0
  19.           mysqld-2516 [003] .... 1090565.818928: ext4_sync_file_enter: dev 8,3 ino 27107334 parent 27107332 datasync 0
  20.      jbd2/sda3-8-506 [002] .... 1090565.819140: jbd2_commit_flushing: dev 8,3 transaction 7037020 sync 0
  21.           mysqld-2513 [007] .... 1090565.844790: ext4_sync_file_enter: dev 8,3 ino 27107337 parent 27107332 datasync 0
  22.      jbd2/sda3-8-506 [001] .... 1090565.888444: jbd2_commit_flushing: dev 8,3 transaction 7037021 sync 0
  23.           mysqld-2509 [010] .... 1090566.453295: ext4_sync_file_enter: dev 8,3 ino 27107333 parent 27107332 datasync 0
  24.      jbd2/sda3-8-506 [001] .... 1090566.453648: jbd2_commit_flushing: dev 8,3 transaction 7037022 sync 0
  25.           mysqld-2505 [003] .... 1090566.602429: ext4_sync_file_enter: dev 8,3 ino 27107333 parent 2710733
大量的mysql datasync

使用strace看一下它在做什么
strace -f -p 2505

试着优化mysql减少io
set global sync_binlog=100;
set global innodb_flush_log_at_trx_commit=2;

这种控制通过变量 innodb_flush_log_at_trx_commit 的值来决定。该变量有3种值:0、1、2,默认为1。但注意,这个变量只是控制commit动作是否刷新log buffer到磁盘。

  • 当设置为1的时候,事务每次提交都会将log buffer中的日志写入os buffer并调用fsync()刷到log file on disk中。这种方式即使系统崩溃也不会丢失任何数据,但是因为每次提交都写入磁盘,IO的性能较差。
  • 当设置为0的时候,事务提交时不会将log buffer中日志写入到os buffer,而是每秒写入os buffer并调用fsync()写入到log file on disk中。也就是说设置为0时是(大约)每秒刷新写入到磁盘中的,当系统崩溃,会丢失1秒钟的数据。
  • 当设置为2的时候,每次提交都仅写入到os buffer,然后是每秒调用fsync()将os buffer中的日志写入到log file on disk。
在主从复制结构中,要保证事务的持久性和一致性,需要对日志相关变量设置为如下:
  • 如果启用了二进制日志,则设置sync_binlog=1,即每提交一次事务同步写到磁盘中。
  • 总是设置innodb_flush_log_at_trx_commit=1,即每提交一次事务都写到磁盘中。

上述两项变量的设置保证了:每次提交事务都写入二进制日志和事务日志,并在提交时将它们刷新到磁盘中。



jbd2的io明显的下降了, load average也相应的降下来了。

2020-12-19
这个方法没能解决系统慢的问题,下一步检查业务和缓存策略。

阅读(3918) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~