这并不是一个真正的答案,因为没有足够的上下文来给出确切的原因,但这是对我如何在发生此情况时进行跟踪的描述。
我注意到我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
处理这些事件-因此,如果您没有,可能只是在互联网上四处寻找有关启用的更多信息它。