সঠিক কারণ জানাতে পর্যাপ্ত প্রসঙ্গ না থাকায় এটি সত্যই কোনও উত্তর নয়, তবে আমার সাথে যখন ঘটেছিল তখন আমি কীভাবে এটি ট্র্যাক করতে পেরেছিলাম তার বর্ণনা এটি।
আমি আমার jbd2/md0-8
শীর্ষে প্রদর্শিত রাখা লক্ষ্য iotop
। /sys/kernel/debug/tracing/events/jbd2
কী করছে তা নির্ধারণের জন্য বিকল্পগুলি কী কী রয়েছে তা দেখার জন্য আমি সন্ধান করলাম jbd2
।
নোট -১: ডিবাগ ট্রেসিং ইভেন্টগুলির আউটপুট দেখতে cat /sys/kernel/debug/tracing/trace_pipe
- ট্রেসগুলি সক্ষম / অক্ষম করার সময় আমার এটি টার্মিনালে চলছিল।
নোট -২: ব্যবহারের জন্য ট্রেসিং ইভেন্টগুলি সক্ষম করতে যেমন 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
প্রতি সেকেন্ডে এটি করা থেকে বিরত রাখার জন্য আমি এর কনফিগারটি পরিবর্তন করার পরে ( , Undocumented আমার মনে হয়, এটি উত্স হিসাবে এটি খুঁজে পেয়েছিল) fsync(2)
সমস্যাটি চলে যায়।
আমার কার্নেল সংস্করণটি। 4.4.6-gentoo
আমি মনে করি এই ইভেন্টগুলি সাথে make oldconfig
পেতে কার্নেল কনফিগারেশনের কোনও পর্যায়ে আমি সক্ষম হয়েছি এমন কিছু বিকল্প ছিল (ম্যানুয়ালি বা সহ ) /sys/kernel/debug
- তাই আপনার যদি না থাকে তবে সক্ষম করার বিষয়ে আরও তথ্যের জন্য কেবল ইন্টারনেটে ঘুরে দেখুন এটা।