Esto no es realmente una respuesta, ya que no hay suficiente contexto para dar la causa exacta, pero es una descripción de cómo logré rastrear esto cuando me sucedió.
Noté que jbd2/md0-8
seguía apareciendo en la parte superior iotop
. Miré /sys/kernel/debug/tracing/events/jbd2
para ver qué opciones hay para determinar qué jbd2
estaba haciendo.
NOTA-1: Para ver la salida de los eventos de seguimiento de depuración cat /sys/kernel/debug/tracing/trace_pipe
: hice que se ejecutara en la terminal al habilitar / deshabilitar los seguimientos.
NOTA-2: Para habilitar eventos para el uso de rastreo, por ejemplo echo 1 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
. Para desactivar echo 0 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
.
Comencé habilitando /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
, pero no había nada que pareciera particularmente interesante en el resultado. Intenté rastrear algunos otros eventos y cuando lo habilité /sys/kernel/debug/tracing/events/jbd2/jbd2_commit_flushing/enable
, vi que ocurría cada segundo:
# 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
Esto parecía estar relacionado con sync(2)
/ fsync(2)
/ msync(2)
, así que busqué alguna forma de vincular esto con un proceso y encontré esto:
# find /sys/kernel/debug/tracing/events/ | grep sync.*enable
...
/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable
...
Cuando lo habilité, vi el siguiente resultado:
# 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
Esto me dio el nombre / id del proceso, y después de hacer un poco más de depuración de este proceso ( nzbget
) descubrí que estaba haciendo fsync(2)
cada segundo. Después de que cambié su configuración ( FlushQueue=no
creo que no documentado, lo encontré en la fuente) para evitar que hiciera esto por segundo, fsync(2)
el problema desapareció.
Mi versión del kernel es 4.4.6-gentoo
. Creo que hubo algunas opciones que habilité (ya sea manualmente o con make oldconfig
) en algún momento de la configuración del kernel para obtener /sys/kernel/debug
estos eventos, así que si no lo tiene, simplemente busque en Internet para obtener más información sobre cómo habilitar eso.