To nie jest tak naprawdę odpowiedź, ponieważ nie ma wystarczającego kontekstu, aby podać dokładną przyczynę, ale jest to opis tego, jak udało mi się to śledzić, kiedy mi się to przydarzyło.
Zauważyłem, że jbd2/md0-8
ciągle pojawiałem się na górze iotop
. Zajrzałem, /sys/kernel/debug/tracing/events/jbd2
żeby zobaczyć, jakie są opcje, aby ustalić, co się jbd2
dzieje.
UWAGA-1: Aby wyświetlić dane wyjściowe dla zdarzeń śledzenia debugowania cat /sys/kernel/debug/tracing/trace_pipe
- miałem to uruchomione w terminalu podczas włączania / wyłączania śledzenia.
UWAGA-2: Aby włączyć zdarzenia do śledzenia, użyj np echo 1 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
. Aby wyłączyć echo 0 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
.
Zacząłem od włączenia /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
- ale nie było w nim nic, co wydawałoby się szczególnie interesujące. Próbowałem śledzić kilka innych zdarzeń, a gdy włączyłem /sys/kernel/debug/tracing/events/jbd2/jbd2_commit_flushing/enable
, zauważyłem, że następują one co sekundę:
# 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
Wyglądało to tak, jakby było powiązane z sync(2)
/ fsync(2)
/ msync(2)
, więc szukałem sposobu, aby połączyć to z procesem i znalazłem to:
# find /sys/kernel/debug/tracing/events/ | grep sync.*enable
...
/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable
...
Po włączeniu zobaczyłem następujące dane wyjściowe:
# 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
To dało mi nazwę / identyfikator procesu - i po kilku debugowaniu tego procesu ( nzbget
) odkryłem, że robi to fsync(2)
co sekundę. Po zmianie konfiguracji ( FlushQueue=no
myślę, że nieudokumentowane, znalazłem ją w źródle), aby powstrzymać się od robienia tego na sekundę, fsync(2)
problem zniknął.
Moja wersja jądra to. 4.4.6-gentoo
Myślę, że były pewne opcje, które włączyłem (ręcznie lub za pomocą make oldconfig
) w pewnym momencie konfiguracji jądra, aby uzyskać /sys/kernel/debug
te zdarzenia - więc jeśli nie masz, może po prostu rozejrzyj się po Internecie, aby uzyskać więcej informacji na temat włączania to.