linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案

2023-10-30

1 问题描述

最近搭建的一个linux最小系统在运行到241秒时在控制台自动打印如下图信息,并且以后每隔120秒打印一次。
这里写图片描述

仔细阅读打印信息发现关键信息是“hung_task_timeout_secs”,第一次遇到这样的问题,首先百度…

通过翻看多个网友的博客,发现这是linux kernel的一个bug。大家对这个问题的解释也都比较一致,摘抄一段:

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.
This especially happens on systems with a lot of memory.
The problem is solved in later kernels。

翻译过来就是:一般情况下,linux会把可用内存的40%的空间作为文件系统的缓存。当缓存快满时,文件系统将缓存中的数据整体同步到磁盘中。但是系统对同步时间有最大120秒的限制。如果文件系统不能在时间限制之内完成数据同步,则会发生上述的错误。这通常发生在内存很大的系统上。系统内存大,则缓冲区大,同步数据所需要的时间就越长,超时的概率就越大。

2 解决办法

网友们提供的解决方案大致有3种,分别对3种方案的效果进行验证测试。

2.1 缩小文件系统缓存大小

此种方案是降低缓存占内存的比例,比如由40%降到10%,这样的话需要同步到磁盘上的数据量会变小,IO写时间缩短,会相对比较平稳。

文件系统缓存的大小是由内核参数vm.dirty_ratiovm.dirty_backgroud_ratio控制决定的。

vm.dirty_background_ratio指定当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存。

vm.dirty_ratio则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存),在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。

通常情况下,vm.dirty_ratio的值要大于vm.dirty_background_ratio的值。

下面说一下修改这两个参数的流程及效果。

(1)首先查看系统当前的vm.dirty_ratio 和 vm.dirty_ background_ratio的值。

在shell命令行中输入如下指令:

sysctl -a | grep dirty

这里写图片描述
由上图可知,当前环境下,vm.dirty_ratio=20 ,vm.dirty_ background_ratio=10。在此情况下,会出现上述问题。

(2)修改vm.dirty_ratio和vm.dirty_ background_ratio的值。
把vm.dirty_ratio修改为10 ,vm.dirty_background_ratio修改为5。在命令行输入如下命令:

./sbin/sysctl -w vm.dirty_ratio=10
./sbin/sysctl -w vm.dirty_background_ratio=5

这里写图片描述
(3)查看修改是否成功。

在命令行输入(1)中的指令即可。
这里写图片描述
由上图可知,参数修改成功。

(4)使参数修改立即生效。

在命令行输入如下指令即可。

sysctl  -p

(5)观察测试结果。

经过以上操作,缩减文件系统缓存之后,上述问题成功解决。

2.2 修改系统IO调度策略

Linux的IO共有三种调度器:CFQnoopdeadline。每个调度器都有其优点。

CFQ (Completely Fair Scheduler(完全公平调度器))(cfq):它是许多Linux 发行版的默认调度器;它将由进程提交的同步请求放到多个进程队列中,然后为每个队列分配时间片以访问磁盘。

Noop调度器(noop):基于先入先出(FIFO)队列概念的Linux内核里最简单的I/O调度器。此调度程序最适合于SSD。

截止时间调度器(deadline):尝试保证请求的开始服务时间。

Linux发行版的默认采用的是cfq调度器。此方案就是把cfq调度器修改为最简单的noop调度器

下面说一下修改调度器的流程。

(1)查看当前采用的调度器。

在命令行中输入如下指令:

cat /sys/block/sda/queue/scheduler

这里写图片描述
由内核返回信息可知,当前采用的是cfq调度器。

(2)修改调度器。

在命令行中输入如下指令:

echo noop >/sys/block/sda/queue/scheduler

这里写图片描述
(3)查看修改是否成功。

在命令行中输入如(1)的指令。
这里写图片描述
由内核返回信息可知,调度器修改成功。

调度器的修改是立即生效的,不必重启内核。

(4)观察测试结果。

