news 2026/1/1 17:42:51

Redhat 8.8 system hang 挂起

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redhat 8.8 system hang 挂起

某服务器操作系统挂起无反应,查询日志可以看到如下内容:

Nov 10 06:51:01 localhost kernel: Tainted: G OE --------- - - 4.18.0-477.10.1.el8_8.x86_64 #1
Nov 10 06:51:01 localhost kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Nov 10 06:51:01 localhost kernel: task:filebeat state:D stack: 0 pid:13205 ppid: 1 flags:0x00000080
Nov 10 06:51:01 localhost kernel: Call Trace:
Nov 10 06:51:01 localhost kernel: __schedule+0x2d1/0x870
Nov 10 06:51:01 localhost kernel: ? call_function_interrupt+0xa/0x20
Nov 10 06:51:01 localhost kernel: schedule+0x55/0xf0
Nov 10 06:51:01 localhost kernel: io_schedule+0x12/0x40
Nov 10 06:51:01 localhost kernel: migration_entry_wait_on_locked+0x1ea/0x290
Nov 10 06:51:01 localhost kernel: ? filemap_fdatawait_keep_errors+0x50/0x50
Nov 10 06:51:01 localhost kernel: do_swap_page+0x5b0/0x710
Nov 10 06:51:01 localhost kernel: ? pmd_devmap_trans_unstable+0x2e/0x40
Nov 10 06:51:01 localhost kernel: ? handle_pte_fault+0x5d/0x880
Nov 10 06:51:01 localhost kernel: __handle_mm_fault+0x453/0x6c0
Nov 10 06:51:01 localhost kernel: handle_mm_fault+0xca/0x2a0
Nov 10 06:51:01 localhost kernel: __do_page_fault+0x1f0/0x450
Nov 10 06:51:01 localhost kernel: do_page_fault+0x37/0x130
Nov 10 06:51:01 localhost kernel: ? page_fault+0x8/0x30
Nov 10 06:51:01 localhost kernel: page_fault+0x1e/0x30
Nov 10 06:51:01 localhost kernel: RIP: 0033:0x15c297e
Nov 10 06:51:01 localhost kernel: Code: Unable to access opcode bytes at RIP 0x15c2954.

原因分析:

filebeat 进程在内存缺页(page fault)时,被阻塞在 swap / 页回迁(page migration)过程中,长期等待 IO,触发 hung task 检测。

本质不是 filebeat bug,而是:

  • 内存压力过大

  • swap / 后端存储(磁盘 / SAN / 虚拟磁盘)IO 卡顿

  • 或 NUMA / 内存页迁移被锁住导致内核线程无法继续调度。

Tainted: G OE --------- - -

标志含义
G内核是“干净的”(没有严重内核错误)
O加载了 out-of-tree module(非官方内核模块)
E出现过 error(通常是 driver 或硬件 error)

Red Hat 知识库文章(Solution 7014646)描述了RHEL 8.8 或 RHEL 8.6 EUS 上出现hung_task_timeout_secs+migration_entry_wait_on_locked的现象。

Resolution

Red Hat Enterprise Linux 8.8

  • The issue has been resolved withkernel-4.18.0-477.13.1.el8_8via errata: RHSA-2023:3349.

Raw

# rpm -qp kernel-4.18.0-477.13.1.el8_8.x86_64.rpm --changelog | grep 2188249 - migrate: grab the compound head in migration_entry_wait_on_locked (Nico Pache) [2189629 2188249]

Possible workaround:

  • Boot the system with an older kernel released before the RHEL8.8 (GA).

Root Cause

  • There is a regression bug since RHEL8 kernel commita598e2338f01 ("mm/migrate.c: rework migration_entry_wait() to not take a pageref")was introduced in RHEL-8.8 (GA).

  • The RHEL-8.8 kernel patch note explains how to resolve the issue:

Raw

