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

2023-05-16

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_ratio 和 vm.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
1

由上图可知,当前环境下,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
1
2

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

在命令行输入(1)中的指令即可。

由上图可知,参数修改成功。

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

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

sysctl -p
1
(5)观察测试结果。

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

2.2 修改系统IO调度策略

Linux的IO共有三种调度器:CFQ、noop、deadline。每个调度器都有其优点。

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
1

由内核返回信息可知,当前采用的是cfq调度器。

(2)修改调度器。

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

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

(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
1

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

(2)修改hung_task_timeout_secs值。

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

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

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

在命令行输入(1)中的指令即可。

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

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

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

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

3 永久修改内核参数

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

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

vm.dirty_background_ratio=5
vm.dirty_ratio=10
1
2

保存后重启系统,查看配置是否成功。

如果系统没有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

作者:electrocrazy
来源:CSDN
原文:https://blog.csdn.net/electrocrazy/article/details/79377214
版权声明:本文为博主原创文章,转载请附上博文链接!

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

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

  • 飞控板不用看得高大上,本质就是STM32加那几个传感器,和平衡车板子差不多,是完全可以自己画的,甚至不用画,买个STM32核心板+十轴模块

    你自己画一块板子 xff0c 然后真正飞成了 xff0c 我觉得你会非常开心的 xff0c 这种感觉不一样的我觉得 xff0c 你说是不是 飞控我们不用看得高大上 xff0c 本质还是STM32加传感器 xff0c 可能和平衡车的差不多 x
  • 搜刮来的PID进阶

    PID 原理普及 1 对自动控制系统的基本要求 xff1a 稳 准 快 xff1a 稳定性 xff08 P和I降低系统稳定性 xff0c D提高系统稳定性 xff09 xff1a 在平衡状态下 xff0c 系统受到某个干扰后 xff0c 经
  • C语言中<>和“”引用头文件的区别

    区别如下 xff1a 1 lt gt 先去系统目录中找头文件 xff0c 如果没有再到当前目录下找 所以像标准的头文件 stdio h和 stdlib h等用这个方法 2 34 34 首先在当前目录下寻找 xff0c 如果找不到 xff0c
  • ACfly中的Parameters.c参数部分

    typedef enum MAV PARAM TYPE MAV PARAM TYPE UINT8 61 1 8 bit unsigned integer MAV PARAM TYPE INT8 61 2 8 bit signed integ
  • C++Primer第五版 习题答案 目录

    C 43 43 Primer第五版 习题答案 本文当作我学习C 43 43 的一个记录 xff0c 这里的习题答案并不是标准答案 xff0c 仅仅是我的理解 xff0c 如有错误 xff0c 请大家指出 xff0c 谢谢 xff01 参考的
  • C++Primer第五版 习题答案 第六章 函数(Functions)

    练习6 1 实参和形参的区别的什么 xff1f 形参在函数的定义中声明 xff1b 实参是形参的初始值 练习6 2 请指出下列函数哪个有错误 xff0c 为什么 xff1f 应该如何修改这些错误呢 xff1f span class toke
  • Dockerfile的CMD指令

    一 Docker的CMD指令 The main purpose of a CMD is to provide defaults for an executing container CMD在容器运行的时候提供一些命令及参数 xff0c 用法
  • usb供电相关

    1 针对集线器端口上的电涌警告 xff1a 在 设备管理器 gt 通用串行总线控制器 xff0d USB Root Hub gt 电源 中可以看到 xff0c 正在使用的USB设备的耗 由于频繁的插拔USB设备 xff0c 或在USB设备传
  • PHP四种设计模式

    1php常见开发模式 xff1a 1 单列模式 2 工厂模式 3 观察者模式 4 策略模式 2设计模式实例 1 单例模式 单例模式顾名思义 xff0c 就是只有一个实例 作为对象的创建模式 xff0c 单例模式确保某一个类只有一个实例 xf
  • CAN总线基础知识(一)

    1 xff0e CAN总线是什么 xff1f CAN xff08 Controller Area Network xff09 是ISO国际标准化的串行通信协议 广泛应用于汽车 船舶等 具有已经被大家认可的高性能和可靠性 CAN控制器通过组成
  • 【ROS Gazebo专题】二、Gazebo的使用上

    跳的比较快 xff0c 别人光介绍基础以及ros的基本操作就写了十几二十篇 xff0c 我一下就跳到了Gazebo这 xff0c 可怕有没有 其实原因很简单 xff0c 如果你将ros官网的基础篇章练习完了 xff0c 在最后一篇 wher
  • 程序员也该懂点UI细节

    虽然说项目开发过程中 xff0c 美工和程序各司其职 但是很多时候程序员本身也要知道一些UI设计的细节 一 每个页面的功能上要突出重点 比如说你首页是想引导更多用户注册的话 xff0c 你就要把注册按钮突出出来 如果你首页是你想引导用户更快
  • ftp 客户端软件的传输模式ASCII和二进制

    FTP可用多种格式传输文件 xff0c 通常由系统决定 xff0c 大多数系统 包括UNIX系统 只有两种模式 xff1a 文本模式和二进制模式 文本传输器使用ASCII字符 xff0c 并由回车键和换行符分开 xff0c 而二进制不用转换
  • 一步一步定制自己的google map(各个省市的经纬度查询)

    安徽省 合肥 北纬31 52 东经117 17 安徽省 安庆 北纬30 31 东经117 02 安徽省 蚌埠 北纬32 56 东经117 21 安徽省 亳州 北纬33 52 东经115 47 安徽省 巢湖 北纬31 36 东经117 52
  • 网页刷新或者重新加载后滚动条的位置不变

    在开发的过程中我们经常需要重新加载或者刷新某个画面 xff0c 已确保数据显示是最新的 但是如果一丁点改变就刷新画面的话 xff0c 会导致用户体验很差 xff0c 想想看你好不容易把网页拖到最后 xff0c 结果点击某个按钮的时候 xff
  • 番茄工作法(番茄钟时间管理)

    番茄工作法是我一次偶然的时间在网上看到的 xff0c 因为自己性格大大咧咧 丢三落四 xff0c 所以经常容易在时间问题上犯迷糊 很多人都有时间拖沓症 xff0c 就是一件事不到最后阶段不去解决它 比如你有一个星期的时间写的毕业论文 xff
  • jquery中美元符号($)命名冲突

    在Jquery中 xff0c 是JQuery的别名 xff0c 所有使用 的地方也都可以使用JQuery来替换 xff0c 如 39 msg 39 等同于JQuery 39 msg 39 的写法 然而 xff0c 当我们引入多个js库后 x
  • Django的密码操作

    一 关于密码操作的思维导图 二 修改密码内置函数源码 64 sensitive post parameters 64 csrf protect 64 login required 64 deprecate current app def p
  • js实现省市联动

    效果图如下 xff1a 思路很简单 xff0c 就是先加载省信息 xff0c 然后当省改变的时候加载市县信息 烦的是数据的录入 xff0c 代码如下 lt DOCTYPE html PUBLIC 34 W3C DTD XHTML 1 0 T
  • 正则在小偷程序中的应用(续)

    获取资源信息 content 61 file get contents 34 http list sososteel com qg list html pg 61 1 amp h 61 34 time 对抓取的信息进行处理 取class为l

随机推荐

  • mysql密码过期问题解决方案

    mysql密码过期问题解决方案 问题再现 xff1a 密码过期 旧电脑许久没有用 xff0c 今天打开发现数据库连接不上了 提示密码过期 xff0c 请修改密码 ERROR 1862 HY000 Your password has expi
  • Fast RTPS(DDS) 安装指南

    Foonathan Memory 在构建 Fast DDS 之前 xff0c 需要先安装 Foonathan Memory 依赖 span class token function git span clone https github c
  • ubuntu的两种软件安装方式

    第一种 xff1a sudo apt get install xxxxxxx 第二种 xff1a sudo dpkg i xxxx deb 参考文章
  • Ethernet下字节序和bit序的总结

    Ethernet下字节序和bit序的总结 本文讲述的是在ethernet中多字节数据发送时涉及到字节序和bit序的剖析 关于字节序 大小端 和bit序 xff0c 以及MSB和LSB的叙述 xff0c 请另行学习 xff0c 本篇不涉及 正
  • C++ 智能指针 unique_ptr 详解与示例

    unique ptr 是 C 43 43 11 提供的用于防止内存泄漏的智能指针中的一种实现 xff0c 独享被管理对象指针所有权的智能指针 unique ptr对象包装一个原始指针 xff0c 并负责其生命周期 当该对象被销毁时 xff0
  • ECMAScript 6 中的数组方法 - forEach

    let colors 61 red blue green es5 遍历数组的方法 span class hljs keyword for span let span class hljs keyword index span 61 span
  • ECMAScript 6 中的数组方法 - map

    span class hljs variable span 场景 span class hljs number 1 span 假设有一个数字数组 xff08 a xff09 xff0c 奖a数组中的值一双倍的形式放到b数组 span cla
  • 写在Paper Reading之前

    写在Paper Reading 之前 2016年第一篇文章 xff0c 就以paper reading开头 xff0c 这段时间最少写五篇 xff0c 达到申请专栏的条件 通过申请专栏 xff0c 也可以达到监督作用 xff0c 催促自己多
  • C++进程PID编程

    一 获取pid t的字节长度 1 代码 include lt iostream gt using namespace std int main int argc char argv pid t pid cout lt lt 34 sizeo
  • 异常检测——集成学习

    Ensembles for Unsupervised Outlier Detection Challenges and Research Questions 首先 xff0c 知道一个模型好不好 xff08 精确不 xff09 外部指标内部
  • Centos 防火墙

    一 对于centos7自带的防火墙的相关指令 systemctl stop firewalld service 停止firewall systemctl disable firewalld service 禁止firewall开机启动 sy
  • MissionPlanner编译流程及问题详解

    MissionPlanner编译流程及问题详解 一 xff0c 介绍 MissionPlanner是一款基于C 开发的开源的地面站软件 xff0c 主要用在Windows Linux平台 MP使用广泛 xff0c 提供了较为完善的功能 xf
  • 学术论坛第三期:多指标异常检测方法综述

    学术论坛 第三期 推荐阅读时长 xff1a 13min 前言 朋友们 xff01 本期内容干货满满 xff01 参考文献引用30余篇 xff01 xff01 答应我这篇文章一定要看 xff01 xff01 xff01 本期论坛我们邀请中国人
  • 数据平台与Flink任务运行原理介绍

    本文将从5个方面详细介绍数据平台大数据任务开发的基础知识 包含数据平台的简介 如何在平台内创建Flink表 如何编写Flink大数据处理作业 Flink任务启动时的调用流程以及Flink web UI 任务监控页面 此外 xff0c 将重点
  • vue中模板和组件分离

    vue中模板和组件分离 第一种 xff1a 使用script xff0c 将其类型跟改为text x template 代码示例如下 xff1a span class token operator lt span span class to
  • vue中的生命周期(钩子函数)

    vue中的生命周期 xff08 钩子函数 xff09 下图是整个vue的生命周期 生命周期共有八个钩子函数 生命周期 xff1a vue是一个构造函数 xff0c 执行这个函数的时候 xff0c 即相当于实例化了这个函数 xff0c 因此我
  • paddle的两阶段基础算法基础

    paddle的两阶段基础算法详解与实践 有三部分分别是 xff1a 1 xff0c 两阶段算法发展历程 2 xff0c Faster R CNN原理解析 3 xff0c Paddle Detection实战演练 一 xff1a 两阶段算法的
  • Faster R-CNN网络架构

    Faster R CNN网络架构原理解析 Anchor的第一个分支是一个分类分支负责判断途中有没有东西 xff0c 但是不会判断物品 第二个分支是回归分支表示Anchor和真实值有多远最终提取的候选框尽量向真实值靠拢 RPN层是如何提取候选
  • Faster R-CNN原理详解

    Faster R CNN原理详解 首先将RPN输出以及将anchor解码 xff0c 然后对预测框进行clip xff0c 然后对预测狂进行过滤 xff0c filter将面积太小的过滤掉 xff0c 然后将分数较低的去掉 xff0c NM
  • linux出现“INFO: task xxxxxx: 634 blocked for more than 120 seconds.”的3种解决方案

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