[转帖]解读内核 sysctl 配置中 panic、oops 相关项目

解读,内核,sysctl,配置,panic,oops,相关,项目 · 浏览次数 : 0

小编点评

## 配置某种严重异常触发时内核的行为 **继续尝试执行触发 panic收集更多调试信息重启** * 当 config_DEBUG_STACKOVERFLOW 开启时,此项配置才会存在。 * 这项配置会在 panicsoftlockup_all_cpu_backtrace 变量中控制当 soft lockup 检测器线程检测到一个 soft lockup 时是否收集更多的调试信息。 **检测周期检测判定条件** * 当 config_DEBUG_STACKOVERFLOW 开启时,此项配置才会存在。 * 这项配置会在 panicsoftlockup_all_cpu_backtrace 变量中控制当 soft lockup 检测器线程检测到一个 soft lockup 时是否收集更多的调试信息。 **后续构造各种内核异常条件测试都将以本文的内容为基础!** * 此项配置会在 panicsoftlockup_all_cpu_backtrace 变量中控制当 soft lockup 检测器线程检测到一个 soft lockup 时是否收集更多的调试信息。 * 此项配置会在 kdump 时根据异常条件构造内核异常条件。 **检测周期检测判定条件** * 当 config_DEBUG_STACKOVERFLOW 开启时,此项配置才会存在。 * 这项配置会在 panicsoftlockup_all_cpu_backtrace 变量中控制当 soft lockup 检测器线程检测到一个 soft lockup 时是否收集更多的调试信息。 **后续构造各种内核异常条件测试都将以本文的内容为基础!** * 此项配置会在 kdump 时根据异常条件构造内核异常条件。 * 此项配置会在 kdump 时根据异常条件构造内核异常条件。 **总结** * 配置某种严重异常触发时内核的行为 * 继续尝试执行触发 panic收集更多调试信息重启 * 检测周期检测判定条件 * 后续构造各种内核异常条件测试都将以本文的内容为基础!

正文

写在前面

本篇文章的内容主要来自内核源码树 Documentation/admin-guide/sysctl/kernel.rst文件。

softlockup vs hardlockup

softlockup 是一种触发系统在内核态中一直循环超过 20 秒导致其它任务没有机会得到运行的 BUG。
hardlockup 是一种触发系统在内核态一直循环超过 10 秒导致其它中断没有机会运行的缺陷。

核心区别在于 softlockup 触发的时候中硬件中断仍旧能够正常运行。

如上信息摘自 Softlockup与hardlockup检测机制(又名:nmi_watchdog)

sysctl 配置中 panic、oops 相关项目

ftrace_dump_on_oops

配置当内核 oops 时是否调用 ftrace_dump函数打印 ftrace 缓冲区的内容到串口中,可用于获取触发内核 oops 时的 ftrace 跟踪内容来定位问题原因。

value含义
0关闭(默认配置)
1dump 所有 cpu 的 ftrace buffers
2dump 触发 oops cpu 的 ftrace buffers

hardlockup_all_cpu_backtrace

此配置控制当 hard lockup 检测器检测到一个 hard lockup 时是否收集更多调试信息的行为。当使能时,将会 dump 每种硬件架构特定的 cpu 栈信息。

value含义
0关闭(默认配置)
1当 hardlockup 检测到时收集所有 cpu 的栈信息

hardlockup_panic

配置在检测到 hard lockup 产生时是否触发内核 panic。

value含义
0不触发 panic
1触发 panic

hung_task_all_cpu_backtrace

当此选项设置时,当检测到一个 hung 住的任务时内核会向所有的 CPU 发送一个 NMI 中断来 dump 栈回溯信息。当 CONFIG_DETECT_HUNG_TASKCONFIG_SMP内核配置开启时此项配置才会存在。

value含义
0关闭(默认配置)
1使能

hung_task_panic

配置检测到一个 hung 住的任务时内核的行为,当CONFIG_DETECT_HUNG_TASK内核配置开启时此项配置才会存在。

value含义
0内核继续执行(默认配置)
1立刻触发 panic

hung_task_check_count

配置内核检查 hung 任务数量的最大值,当CONFIG_DETECT_HUNG_TASK内核配置开启时此项配置才会存在。

hung_task_timeout_secs

当一个任务处于 D 状态且超过了此项配置的时间未被调度时内核会告警,当CONFIG_DETECT_HUNG_TASK内核配置开启时此项配置才会存在。

value含义
0无限超时时间,不会做任何检查
0:LONG_MAX / HZ按照配置时间进行检查

hung_task_check_interval_secs

配置 hung task 检测的周期。当 hung task 检测使能时,检测将会在按照每 hung_task_check_interval_secss 进行,当CONFIG_DETECT_HUNG_TASK内核配置开启时此项配置才会存在。

value含义
0使用 hung_task_timeout_secs配置作为检测周期(默认值)
0:LONG_MAX / HZ按照配置时间周期性进行检查

hung_task_warnings

