系統centos7.5 message夜間告警提示 task kworker/0:1:47475 blocked for more than 120 seconds.
具體如下:
kernel: INFO: task kworker/0:1:47475 blocked for more than 120 seconds. Jan 9 23:26:02 hblf-ct-dsm009 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Jan 9 23:26:02 hblf-ct-dsm009 kernel: kworker/0:1 D ffff9b57af61acc0 0 47475 2 0x00000080 Jan 9 23:26:02 hblf-ct-dsm009 kernel: Call Trace: Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] ? scsih_qcmd+0x3ab/0x520 [mpt3sas] Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] schedule+0x29/0x70 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] schedule_timeout+0x221/0x2d0 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] ? select_task_rq_fair+0x5a6/0x760 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] ? scsi_request_fn+0x48/0x680 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] wait_for_completion+0xfd/0x140 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] ? wake_up_state+0x20/0x20 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] kthread_create_on_node+0xaa/0x140 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] ? manage_workers.isra.26+0x2a0/0x2a0 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] create_worker+0xeb/0x200 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] manage_workers.isra.26+0xf6/0x2a0 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] worker_thread+0x383/0x3c0 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] ? manage_workers.isra.26+0x2a0/0x2a0 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] kthread+0xd1/0xe0 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] ? insert_kthread_work+0x40/0x40 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] ret_from_fork_nospec_begin+0x21/0x21 Jan 9 23:26:02 hblf-ct-dsm009 kernel: [] ? insert_kthread_work+0x40/0x40 Jan 9 23:26:02 hblf-ct-dsm009 kernel: INFO: task kworker/15:1:50115 blocked for more than 120 seconds. Jan 9 23:26:02 hblf-ct-dsm009 kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. Jan 9 23:26:02 hblf-ct-dsm009 kernel: kworker/15:1 D ffff9b5baee5acc0 0 50115 2 0x00000080 Jan 9 23:26:02 hblf-ct-dsm009 kernel: Call Trace:
問題原因:
默認情況下, Linux會最多使用40%的可用內存作為文件系統緩存。當超過這個閾值后,文件系統會把將緩存中的內存全部寫入磁盤, 導致后續的IO請求都是同步的。
將緩存寫入磁盤時,有一個默認120秒的超時時間。 出現上面的問題的原因是IO不能在120秒將緩存中的數據全部寫入磁盤。IO系統響應緩慢,導致越來越多的請求堆積,最終系統內存全部被占用,導致系統失去響應。
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs"的意思是關閉這個告警提示。
解決辦法:
調整文件系統緩存中臟數據占用內存的比例,調整參數,降低臟數據開始處理的百分比,提高臟數據最高容量。使得文件系統緩存不會那么快寫入 硬盤,而系統有時間去處理臟數據。主要是如下兩項參數:
vm.dirty_background_ratio指定當文件系統緩存臟頁數量達到系統內存百分之多少時(如5%)就會觸發pdflush/flush/kdmflush等后台回寫進程運行,將一定緩存的臟頁異步地刷入外存。
vm.dirty_ratio 則指定了當文件系統緩存臟頁數量達到系統內存百分之多少時(如10%),系統不得不開始處理緩存臟頁(因為此時臟頁數量已經比較多,為了避免數據丟失需要將一定臟頁刷入外存),在此過程中很多應用進程可能會因為系統轉而處理文件IO而阻塞。
sysctl -a | grep dirty #查看目前參數,我將觸發值減少一倍,而容限調整到60%
#寫入內核
vi /etc/sysctl.conf
vm.dirty_background_ratio = 5 #原來是10
vm.dirty_ratio = 60 #原來是20
sysctl -p #使修改內核參數生效
參考:臟數據優化