Đây thực sự không phải là một câu trả lời vì không có đủ ngữ cảnh để đưa ra nguyên nhân chính xác, nhưng nó là một mô tả về cách tôi quản lý để theo dõi điều này khi nó xảy ra với tôi.
Tôi nhận thấy tôi jbd2/md0-8
tiếp tục xuất hiện ở đầu iotop
. Tôi nhìn vào /sys/kernel/debug/tracing/events/jbd2
để xem có những lựa chọn nào để xác định những gì jbd2
đang làm.
LƯU Ý-1: Để xem đầu ra cho các sự kiện theo dõi gỡ lỗi cat /sys/kernel/debug/tracing/trace_pipe
- Tôi đã chạy nó trong thiết bị đầu cuối trong khi bật / tắt các dấu vết.
CHÚ THÍCH-2: Để cho phép các sự kiện truy tìm sử dụng, vd echo 1 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
. Để vô hiệu hóa echo 0 > /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
.
Tôi đã bắt đầu bằng cách kích hoạt /sys/kernel/debug/tracing/events/jbd2/jbd2_run_stats/enable
- nhưng không có gì có vẻ đặc biệt thú vị trong đầu ra cho nó. Tôi đã thử một vài sự kiện khác để theo dõi và khi tôi bật /sys/kernel/debug/tracing/events/jbd2/jbd2_commit_flushing/enable
tôi thấy nó xảy ra mỗi giây:
# 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
Điều này trông giống như nó có liên quan đến sync(2)
/ fsync(2)
/ msync(2)
, vì vậy tôi đã tìm một số cách để liên kết điều này với một quá trình và tìm thấy điều này:
# find /sys/kernel/debug/tracing/events/ | grep sync.*enable
...
/sys/kernel/debug/tracing/events/ext4/ext4_sync_file_enter/enable
...
Khi tôi kích hoạt, tôi thấy đầu ra sau:
# 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
Điều này đã cho tôi tên quy trình / id - và sau khi thực hiện thêm một số sửa lỗi của quy trình này ( nzbget
) tôi phát hiện ra nó đang thực hiện fsync(2)
mỗi giây. Sau khi tôi thay đổi cấu hình của nó ( FlushQueue=no
tôi nghĩ là không có giấy tờ, đã tìm thấy nó trong nguồn) để ngăn nó thực hiện điều này mỗi giây fsync(2)
, vấn đề đã biến mất.
Phiên bản kernel của tôi là. 4.4.6-gentoo
Tôi nghĩ rằng có một số tùy chọn tôi đã bật (bằng tay hoặc bằng make oldconfig
) tại một số điểm trong cấu hình kernel để có được /sys/kernel/debug
các sự kiện này - vì vậy nếu bạn không có nó, có thể chỉ cần tìm trên internet để biết thêm thông tin về việc bật nó