linux – 高服务器负载 – [jbd2 / md1-8]使用99.99%IO

上周我的负荷一直在飙升.这通常每天发生一次或两次.我已经设法从iotop中识别[jbd2 / md1-8]正在使用99.99%的IO.在高负载时间期间,服务器没有高流量.

服务器规格是:

> AMD Opteron 8核心
> 16 GB RAM
> 2×2.000 GB 7.200 RPM HDD软件Raid 1
> Cloudlinux Cpanel
> MysqL已正确调整

除了尖峰之外,负载通常最多约为0.80.

我已经四处寻找,但找不到[jbd2 / md1-8]的确切内容.有没有人遇到这个问题或有没有人知道可能的解决方案?

谢谢.

更新:

TIME        TID     PRIO     USER    disK READ    disK WRITE    SWAPIN  IO       COMMAND
16:05:36     399     be/3    root    0.00 B/s      38.76 K/s    0.00 %  99.99 %  [jbd2/md1-8]

解决方法

这不是一个真正的答案,因为没有足够的上下文来给出确切的原因,但它描述了当我遇到这种情况时如何设法跟踪它.

我注意到我的jbd2 / md0-8一直出现在iotop的顶部.我查看了/ sys / kernel / debug / tracing / events / jbd2以查看有哪些选项可以确定jbd2正在做什么.

注1:要查看调试跟踪事件的输出cat / sys / kernel / debug / tracing / trace_pipe – 我在终端运行时启用/禁用跟踪.

注2:启用跟踪使用的事件,例如: echo 1> / SYS /内核/调试/跟踪/事件/ jbd2 / jbd2_run_stats /启用.要禁用echo 0> / SYS /内核/调试/跟踪/事件/ jbd2 / jbd2_run_stats /启用.

我开始启用/ sys / kernel / debug / tracing / events / jbd2 / jbd2_run_stats / enable – 但是在输出中没有任何东西看起来特别有趣.我尝试了一些其他事件来跟踪,当我启用/ sys / kernel / debug / tracing / events / jbd2 / jbd2_commit_flushing / enable时,我看到它每秒都在发生:

# cat /sys/kernel/debug/tracing/trace_pipe
...
jbd2/md0-8-2520  [004] .... 658660.216492: jbd2_commit_flushing: dev 9,0 transaction 32856413 sync 0
jbd2/md0-8-2520  [001] .... 658661.334900: jbd2_commit_flushing: dev 9,0 transaction 32856414 sync 0
jbd2/md0-8-2520  [001] .... 658661.394113: jbd2_commit_flushing: dev 9,0 transaction 32856415 sync 0

这看起来与sync(2)/ fsync(2)/ msync(2)有关,所以我找了一些方法将它链接一个进程并发现:

# find /sys/kernel/debug/tracing/events/ | grep sync.*enable
...
/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable
...

当我启用它时,我看到以下输出

# cat /sys/kernel/debug/tracing/trace_pipe
...
      nzbget-17367 [002] .... 658693.222288: ext4_sync_file_enter: dev 9,0 ino 301924373 parent 301924357 datasync 1 
  jbd2/md0-8-2520  [001] .... 658693.284080: jbd2_commit_flushing: dev 9,0 transaction 32856465 sync 0
      nzbget-17367 [000] .... 658693.334267: ext4_sync_file_enter: dev 9,0 ino 301924357 parent 301924353 datasync 1 
  jbd2/md0-8-2520  [002] .... 658693.334275: jbd2_commit_flushing: dev 9,0 transaction 32856466 sync 0
      nzbget-17367 [001] .... 658694.369514: ext4_sync_file_enter: dev 9,0 ino 301924367 parent 301924357 datasync 1 
  jbd2/md0-8-2520  [002] .... 658694.414861: jbd2_commit_flushing: dev 9,0 transaction 32856467 sync 0
      nzbget-17367 [001] .... 658694.470872: ext4_sync_file_enter: dev 9,0 ino 301924357 parent 301924353 datasync 1 
  jbd2/md0-8-2520  [002] .... 658694.470880: jbd2_commit_flushing: dev 9,0 transaction 32856468 sync 0

这给了我进程名称/ id – 在对这个进程(nzbget)做了一些调试之后,我发现它每秒都在做fsync(2).在我更改了它的配置(FlushQueue = no,我认为没有文档,在源代码中找到它)以阻止它每秒执行此操作fsync(2)后问题就消失了.

我的内核版本是4.4.6-gentoo.我认为我在内核配置中的某些时候启用了一些选项(手动或使用make oldconfig)来获取/ sys / kernel / debug这些事件 – 所以如果你不这样做它可能只是环顾互联网获取有关启用它的更多信息.

相关文章

在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异...
git使用小结很多人可能和我一样,起初对git是一无所知的。我...
1. 操作系统环境、安装包准备 宿主机:Max OSX 10.10.5 虚拟...
因为业务系统需求,需要对web服务作nginx代理,在不断的尝试...
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核...
一、Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个...