यह वास्तव में एक उत्तर नहीं है क्योंकि सटीक कारण देने के लिए पर्याप्त संदर्भ नहीं है, लेकिन यह एक विवरण है कि जब मैं मेरे साथ हुआ तो मैंने इसे कैसे ट्रैक किया।
मैंने देखा कि मेरे jbd2/md0-8
शीर्ष पर दिखा रहा है iotop
। मैंने /sys/kernel/debug/tracing/events/jbd2
यह देखने के लिए देखा कि क्या करने के लिए क्या विकल्प jbd2
हैं।
नोट -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
इसने मुझे प्रक्रिया का नाम / आईडी दिया - और इस प्रक्रिया के कुछ और डिबगिंग करने के बाद ( nzbget
) मुझे पता चला कि यह fsync(2)
हर सेकंड कर रहा था । जब मैंने इसका कॉन्फिगरेशन बदल दिया ( FlushQueue=no
, अनकम्फर्टेड आई थिंक, इसे सोर्स में पाया गया) इसे प्रति सेकेंड करने से रोकने के लिए यह fsync(2)
समस्या चली गई।
मेरा कर्नेल संस्करण है। 4.4.6-gentoo
मुझे लगता है कि इन घटनाओं के साथ make oldconfig
प्राप्त करने के लिए कर्नेल विन्यास के कुछ बिंदु पर मैंने (या तो मैन्युअल रूप से या साथ में ) कुछ विकल्प चुने थे /sys/kernel/debug
- इसलिए यदि आपके पास ऐसा नहीं है तो सक्षम करने के बारे में अधिक जानकारी के लिए इंटरनेट पर बस देखें। यह।