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

Ale*_*lex 16 linux software-raid high-load

在过去的一周里,我的负载激增。这通常每天发生一次或两次。我已经设法从 iotop 确定 [jbd2/md1-8] 正在使用 99.99% IO。在高负载期间,服务器没有高流量。

服务器规格为:

  • AMD皓龙8核
  • 16 GB 内存
  • 2x2.000 GB 7.200 RPM 硬盘软件 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]
Run Code Online (Sandbox Code Playgroud)

Iwa*_*amp 25

这不是一个真正的答案,因为没有足够的上下文来给出确切的原因,但它描述了当它发生在我身上时我如何设法跟踪它。

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

NOTE-1:查看调试跟踪事件的输出cat /sys/kernel/debug/tracing/trace_pipe- 我在启用/禁用跟踪的同时在终端中运行它。

NOTE-2:要启用事件以进行跟踪,请使用例如echo 1 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable. 要禁用echo 0 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable.

我从启用开始/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
Run Code Online (Sandbox Code Playgroud)

这看起来似乎是与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
...
Run Code Online (Sandbox Code Playgroud)

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

# 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
Run Code Online (Sandbox Code Playgroud)

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

我的内核版本是4.4.6-gentoo. 我认为我make oldconfig在内核配置中的某个时间启用了一些选项(手动或使用)来获取/sys/kernel/debug这些事件 - 所以如果你没有它,也许只是在互联网上查看有关启用的更多信息它。

  • 很好的侦查。这非常有帮助。 (2认同)

Soh*_*rty 2

这似乎是与日志更新相关的事情。软件 RAID 由多少个磁盘组成。你能告诉我用于创建它的命令吗?

您还可以粘贴 dumpe2fs 输出吗?首先,确定您看到负载的物理设备。使用 df 就可以知道这一点。然后,

dumpe2fs /dev/sdaX > /tmp/dump
Run Code Online (Sandbox Code Playgroud)

对于您的情况,它可能是/dev/md0。

另外,运行这个。

iostat -xdk 1 25
Run Code Online (Sandbox Code Playgroud)

IO高的时候出现问题。

我不知道cloudlinux,但它下有blktrace工具吗?