过去一周,我的负载一直处于峰值状态。这种情况通常每天发生一两次。我设法从 iotop 中识别出 [jbd2/md1-8] 的 IO 使用率为 99.99%。在高负载期间,服务器的流量并不高。
服务器规格为:
- AMD Opteron 8 核
- 16 GB 内存
- 2x2.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]
答案1
这不是一个真正的答案,因为没有足够的背景信息来给出确切的原因,但它描述了我在这件事发生在我身上时如何设法追踪它。
我注意到我的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
答案2
这似乎与日志更新有关。软件 RAID 由多少个磁盘组成。您能向我展示创建它的命令吗?
您也可以将 dumpe2fs 输出粘贴到 pastebin 中。首先,确定您看到负载的物理设备。使用 df 可以知道这一点。然后,
dumpe2fs /dev/sdaX > /tmp/dump
对于您的情况,它可能是 /dev/md0。
另外,运行这个。
iostat -xdk 1 25
出现高 IO 问题时。
我不知道 cloudlinux 但是它下面是否有可用的工具 blktrace。