J'ai eu une charge de pointe au cours de la dernière semaine. Cela se produit généralement une ou deux fois par jour. J'ai réussi à identifier de iotop que [JBD2/MD1-8] utilise 99,99% IO. Pendant les heures de charge élevées, il n'y a pas de trafic élevé sur le serveur.
Les spécifications de serveurs sont:
Outre les pointes, la charge est généralement d'environ 0,80 au plus.
J'ai cherché autour de toi mais je ne trouve pas ce que [JBD2/MD1-8] fait exactement. Quelqu'un a-t-il eu ce problème ou quelqu'un connaît-il une solution possible?
Merci.
METTRE À JOUR:
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]
Ce n'est pas vraiment une réponse car il n'y a pas assez de contexte pour donner la cause exacte, mais c'est une description de la façon dont j'ai réussi à suivre cela quand cela m'est arrivé.
J'ai remarqué mon jbd2/md0-8
Continué à montrer en haut de iotop
. J'ai regardé dans /sys/kernel/debug/tracing/events/jbd2
Pour voir quelles options il doit déterminer ce que jbd2
Faisait.
NOTE-1: Pour voir la sortie des événements de traçage de débogage cat /sys/kernel/debug/tracing/trace_pipe
- J'avais cela en cours d'exécution en terminal tout en permettant/désactiver des traces.
Note-2: Pour activer les événements d'utilisation de la traçabilité par ex. echo 1 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
. Désactiver echo 0 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
.
J'ai commencé par activation /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
- mais il n'y avait rien qui semblait particulièrement intéressant dans la production. J'ai essayé quelques autres événements à tracer et quand j'ai activé /sys/kernel/debug/tracing/events/jbd2/jbd2_commit_flushing/enable
J'ai vu qu'il se produisait chaque seconde:
# 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
Cela ressemblait à c'était lié à sync(2)
/fsync(2)
/msync(2)
_, donc j'ai cherché un moyen de relier cela à un processus et trouvé ceci:
# find /sys/kernel/debug/tracing/events/ | grep sync.*enable
...
/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable
...
Quand je l'ai activé, j'ai vu la sortie suivante:
# 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
Cela m'a donné le nom de processus/ID - et après avoir fait plus de débogage de ce processus (nzbget
) j'ai découvert qu'il faisait fsync(2)
chaque seconde. Après avoir changé de config (FlushQueue=no
, Je pense que je pense, trouvé dans la source) de l'arrêter de le faire par seconde fsync(2)
Le problème s'est éloigné.
Ma version de kernel est 4.4.6-gentoo
. Je pense qu'il y avait quelques options que j'ai activées (manuellement ou avec make oldconfig
) À un moment donné dans le kernel config pour obtenir /sys/kernel/debug
Avec ces événements - donc Si vous ne le faites pas, il suffit de regarder sur Internet pour plus d'informations sur l'activation.
Cela semble être une chose liée à la mise à jour du journal. Combien de disques le raid logiciel est composé de. Pouvez-vous me montrer la commande utilisée pour la créer.
Pouvez-vous aussi coller la sortie du dukette2fs. Tout d'abord, identifiez le dispositif physique où vous voyez la charge. Utilisez DF pour le savoir. Puis,
dumpe2fs /dev/sdaX > /tmp/dump
Pour votre cas, cela pourrait être/dev/md0.
Aussi, courez ceci.
iostat -xdk 1 25
Au moment de la hauteur IO problème.
Je ne connais pas CloudLinux mais est l'outil blktrace disponible sous elle.