How to fix hung_task_timeout_secs and blocked for more than 120 seconds problem

本文介绍了当Linux系统出现hang住现象,无法通过SSH访问但还能ping通的情况下的解决办法。核心在于调整vm.dirty_ratio和vm.dirty_background_ratio参数,并优化占用大量资源的进程。

Author:Skate
Time:2015/03/04

 

How to fix hung_task_timeout_secs and blocked for more than 120 seconds problem

 

现象:系统hang住,可以ping通,但ssh无响应

查看message log
[1379100.801689] [<ffffffff81536f95>] page_fault+0x25/0x30
[1379100.801693] INFO: task java:710923 blocked for more than 120 seconds.
[1379100.801766] Not tainted 2.6.32-042stab104.1 #1
[1379100.801835] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
[1379100.801963] java D ffff8800372d7200 0 710923 709954 67084186 0x00000000
[1379100.801968] ffff880e57e71cf0 0000000000000082 ffffea00021a8fc0 ffff880e57e71c68
[1379100.801972] ffffffff81155c60 ffff8800372d7200 ffffea00021a8fc0 ffff88100c409638
[1379100.801976] 00000007fa23bffc ffff880e57e71c78 ffffffff81155cd1 ffff880e57e71ca8
[1379100.801980] Call Trace:
[1379100.801984] [<ffffffff81155c60>] ? __lru_cache_add+0x40/0x90
[1379100.801988] [<ffffffff81155cd1>] ? lru_cache_add_lru+0x21/0x40
[1379100.801992] [<ffffffff81172c9c>] ? handle_pte_fault+0x65c/0x1040
[1379100.801996] [<ffffffff81536705>] rwsem_down_failed_common+0x95/0x1d0
[1379100.802000] [<ffffffff81536896>] rwsem_down_read_failed+0x26/0x30
[1379100.802004] [<ffffffff812a6a34>] call_rwsem_down_read_failed+0x14/0x30
[1379100.802008] [<ffffffff81535d94>] ? down_read+0x24/0x30
[1379100.802011] [<ffffffff8104dffe>] __do_page_fault+0x18e/0x480
[1379100.802015] [<ffffffff8106f0c8>] ? finish_task_switch+0xc8/0x120
[1379100.802019] [<ffffffff81539c2e>] do_page_fault+0x3e/0xa0
[1379100.802022] [<ffffffff81536f95>] page_fault+0x25/0x30
Show  Vitaly Medvedev added a comment - Yesterday 10:34 PM [1379100.801682] [<ffffffff81015019>] ? read_tsc+0x9/0x20 [1379100.801685] [<ffffffff81539c2e>] do_page_fault+0x3e/0xa0 [1379100.801689] [<ffffffff81536f95>] page_fault+0x25/0x30 [1379100.801693] INFO: task java:710923 blocked for more than 120 seconds. [1379100.801766] Not tainted 2.6.32-042stab104.1 #1 [1379100.801835] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [1379100.801963] java D ffff8800372d7200 0 710923 709954 67084186 0x00000000 [1379100.801968] ffff880e57e71cf0 0000000000000082 ffffea00021a8fc0 ffff880e57e71c68 [1379100.801972] ffffffff81155c60 ffff8800372d7200 ffffea00021a8fc0 ffff88100c409638 [1379100.801976] 00000007fa23bffc ffff880e57e71c78 ffffffff81155cd1 ffff880e57e71ca8 [1379100.801980] Call Trace: [1379100.801984] [<ffffffff81155c60>] ? __lru_cache_add+0x40/0x90 [1379100.801988] [<ffffffff81155cd1>] ? lru_cache_add_lru+0x21/0x40 [1379100.801992] [<ffffffff81172c9c>] ? handle_pte_fault+0x65c/0x1040 [1379100.801996] [<ffffffff81536705>] rwsem_down_failed_common+0x95/0x1d0 [1379100.802000] [<ffffffff81536896>] rwsem_down_read_failed+0x26/0x30 [1379100.802004] [<ffffffff812a6a34>] call_rwsem_down_read_failed+0x14/0x30 [1379100.802008] [<ffffffff81535d94>] ? down_read+0x24/0x30 [1379100.802011] [<ffffffff8104dffe>] __do_page_fault+0x18e/0x480 [1379100.802015] [<ffffffff8106f0c8>] ? finish_task_switch+0xc8/0x120 [1379100.802019] [<ffffffff81539c2e>] do_page_fault+0x3e/0xa0 [1379100.802022] [<ffffffff81536f95>] page_fault+0x25/0x30