配置告警的最大数量。在一个检测周期内检测到 hung 住任务时,该值会减 1,当该值为 0 时,后续告警信息不会再报告。当CONFIG_DETECT_HUNG_TASK内核配置开启时此项配置才会存在。

当配置为 -1 时表示不限制报告次数。

hyperv_record_panic_msg

控制 panic kmsg 数据是否要报告给 Hyper-V。

value含义
0不报告
1报告(默认配置)

nmi_watchdog

这个参数可以用来控制 x86 系统中 NMI watchdog(用于 hard lockup 检测器)的行为。

value含义
0关闭 hard lockup 检测器
1打开 hard lockup 检测器

hard lockup 检测器工作原理:

监控每一个 cpu 相应时钟中断的能力。该机制利用 CPU 性能计数寄存器,这些寄存器被编程为在 CPU 繁时周期性生成不可屏蔽中断(NMI),因此被称为 “NMI watchdog”。

当内核在一个 KVM 虚拟机器中作为 guest 运行时,NMI watchdog 默认关闭。可以在 guest 内核命令行中添加 nmi_watchdog=1来覆盖默认行为,以使能 nmi watchdog 功能。

oops_all_cpu_backtrace

当该配置设置时,当一个 oops 事件产生时内核将会向所有的 CPU 发送一个 NMI 中断来 dump 栈回溯信息。当 panic 不能触发时、kdump 不能工作时(例如为了保护正在运行的 VMs)它可以作为最后的报告手段。当CONFIG_SMP内核配置开启时此项配置才会存在。

value含义
0关闭(默认行为)
1开启

panic

此配置决定了内核触发 panic 后的行为。

value含义
0内核持续 loop
负数内核立刻重启
正数内核将会在配置的 s 数后重启

当使用了软件看门狗时,建议的配置是 60s。

panic_on_io_nmi

配置当一个 CPU 收到了由于 IO 错误触发的 NMI 中断时的内核行为。

value含义
0尝试继续运行(默认行为)
1立刻触发 panic

panic_on_oops

配置当一个 oops、内核 BUG 产生时内核的行为。

value含义
0尝试继续运行
1立刻触发 panic(当 sysctl panic 配置设置为非 0 值时机器将会重启)

panic_on_stackoverflow

配置当检测到不包含用户栈之外的内核栈、中断栈、异常栈溢出时的内核行为,当CONFIG_DEBUG_STACKOVERFLOW内核配置开启时此项配置才会存在。

value含义
0尝试继续运行
1立刻触发 panic

panic_on_unrecovered_nmi

当一个 memory NMI、其它未知 NMI 中断触发时,Linux 的默认行为是继续向下执行。在大多数环境例如科学计算中,最好取出盒子并处理错误,而不是传播未校正的奇偶校验/ ECC 错误。

少数系统可能会出于奇怪的随机原因(如电源管理)产生 NMI,因此默认设置为关闭。

panic_on_warn

当配置时,内核执行到 WARN 语句是会调用 panic 接口,能够实现在 WARN 的位置尝试 kdump 时避免重新编译内核。

value含义
0只打印 WARN 信息(默认行为)
1打印出 WARN 的位置后调用 panic

panic_print

使用位掩码控制 panic 触发时打印的系统信息。用户可以选择组合如下的位:

功能
bit 0打印所有的任务信息
bit 1打印系统内存信息
bit 2打印定时器信息
bit 3当 CONFIG_LOCKDEP 开启式打印锁信息
bit 4打印 ftrace buffer

要在 panic 的时候打印进程和内存信息,可以执行如下命令:

echo 3 > /proc/sys/kernel/panic_print
  • 1
复制

panic_on_rcu_stall

当设置为 1 时,将会在 RCU stall 检测信息打印后调用 panic 函数,可以用于生成一个 vmcore 定位 RCU stalls 问题。

value含义
0不调用 panic(默认行为)
1调用 panic

softlockup_all_cpu_backtrace

该值控制当 soft lockup 检测器线程检测到一个 soft lockup 时是否收集更多的调试信息。当使能时,每个 cpu 将会被报告一个 NMI 并指示捕获栈帧。
该属性只有当架构支持 NMI 的时候才能使用。

value含义
0啥也不做(默认行为)
1捕获更多的调试信息

softlockup_panic

该值控制当 soft lockup 被检测到时是否触发内核 panic。

value含义
0不触发 panic
1触发 panic

soft_watchdog

该值可用于控制 soft lockup 检测器的开启与关闭。

value含义
0关闭 soft lockup 检测
1开启 soft lockup 检测

soft lockup 检测器会监控每个 cpu 上持续占用 cpu 且没有主动重新调度的线程,进而阻止 ‘watchdog/N’ 线程的运行。

该机制依赖 cpu 正常响应时钟中断来周期性调用 watchdog 时间函数来唤醒 ‘watchdog/N’ 。

watchdog

该参数可用于同时配置 soft lockup 检测器与 NMI watchdog 的关闭与开启 。

value含义
0关闭 soft 与 hard lockup 检测
1开启 soft 与 hard lockup 检测

soft lockup 检测器与 NMI watchdog 也可以使用 soft_wathdognmi_watchdog配置项单独控制。

