นี่ไม่ใช่คำตอบจริง ๆ เนื่องจากมีบริบทไม่เพียงพอที่จะให้สาเหตุที่แน่นอน แต่เป็นคำอธิบายว่าฉันจัดการติดตามเรื่องนี้ได้อย่างไรเมื่อเกิดขึ้นกับฉัน
ผมสังเกตเห็นฉันเก็บไว้แสดงขึ้นที่ด้านบนของjbd2/md0-8
iotop
ฉันดู/sys/kernel/debug/tracing/events/jbd2
เพื่อดูว่ามีตัวเลือกอะไรบ้างในการพิจารณาว่าjbd2
กำลังทำอะไรอยู่
NOTE-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
) ณ จุดหนึ่งในเคอร์เนล config เพื่อรับ/sys/kernel/debug
กับเหตุการณ์เหล่านี้ - ดังนั้นถ้าคุณไม่มีมันก็แค่ดูรอบ ๆ อินเทอร์เน็ตสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเปิดใช้งาน มัน.