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


12

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

服务器规格为:

  • AMD Opteron 8核心
  • 16 GB RAM
  • 2x2.000 GB 7.200 RPM硬盘软件团队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]


感谢您的回复。经过一些挖掘后,我发现它与软件RAID有关。您知道解决方案吗?在将近三个月没有问题之后,它才在一周前开始发生奇怪的事情。
亚历克斯

您如何确定IO为99.99%?你用了iostat吗?您可以稍微运行一下(比如说iostat 5)并共享输出吗?
slm 2013年

我为iotop启用了日志记录功能,并查看了发生负载间隔的日志。现在负载很低,所以现在没有必要运行它,但是下次发生时我会做。感谢您的回复。
亚历克斯

1
我只是碰到这个确切的问题。您最终的解决方案最终是什么?
Satanicpuppy 2014年

Answers:


18

这并不是一个真正的答案,因为没有足够的上下文来给出确切的原因,但这是对我如何在发生此情况时进行跟踪的描述。

我注意到我jbd2/md0-8一直出现在的顶部iotop。我看了/sys/kernel/debug/tracing/events/jbd2看有什么选择来确定jbd2正在做什么。

注意-1:要查看调试跟踪事件的输出,请cat /sys/kernel/debug/tracing/trace_pipe在启用/禁用跟踪的同时在终端中运行此跟踪。

注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

看起来与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处理这些事件-因此,如果您没有,可能只是在互联网上四处寻找有关启用的更多信息它。


很好听。这非常有帮助。
jdhildeb

非常感谢详细介绍所有过程!
astrojuanlu

1

这似乎与期刊更新有关。软件RAID由多少个磁盘组成。您能告诉我创建它的命令吗?

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

dumpe2fs /dev/sdaX > /tmp/dump

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

另外,运行此。

iostat -xdk 1 25

在IO数量较高时。

我不知道cloudlinux,但是blktrace工具在其下可用。


嗨,苏厄姆,谢谢您的答复。阵列中有2个磁盘。至于dumpe2fs,请给我您要我运行的完整命令吗?感谢您的帮助。
亚历克斯

Alex,编辑了答案。
Soham Chakraborty

永远不要忘记,这甚至不是光盘中的中级性能设置-“像工作站一样慢”可以更详细地描述它。
TomTom 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.