commit f20af36bf5b7c25b94f73263629c202753d470d7 Author: Nico Pache <npache@redhat.com> Date: Mon Apr 24 14:18:16 2023 -0600 migrate: grab the compound head in migration_entry_wait_on_locked Y-Commit 22609d42496e64d42bbb79b6929d2b6c3b47fc2f RHEL commit a598e2338f01 ("mm/migrate.c: rework migration_entry_wait() to not take a pageref") differs from upstream due to the folio changes. In converting the function to work with the page struct I mistakenly forgot to make sure we are operating on the compound page head. Without this we are occasional splats of hung tasks due to the page never being woken up. Upstream-status: RHEL-only O-Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2188249 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2189629 Signed-off-by: Nico Pache <npache@redhat.com> diff --git a/mm/filemap.c b/mm/filemap.c index b8fa03e9a685..5b13e47f1fbe 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1401,7 +1401,7 @@ void migration_entry_wait_on_locked(swp_entry_t entry, pte_t *ptep, unsigned long pflags; bool in_thrashing; wait_queue_head_t *q; - struct page *page = pfn_swap_entry_to_page(entry); + struct page *page = compound_head(pfn_swap_entry_to_page(entry)); q = page_waitqueue(page); if (!PageUptodate(page) && PageWorkingset(page)) {

RHEL 8.8 内核在回迁 swap / migration 页时,没有确保操作的是 compound page 的 head page,导致 waitqueue 绑错 page,对应的唤醒永远不会发生,从而触发 hung task。

migration_entry_wait_on_locked do_swap_page hung_task_timeout_secs

正是这个 bug 的直接表现。


migration_entry_wait_on_locked 是干嘛的?

1️⃣ 典型调用路径

page_fault └─ handle_mm_fault └─ do_swap_page └─ migration_entry_wait_on_locked └─ io_schedule

2️⃣ migration_entry_wait_on_locked 的职责

当:

  • page 正在内存迁移(NUMA / compaction / swap in)

  • 或 page 正在被 IO 填充

  • 并且 page 被lock 住

👉 当前 task必须 sleep,等迁移完成后被唤醒。

关键点:

这个“等”和“唤醒”,是通过page 对应的 waitqueue完成的。


真正的 bug:compound page 用错了 page 指针

1️⃣ 什么是 compound page(重点)

在 RHEL 8.x(引入 folio 之前/期间):

  • THP(Transparent Huge Page)

  • huge page

  • 大文件 cache page

都会用compound page表示:

compound page: head page ← 唯一合法的“控制页” tail page tail page ...

📌规则:

  • 锁(PageLocked)

  • waitqueue

  • 唤醒
    👉都只发生在 head page 上


2️⃣ 出问题的旧代码(buggy)

struct page *page = pfn_swap_entry_to_page(entry);

问题在这里 👆

  • pfn_swap_entry_to_page()
    👉可能返回的是 tail page

  • 而不是 compound head


3️⃣ 后果是什么?(非常致命)

接下来代码做了什么:

q = page_waitqueue(page); wait_event(q, ...);

但如果:

  • 你在tail page 的 waitqueue 上睡眠

  • 真正的唤醒发生在 head page

👉结果:

  • 迁移完成 ✔

  • head page 上 wake_up ✔

  • 但 task 睡在 tail page 的 waitqueue ❌

  • 永远等不到唤醒

这就解释了你看到的:

task state: D hung_task_timeout_secs

⚠️不是 IO 真慢,而是“唤醒丢失”


四、commit 是怎么修的?

1️⃣ 核心修复只有一行(但非常关键)

- struct page *page = pfn_swap_entry_to_page(entry); + struct page *page = compound_head(pfn_swap_entry_to_page(entry));

2️⃣ 这个改动的意义

强制保证:

  • 无论 swap entry 指向的是:

    • head page

    • 还是 tail page

  • 最终操作的一定是 compound head

从而保证:

  • waitqueue 正确

  • wake_up 一定能唤醒所有等待者

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/24 19:47:55

2026年慕尼黑上海电子展盛大开幕:赋能PCB行业新机遇

产业转移与中国大陆的核心地位近年来&#xff0c;全球电子信息制造业的重心持续向亚洲转移。在这一过程中&#xff0c;中国大陆凭借其在劳动力资源、政策支持、以及强大的产业链集群等方面的显著优势&#xff0c;已成为全球PCB&#xff08;印制电路板&#xff09;产业承接和发展…

作者头像 李华
网站建设 2025/12/24 11:56:07

基于JavaWeb的图书馆管理系统_81498d4n_图书借阅,图书阅读系统

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2025/12/25 7:22:51

基于SpringBoot的婚纱影楼服务平台设计和实现_0uwse39z

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作具体实现截图 本系统&#xff08;程序源码数据库调试部署讲解&#xff09;同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2025/12/24 6:56:31

农田小气候观测系统;十二要素农业气象站

Q1&#xff1a;我家就 2 个蔬菜大棚&#xff0c;面积不大&#xff0c;适合装农田小气候站吗&#xff1f;会不会太复杂&#xff1f;​ A1&#xff1a;完全适合&#xff01; 农田小气候站专为农业生产设计&#xff0c;不管是 1-2 个小大棚&#xff0c;还是规模化种植基地&#x…

作者头像 李华
网站建设 2025/12/25 23:58:48

数字化转型核心选型:CRM客户 / 销售 / 生产 / AI / 集成全维度能力解析

在数字化转型浪潮中&#xff0c;企业对CRM的需求已从“客户信息记录”升级为“全链路业务协同”——既要管好客户、销售、市场&#xff0c;也要打通进销存、生产甚至供应链。本文选取超兔一体云、Salesforce、钉钉CRM、SAP CRM、Microsoft Dynamics 365、金蝶六大主流CRM&#…

作者头像 李华
网站建设 2025/12/25 14:56:23

中山GEO优化:立足中山,辐射湾区,助力B2B企业区域品牌突围

随着中山GEO优化技术的飞速发展&#xff0c;越来越多的B2B企业开始意识到本地化SEO优化在区域品牌塑造中的重要性&#xff0c;尤其是对于像中山这样的产业集群城市。GEO优化作为一种基于位置的搜索引擎优化策略&#xff0c;为B2B企业提供了精准覆盖本地市场及周边湾区市场的机会…

作者头像 李华