宿主机的load达到460左右

By default Linux uses up to 40% of the available memory for file system caching.
After this mark has been reached the file system flushes all outstanding data to
disk causing all following IOs going synchronous. For flushing out this data to
disk this there is a time limit of 120 seconds by default. In the case here the
IO subsystem is not fast enough to flush the data withing 120 seconds. As IO
subsystem responds slowly and more requests are served, System Memory gets filled
up resulting in the above error, thus serving HTTP requests.


解决方案:

1. 修改参数 vm.dirty_ratio 和 vm.dirty_backgroud_ratio 可以避免这个问题

# sysctl -w vm.dirty_ratio=10
# sysctl -w vm.dirty_background_ratio=5

立即生效:
# sysctl -p

永久修改(需要reboot生效):
# vi /etc/sysctl.conf
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

2.找到好资源的进程,然后对其优化


参考:http://www.blackmoreops.com/2014/09/22/linux-kernel-panic-issue-fix-hung_task_timeout_secs-blocked-120-seconds-problem/


-------end-------

 

<think> 首先,用户的问题是:“我想了解命令 'echo 0 > /proc/sys/kernel/hung_task_timeout_secs' 禁用的消息相关信息”。具体来说,用户想知道“命令 'echo 0 > /proc/sys/kernel/hung_task_timeout_secs' 禁用的消息是什么”。 从系统级指令中,我需要: - 所有行内数学表达式使用 $...$ 格式。 - 独立公式使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如 [^1]。 - 回答结构清晰,逐步解决问题,保证真实可靠。 用户提供了多个引用: - 引用[1] 提到日志中出现大量 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.。 - 引用[2] 显示了具体的日志输出,包括 "INFO: task jbd2/dm-1-8:1362 blocked for more than 120 seconds." 和 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.。 - 引用[3] 和 [4] 讨论了脏数据和页高速缓存(cache),导致写操作延迟。 - 引用[5] 解释了 vm.dirty_background_ratio 和 vm.dirty_ratio,这些与脏页回写有关。 用户的问题核心是:命令 'echo 0 > /proc/sys/kernel/hung_task_timeout_secs' 禁用的消息是什么? 从引用中,我可以推断: - 这个命令是用来禁用关于“hung task”的警告消息的。 - 在引用[2]中,日志显示 "INFO: task jbd2/dm-1-8:1362 blocked for more than 120 seconds.",然后提示 "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message。 - 所以,禁用的消息是内核关于任务阻塞超时的警告,具体是当任务在120秒(默认超时时间)内没有调度时,内核会打印警告消息。设置 hung_task_timeout_secs 为0 禁用这个警告。 背景知识: - /proc/sys/kernel/hung_task_timeout_secs 是一个内核参数,用于设置任务被认定为“hung”(挂起)的超时时间(秒)。默认值通常是120秒。 - 如果任务在指定的时间内没有调度,内核会打印警告消息到日志。 - 设置这个值为0,会禁用这种警告消息。 因此,禁用的消息是内核关于任务阻塞超时的警告,具体是类似于 "INFO: task [task name] blocked for more than [timeout] seconds." 的消息。 现在,构建回答: 1. **结构清晰**:逐步解释。 - 先介绍 hung_task_timeout_secs 是什么。 - 解释默认行为:当任务阻塞超时时打印警告。 - 解释命令的作用:设置超时为0,禁用警告。 - 最后,说明禁用的具体消息内容。 2. **使用中文**:整个回答用中文。 3. **引用**:在相关部分末尾添加引用标识。例如,引用[2]提供了日志示例。 4. **生成相关问题**:在最后添加相关问题。 5. **LaTeX格式**:如果有数学表达式,使用指定格式。但在这个问题中,可能没有数学表达式,不需要使用。 回答大纲: 1. **介绍 hung_task_timeout_secs**: - 解释这个内核参数的作用:设置任务被认定为挂起的超时时间。 - 默认值通常为120秒。 2. **解释禁用的消息**: - 当任务阻塞超过这个超时时间时,内核会打印警告消息,如 "INFO: task [task name] blocked for more than [timeout] seconds."。 - 命令 'echo 0 > /proc/sys/kernel/hung_task_timeout_secs' 设置超时为0,从而禁用这些警告消息。 3. **引用支持**: - 引用[2]中的日志示例支持这一点。 4. **相关背景**: - 从引用[3][4][5],问题可能与脏数据和IO瓶颈有关,但用户焦点是禁用的消息本身。 - 可以简要提及可能的原因,如磁盘IO问题导致任务阻塞。 5. **生成相关问题**: - 基于主题,生成3个相关问题。 最终回答结构: - 开头直接回答问题。 - 分步解释。 - 结尾添加相关问题。 </think> ### 命令 'echo 0 > /proc/sys/kernel/hung_task_timeout_secs' 禁用的消息详解 命令 `echo 0 > /proc/sys/kernel/hung_task_timeout_secs` 禁用的消息是 Linux 内核在检测到任务(进程)阻塞超时时打印的警告信息。具体来说,当系统中某个任务在指定的超时时间内(默认为 120 秒)未能被调度或响应时,内核会记录一条警告消息到系统日志(如 `/var/log/messages`),提示管理员可能存在任务“挂起”(hung)的问题。设置 `hung_task_timeout_secs` 为 0 会完全禁用这种警告消息的生成和输出。下面我将逐步解释该消息的具体内容、命令的作用机制以及相关背景。 #### 1. **禁用的消息具体内容** - 当 `hung_task_timeout_secs` 设置为默认值(如 120 秒)时,如果任务阻塞超过这个时间,内核会在日志中打印类似以下格式的警告消息: ``` INFO: task [任务名称]:[PID] blocked for more than [超时时间] seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. ``` 例如,在引用[2]的日志中,您可以看到: ``` Mar 14 15:07:14 localhost kernel: INFO: task jbd2/dm-1-8:1362 blocked for more than 120 seconds. Mar 14 15:08:32 localhost kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. ``` 这条消息包括: - `INFO: task ... blocked for more than ... seconds.`:表示检测到任务(如 `jbd2/dm-1-8:1362`)已阻塞超过设定超时时间(120 秒)。 - 后续提示 `"echo 0 > ... disables this message."`:指示如何禁用该警告。 - 设置 `hung_task_timeout_secs=0` 后,此类消息将不再出现,但内核仍会监控任务状态,只是不再打印日志警告[^2]。 #### 2. **命令的作用机制** - **`hung_task_timeout_secs` 参数的作用**: - 这是一个 Linux 内核参数(位于 `/proc/sys/kernel/` 目录),用于定义任务被认定为“挂起”的超时阈值(单位:秒)。 - 默认值通常为 120 秒(即 2 分钟)。如果任务在此时长内未主动让出 CPU(例如,由于死锁、I/O 瓶颈或磁盘延迟),内核会触发警告。 - 警告消息的目的是帮助诊断系统性能问题,但频繁打印可能会淹没日志文件(如引用[1]所述的大量日志输出)。 - **设置值为 0 的效果**: - `echo 0 > /proc/sys/kernel/hung_task_timeout_secs` 将超时时间设为 0 秒。 - 这告诉内核不再检测任务阻塞超时,从而禁用所有相关警告消息。但请注意: - 任务阻塞问题本身并未解决,只是日志输出被抑制。 - 在调试时,建议恢复默认值(如 `echo 120 > ...`)以捕获问题。 - 该设置是临时的(重启后失效);要永久生效,需修改 `/etc/sysctl.conf` 文件。 #### 3. **为什么会出现这种消息及相关背景** - **常见原因**: - 任务阻塞通常由 I/O 瓶颈引起,如磁盘读写延迟。在引用[3][4][5]中,提到这与 Linux 的“脏数据”(dirty data)机制有关: - Linux 使用页高速缓存(page cache)优化写操作,将数据暂存于内存(称为“脏页”),再异步刷入磁盘。 - 如果脏页累积过多(例如,由于高负载或慢速磁盘),内核的 flush 进程(如 `pdflush`)可能无法及时处理,导致任务在等待 I/O 时阻塞。 - 相关参数如 `vm.dirty_background_ratio`(后台回写阈值)和 `vm.dirty_ratio`(同步回写阈值)控制脏页行为,如果配置不当,会加剧阻塞[^5]。 - 其他原因包括死锁、资源竞争或内核 bug。 - **潜在风险**: - 禁用警告消息可能掩盖严重问题。例如,在引用[2]中,任务 `jbd2/dm-1-8`(与磁盘日志相关)阻塞,可能表示磁盘故障或文件系统错误。 - 建议先分析根本原因(如使用 `iostat` 监控 I/O,或检查 `dmesg` 日志),而不是直接禁用消息。 总之,命令 `echo 0 > /proc/sys/kernel/hung_task_timeout_secs` 禁用的消息是内核关于任务阻塞超时的警告(具体格式如上述日志示例)。这主要用于减少日志噪音,但应谨慎使用,以避免忽略潜在的系统问题[^1][^2][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值