Linux 内核告警 kernel: INFO: task xxx blocked for more than 120 seconds.----已解决

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



上一篇:Preemption (computing)


下一篇:linux kernel态下使用NEON对算法进行加速【转】