watchdog_cpumask

该参数用于配置 watchdog 运行的 cpu 核掩码。默认的配置为在所有可能的 cpu 核上运行,但当内核配置开启了 NO_HZ_FULL 功能且通过内核启动参数配置某些核开启 nohz_full 时,这些核上默认将不会运行 watchdog。该掩码可以包含那些离线的核,当这些核稍后变为在线状态时,watchdog 会按照掩码值启动。

通常该掩码被用来在那些因为开启了 nohz_full 功能而没有运行 watchdog 的核上开启 watchdog 以检测这些合上是否存在 lockup。

要在 0 2 3 和 4 核上开启 watchdog,可以执行如下命令:

  echo 0,2-4 > /proc/sys/kernel/watchdog_cpumask
  • 1
复制

watchdog_thresh

该值可用于控制 hrtimer 与 NMI 事件的频率以及 soft 和 hard lockup 的水位线。默认水位线为 10s,softlockup 的水位线为 2*watchdog_thresh(默认 20s),当将该配置设置为 0 时 lockup 检测功能也会关闭。

总结

上述内容可以分为如下几个类别:

  1. 配置某种严重异常触发时内核的行为
    1. 继续尝试执行
    2. 触发 panic
    3. 收集更多调试信息
    4. 重启
  2. 配置异常检测功能的内部参数
    1. 检测周期
    2. 检测判定条件

后续构造各种内核异常条件测试都将以本文的内容为基础!

</article>
复制

与[转帖]解读内核 sysctl 配置中 panic、oops 相关项目相似的内容:

[转帖]解读内核 sysctl 配置中 panic、oops 相关项目

写在前面 本篇文章的内容主要来自内核源码树 Documentation/admin-guide/sysctl/kernel.rst文件。 softlockup vs hardlockup softlockup 是一种触发系统在内核态中一直循环超过 20 秒导致其它任务没有机会得到运行的 BUG。 h

[转帖]操作系统专家解读 openEuler 22.09 最新技术特性

https://linux.cn/article-15326-1.html 前不久,欧拉社区发布了今年的创新版本 openEuler 22.09。作为欧拉社区贡献给开放原子开源基金会后的首个创新版本,此版本中新增了 2012 万行代码,其中仅在 Linux 内核上就新增了 4.8 万行代码,全量代码

[转帖]一文解决内核是如何给容器中的进程分配CPU资源的?

https://zhuanlan.zhihu.com/p/615570804 现在很多公司的服务都是跑在容器下,我来问几个容器 CPU 相关的问题,看大家对天天在用的技术是否熟悉。 容器中的核是真的逻辑核吗? Linux 是如何对容器下的进程进行 CPU 限制的,底层是如何工作的? 容器中的 thr

[转帖]解读两大精简指令集:RISC-V和MIPS

https://www.bilibili.com/read/cv14392730?spm_id_from=333.999.0.0 关注 来源:内容来自「SIMIT战略研究室」,谢谢。 当前CPU的两大架构是CISC(复杂指令集)和RISC(精简指令集),x86是CISC的代表架构,占领了95%以上的

[转帖]解读CPU架构:X86、ARM、MIPS、IRSC-V、CISC

https://www.cnblogs.com/zhangxinglong/p/15019549.html CPU发挥“大脑”的功能,负责数据的处理和运算, CPU 与 GPU 、内存、硬盘和网卡间并不能直接通信,需要通过内存控制芯片、 PCIe 控制芯片和 I/O 处理芯片等实现,这类通信协调芯片

[转帖]性能案例-Linux下解决time_wait连接过多(Linux内核优化)

一、性能测试的主要概念和计算公式 系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。 单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。 系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间

[转帖]Linux内核参数net.ipv4.ip_local_port_range对服务器连接数影响的正确解释

首先明确一下该参数的意义:net.ipv4.ip_local_port_range表示本机作为客户端对外发起tcp/udp连接时所能使用的临时端口范围。 对于TCP连接,本机所能发起的tcp连接数受四元组(源地址*源端口*目标地址*目标端口)限制。 而对于UDP连接,本机所能发起的udp连接数则受二

[转帖]三篇文章了解 TiDB 技术内幕 - 谈调度

返回全部 申砾产品技术解读2017-06-06 为什么要进行调度 先回忆一下 三篇文章了解 TiDB 技术内幕 - 说存储 提到的一些信息,TiKV 集群是 TiDB 数据库的分布式 KV 存储引擎,数据以 Region 为单位进行复制和管理,每个 Region 会有多个 Replica(副本),这

[转帖]NOHZ = ON如何影响Linux内核中的do_timer()?

https://www.jb51.cc/faq/897483.html 如何解决NOHZ = ON如何影响Linux内核中的do_timer()?? 首先,让我们了解什么是tickless kernel(NOHZ=On或CONfig_NO_HZ集合)以及从何将其引入Linux内核的动机。2.6.17

[转帖]Linux之Shell 脚本执行三种方式

什么是Shell? Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash ShellShell也是一门编程语言<解释型的编程语言>,即shell脚本一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支