修改完成后,让系统继续运行一段时间。上述问题依然存在。所以此方案对本文的案例不起作用。对于其他案例是否起作用需要自己按照上述方式测试才能得知。

2.3 取消120秒时间限制

此方案就是不让系统有那个120秒的时间限制。文件系统把数据从缓存转到外存慢点就慢点,应用程序对此延时不敏感。就是慢点就慢点,我等着。实际上操作系统是将这个变量设为长整形的最大值。

下面说一下内核hung task检测机制由来。我们知道进程等待IO时,经常处于D状态,即TASK_UNINTERRUPTIBLE状态,处于这种状态的进程不处理信号,所以kill不掉,如果进程长期处于D状态,那么肯定不正常,原因可能有二:

1)IO路径上的硬件出问题了,比如硬盘坏了(只有少数情况会导致长期D,通常会返回错误);

2)内核自己出问题了。

这种问题不好定位,而且一旦出现就通常不可恢复,kill不掉,通常只能重启恢复了。
内核针对此种情况开发了一种hung task的检测机制,基本原理是:定时检测系统中处于D状态的进程,如果其处于D状态的时间超过了指定时间(默认120s,可以配置),则打印相关堆栈信息,也可以通过proc参数配置使其直接panic。

如何修改或者取消120秒的时间限值呢。120秒的时间限值由内存参数kernel.hung_task_timeout_secs决定的。直接像方案一那样修改此内核参数的值就可。如果kernel.hung_task_timeout_secs的值设置为0,那就是把此种设置为长整型的最大值。

下面说一下修改调度器的流程。

(1)查看当前hung_task_timeout_secs值。

在命令行中输入如下指令:

sysctl -a | grep hung_task_timeout_secs

这里写图片描述

有内核返回信息,可知当前设置的hung_task超时时间为120秒。

(2)修改hung_task_timeout_secs值。

把hung_task_timeout_secs的值修改为0,在命令行中输入如下指令:


./sbin/sysctl -w kernel.hung_task_timeout_secs=0

这里写图片描述

(3)查看修改是否成功。

在命令行输入(1)中的指令即可。
这里写图片描述

(4)使参数修改立即生效。

在命令行输入如下指令即可。

sysctl  -p

(5)观察测试结果。
经过以上操作,取消120秒时间限值之后,上述问题成功解决。

2.4 总结
经过上边的测试,可知对与本案例缩减文件系统缓冲大小和取消120秒时间限值均可以解决问题。但是取消120秒的时间限值会允许系统不可切换任务的出现。综合考虑决定采用方案1,即缩减文件系统的缓冲区大小。

3 永久修改内核参数

在上述方案中采用sysctl可以修改内核参数,但是这只是临时修改,上电重启后又会恢复回之前的参数。那么如何才能够永久修改内核参数呢?

可以修改系统信息配置文件sysctl.conf,此配置文件在/etc目录下。打开配置文件在最后添加如下两行代码:

vm.dirty_background_ratio=5
vm.dirty_ratio=10

这里写图片描述
保存后重启系统,查看配置是否成功。

如果系统没有sysctl.conf文件,就像我的最小linux系统一样,则可以自己创建sysctl.conf。

在/etc目录下,采用vi指令:vi sysctl.conf新建sysctl.conf文件,然后输入如下代码后保存退出。

重启之后查看vm.dirty_ratio和vm.dirty_background_ratio的值,发现又恢复成之前的了。

这是因为开机启动时系统没有读取sysctl.conf文件进行配置。可以通过修改启动文件来解决。

以我使用的linux系统为例,启动文件是/etc/init.d/rcS。采用指令vi /etc/init.d/rcS打开rcS文件,在最末尾添加如下代码:./sbin/sysctl -p
这里写图片描述

保存后退出。reboot重启可以看到内核打印信息中有如下信息:
这里写图片描述
进入控制台后,查看vm.dirty_ratio和vm.dirty_background_ratio的值,可知内核参数永久修改成功。

