系统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 #使修改内核参数生效