Dies ist keine wirkliche Antwort, da es nicht genügend Kontext gibt, um die genaue Ursache anzugeben, aber es ist eine Beschreibung, wie ich es geschafft habe, dies zu verfolgen, als es mir passiert ist.
Ich bemerkte, dass ich jbd2/md0-8
immer wieder oben auftauchte iotop
. Ich habe nachgesehen /sys/kernel/debug/tracing/events/jbd2
, welche Optionen es gibt, um festzustellen, was jbd2
gerade passiert.
HINWEIS-1: Um die Ausgabe für Debug-Ablaufverfolgungsereignisse anzuzeigen, wurde cat /sys/kernel/debug/tracing/trace_pipe
diese im Terminal ausgeführt, während Ablaufverfolgungen aktiviert / deaktiviert wurden.
HINWEIS-2: Um Ereignisse für die Ablaufverfolgung zu aktivieren, verwenden Sie z echo 1 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
. Deaktivieren echo 0 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
.
Ich begann mit dem Aktivieren /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
- aber es gab nichts, was in der Ausgabe dafür besonders interessant schien. Ich habe versucht, einige andere Ereignisse zu verfolgen, und als ich sie aktivierte, /sys/kernel/debug/tracing/events/jbd2/jbd2_commit_flushing/enable
sah ich, dass sie jede Sekunde auftraten:
# 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
Dies sah so aus, als ob es mit sync(2)
/ fsync(2)
/ zusammenhängt msync(2)
, also suchte ich nach einer Möglichkeit, dies mit einem Prozess zu verknüpfen, und fand Folgendes:
# find /sys/kernel/debug/tracing/events/ | grep sync.*enable
...
/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable
...
Als ich es aktivierte, sah ich die folgende Ausgabe:
# 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
Dies gab mir den Prozessnamen / die Prozess-ID - und nachdem ich diesen Prozess noch einmal debuggt hatte ( nzbget
), stellte ich fest, dass er fsync(2)
jede Sekunde ausgeführt wurde. Nachdem ich die Konfiguration geändert hatte ( FlushQueue=no
undokumentiert, glaube ich, fand sie in der Quelle), um dies pro Sekunde zu verhindern, fsync(2)
verschwand das Problem.
Meine Kernel-Version ist. 4.4.6-gentoo
Ich glaube, es gab einige Optionen, die ich (entweder manuell oder mit make oldconfig
) irgendwann in der Kernel-Konfiguration aktiviert habe , um /sys/kernel/debug
diese Ereignisse zu verarbeiten. Wenn Sie sie nicht haben, schauen Sie sich vielleicht im Internet um, um weitere Informationen zum Aktivieren zu erhalten es.