【参考】
1、Linux Kernel Crash–hung_task_timeout_secs 作者:李子无为
http://blog.csdn.net/napolunyishi/article/details/17576739
2、How to fix hung_task_timeout_secs and blocked for more than 120 seconds problem 作者:skate
http://blog.csdn.net/wyzxg/article/details/44236263
3、关于修改 sysctl.conf,如何使该文件在系统重启之后生效 作者:dagebudagegeda
http://blog.csdn.net/u010616985/article/details/44563931
4、文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别 作者:vincent
http://blog.sina.com.cn/s/blog_448574810101k1va.html
5、一次内核hung task分析 作者:humjb_1983
http://blog.chinaunix.net/uid-14528823-id-4406510.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案 的相关文章

  • 将数组从 .npy 文件读入 Fortran 90

    我使用 Python 以二维数组 例如 X 的形式生成一些初始数据 然后使用 Fortran 对它们进行一些计算 最初 当数组大小约为 10 000 x 10 000 时 np savetxt 在速度方面表现良好 但是一旦我开始增加数组的维
  • 如何在 Swift 中解析蓝牙设备发送的浮点数?

    在我的 iOS 应用程序上 我需要解码蓝牙接收到的 Float 值 并从不同的设备 不是 iOS 获取 4 个字节 因此我需要一个 便携式 4 字节 Float 格式 目前发件人正在使用以下格式 数据编码 0xCCBBAAAEE 0xEE
  • Python 中的迭代器 (iter()) 函数。 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 对于字典 我可以使用iter 用于迭代字典的键 y x 10 y 20 for val in iter y print val 当
  • VB.NET 是否优化字符串文字的串联?

    如同this https stackoverflow com questions 288794 does c optimize the concatenation of string literals问题 但对于 VB NET 来说 因为我
  • 是否可以使用环境变量来为基于 log4net 的日志系统指定所需的日志级别?

    我们使用 log4net 进行日志记录 我想知道在指定日志级别时是否可以使用环境变量 动机很简单 我们的 QA 人员不必编辑配置文件 他们只需设置一次特定的环境变量 简而言之 我们不想将配置文件中的日志级别设置为某个恒定值 因为相同的构建由
  • 从 Android 中的过渡动画中排除 BottomNavigation

    我一直在四处寻找 但找不到有助于解决这个特定问题的答案 我的应用程序有一个自定义滑入 滑出效果 如下所示 Intent intent new Intent getApplicationContext MyActivity class sta
  • GKE 出现错误:ImagePullBackOff 和错误:ErrImagePull 错误

    当 kubectl 应用 yaml 将自定义构建的 docker 映像部署到 GCP 中的集群 编辑掉敏感信息 时 我收到以下错误 已尝试以下但没有运气 手动部署镜像 检查以确保防火墙规则允许 443 并且没有任何东西阻止它 尝试将容器注册
  • linux下无法安装Cairo包

    我在本地下载该软件包并尝试安装它 但出现此错误 R CMD INSTALL l usr local lib64 R library Cairo 1 5 1 tar gz 我得到他的错误 checking for PNG support in
  • 将隐藏(生物识别)数据附加到 pdf 上的数字签名

    我想知道是否可以使用 iText 我用于签名 或 Java 中的其他工具在 pdf 上添加生物识别数据 我会更好地解释一下 在手写板上签名时 我会收集签名信息 例如笔压 签名速度等 我想将这些信息 java中的变量 与pdf上的签名一起存储
  • 在地图上使用 find

    如何使用 find 和 aconst iterator如果你有一个地图定义为 typedef std pair
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik
  • shell脚本“x$VARIABLE”中x的用途[重复]

    这个问题在这里已经有答案了 我正在查看一些 shell 脚本 comarison shcu 中 x 的用途是什么 if x USER x RUN AS USER then su RUN AS USER c CATALINA HOME bin
  • 如何抑制 Pandas Future 警告?

    当我运行该程序时 Pandas 每次都会给出如下所示的 未来警告 D Python lib site packages pandas core frame py 3581 FutureWarning rename with inplace
  • 确定分区属于什么文件系统

    操作系统如何知道分区正在使用什么文件系统 换句话说 FAT16 32 NTFS ext2 3等如何区分 如果您在 Windows 上使用 Win32 API 则可以调用 GetVolumeInformation http msdn micr
  • 将 Zurb Foundation v5 升级到 v6.2 所需的工作

    将 Foundation 5 升级到 6 2 需要做什么工作以及需要做多少工作 我们的开发工作室正在接管现有 F5 项目的开发 看起来前端布局已经完成了 80 尽管我们可能会过渡到 JSX 但几乎没有什么会保持不变 我需要帮助来权衡 F6
  • 如何将 configmap 附加到 Kubernetes 中的部署?

    根据此处找到的说明 https kubernetes io docs tasks access application cluster connecting frontend backend https kubernetes io docs
  • 从最大到最小的3个整数

    我是 C 初学者 我使用 编程 使用 C 的原理与实践 第二版 问题如下 编写一个程序 提示用户输入三个整数值 然后以逗号分隔的数字顺序输出这些值 如果两个值相同 则应将它们排列在一起 include
  • 使用 lpSolve 优化 R 团队名单

    我是 R 新手 有一个想要解决的特定幻想运动队优化问题 我见过其他帖子使用 lpSolve 来解决类似的问题 但我似乎无法理解代码 下面的示例数据表 每个球员都在一个球队中 扮演着特定的角色 有薪水 并且每场比赛都有平均得分 我需要的限制是
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht
  • Golang 优雅地关闭 HTTP 服务器并进行错误处理

    我正在让我的 HTTP 服务器正常关闭 我从帖子中获取了提示here https stackoverflow com questions 39320025 how to stop http listenandserve 并且到目前为止已经像

随机推荐

  • centos或Ubuntu机器出现 pycharm.desktop文件出现 未信任的应用程序启动器的情况,怎么解决?

    桌面图标启动编辑 vi pycharm desktop usr bin env xdg open Desktop Entry Version 1 0 Type Application Name Pycharm 根据自己的安装位置灵活修改 I
  • centOs7 安装docker 镜像

    Step1 检查是否安装过 docker yum list installed grep docker 如果出现如下图所示的情况 说明安装过 如果重新安装需要先卸载 使用命令 yum y remove docker ce x86 64 卸载
  • TensorRT -- github

    此存储库包含 NVIDIA TensorRT 的开源软件 OSS 组件 它包括 TensorRT 插件和解析器 Caffe 和 ONNX 的源代码 以及演示 TensorRT 平台用法和功能的示例应用程序 这些开源软件组件是 TensorR
  • Python 预测股票价格,竟然这么简单

    作为一种技术手段 预测在金融 证券领域的应用非常广泛 尤其是对股票价格的预测 我们介绍一下获得股票数据的方法 并基于此对数据进行预处理 接着使用数据分析方法 建立基础特征 进一步构建预测模型 且基于新数据验证模型效果 拟使用 VAR 及LS
  • Oracle数据库精讲与疑难解析(第2版)

    Oracle数据库精讲与疑难解析 第2版 赵振平编著 ISBN978 7 121 20021 2 2013年4月出版 定价 148 00元 1100页 16开 编辑推荐 耗时3年 作者曾为本书辞职在家专心写作 754个实务 件件源自实际工作
  • 可视化Docker管理工具-DockerUI

    DockerUI 产品介绍 DockerUI是一个易用且轻量化的 Docker 管理工具 透过 Web 界面的操作 更方便对于 Docker 指令不熟悉的用户更快进入 Docker 的世界 DockerUI拥有易操作化化界面 不须记忆Doc
  • cmake(13):构建时设置预处理宏定义以及add_compile_definitions命令详解

    目录 1 说明 1 1 无参宏 1 2 有参宏 2 使用示例 3 命令解析 add compile definitions 命令 add definitions 命令 参考链接 1 说明 宏定义在程序设计中几乎是不可避免会用到的 在控制程序
  • linux上从github下载代码缓慢解决办法

    因为github服务器在国外 所以国内用户下载代码较慢 解决办法如下 修改hosts文件 crtl alt t打开终端 在终端中输入 gedit etc hosts 其中gedit是一个带图形界面的文本编辑器 操作如下 在hosts文件添加
  • 适合宝妈做的副业有哪些?

    选择成为一位全职妈妈 需要巨大的勇气和决心 一方面是带宝宝非常的辛苦 还要操持家务 另一方面是放弃赖以生存的工作 把自身的抗风险能力降到很低的水平线 我个人的观点是作为一个全职妈妈是很危险的 所以我比较赞成 作为全职妈妈的同时 尽可能用闲暇
  • html中浮动和定位(练习+知识点)

    目录 定位 1 什么是脱离文档流 2 position定位 2 1 static定位 2 2 relative定位 2 3 absolute定位 2 4 fixed定位 2 5 sticky定位 存在兼容性问题 层级属性z index 浮动
  • java ssh1_[置顶] java SSH1/SSH2远程连接实例

    看到网上有很多通过telnet实现远程登录的例子 就是找不到关于ssh远程登录的例子 ssh2的可能会有一些 但是目前开发项目遇到了比较底层的东西 这个需要通过ssh1连接的 于是就有了这个实例 今天要给大家带来的就是 java通过ssh1
  • 【数据结构】邻接矩阵法

    邻接矩阵 不带权 define MaxVertexNum 100 顶点的最大数目 typedef struct char Vex MaxVertexNum 顶点表 存放下标 复杂信息 int Edge MaxVertexNum MaxVer
  • 云计算虚拟化技术未来发展的趋势及应用(来源: 比特网)

    近两年 随着一些国际知名的虚拟化软件厂商在中国市场的大力开拓 虚拟化及云计算的概念越来越热 虚拟化软件市场大幅升温 同时也带动了一批国内的虚拟化软件企业迅速的发展起来 虚拟化技术从早期的企业应用 逐步过渡到公有云应用 应用范围越来越广泛 那
  • 刷题day22:逆波兰表达式求值

    题意描述 给你一个字符串数组 tokens 表示一个根据 逆波兰表示法 表示的算术表达式 请你计算该表达式 返回一个表示表达式值的整数 类似于二叉树 可以将运算符号看做二叉树的中间节点 遇到运算符之后计算前两个数字与该运算符的运算结果 C
  • 电阻的精度和温漂

    转载自 http blog sina com cn s blog 68b345970100jc2h html 电阻的精度和温漂 1 电阻温度系数 TCR 表示电阻当温度改变1度时 电阻值的相对变化 当温度每升高1 时 导体电阻的增加值与原来
  • python 字符串去除 等等转义空格换行字符

    python去除html特殊转义字符 下面这些是一些我在网上找的一些 好像都不管用 网络上面的一些方法好像都不管用 比如 str text replace str text replace u xa0 等等一些 我使用的时候好像都不管用 下
  • 匿名内部类方式实现线程创建的三种方式

    小demo package demo04 author wh date 2021年08月30日15 57 匿名内部类方式实现线程创建的三种方式 public class demo02 public static void main Stri
  • 企业级springboot项目架构模板V4.0,开箱即用

    此次 4 0 更新点 1 添加线程池的使用 2 Springboot版本更新2 7 0 解决部分冲突的依赖 3 所有表结构去除 ID 字段 不在使用ID作为主键 主键直接使用算法生成 4 解决过滤器 引起Druid监控无法访问的问题 5 F
  • 3.4 流式操作

    1 简介 1 概念 Stream是数据渠道 用于操作数据源所生成的元素序列 它可以实现对集合的复杂操作 例如过滤 排序和映射等 集合是一种静态的数据结构 存储在内存中 而Stream是通过CPU来实现计算的 并不会存储数据 Stream不会
  • linux 出错 “INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案

    1 问题描述 最近搭建的一个linux最小系统在运行到241秒时在控制台自动打印如下图信息 并且以后每隔120秒打印一次 仔细阅读打印信息发现关键信息是 hung task timeout secs 第一次遇到这样的问题 首先百度 通过翻看