Linux下EDAC功能介绍

一、背景介绍

  1. edac 目的是在linux系统运行过程中,当内存错误发生时,能够发现并且报告出硬件错误
  2. 当内存硬件有ECC功能时,如果在BIOS中使能了内存ECC,不管内核是否启用edac,内存硬件ECC功能都会使能,由硬件自动执行纠错

二、测试环境说明

  1. 硬件:鲲鹏920 96核
  2. 系统:KY3.5-2, kernel5.10
  3. 内核配置项:
    CONFIG_EDAC_SUPPORT=y
    CONFIG_EDAC=y
    CONFIG_EDAC_LEGACY_SYSFS=y
    CONFIG_EDAC_DEBUG=y
    CONFIG_EDAC_GHES=y
    CONFIG_EDAC_THUNDERX=m
    CONFIG_EDAC_XGENE=m
    

    三、内存CE注入

采用rasdaemon工具进行内存错误注入

Rasdaemon(及其模拟工具,如 edac-fake-inject)

功能和实现

软件实现:Rasdaemon 是基于软件的错误注入工具,主要用于收集和报告 RAS(Reliability, Availability, Serviceability)事件。edac-fake-inject 是 Rasdaemon 提供的一个模拟工具,用于注入虚拟的内存错误。

错误类型:主要用于模拟内存错误,通过软件生成虚拟错误事件,并将这些事件注入到系统中。

注入过程:通过软件配置虚拟错误类型、内存地址和其他参数,然后触发虚拟错误注入。这些虚拟错误不会由硬件触发,而是直接注入到系统错误报告机制中。

灵活性:由于是软件实现,不依赖于特定的硬件和 BIOS 支持,可以在任何系统上使用。

使用场景:

适用于需要快速模拟和测试错误处理机制的场景,例如验证软件错误处理路径、开发和测试 RAS 事件收集工具。

不需要特定的硬件支持,适合于广泛的开发和测试环境。

下载地址:https://github.com/mchehab/rasdaemon

rasdaemon tag v0.8.0

cd rasdaemon-master/contrib./edac-fake-inject

可以看到内核打印:

[  666.986366] Generating 1 CE fake error to 12.0.0 to test core handling. NOTE: this won't test the driver-specific decoding logic.
[  666.986369] EDAC MC0: 1 CE FAKE ERROR on SOCKET 0 CHANNEL 6 DIMM 0 DIMM0 (memory:12 page:0x0 offset:0x0 grain:128 syndrome:0x0 - for EDAC testing only)
[  666.986410] Generating 1 CE fake error to 13.0.0 to test core handling. NOTE: this won't test the driver-specific decoding logic.
[  666.986412] EDAC MC0: 1 CE FAKE ERROR on unknown memory (memory:13 page:0x0 offset:0x0 grain:128 syndrome:0x0 - for EDAC testing only)
cat /sys/devices/system/edac/mc/mc0/ce_count
32

可以看到ce 错误值也变成了32

注意:

1. 这些错误注入是通过软件模拟的,并不是真实的硬件错误。它们主要用于测试系统中的错误检测和处理功能,例如 EDAC(Error Detection and Correction)机制的工作方式。

2. 验证系统响应。通过这种方式,可以验证系统是否能够正确地检测到模拟的错误情况,并是否采取适当的措施进行处理,例如记录日志或者报告给管理员。

查看edac-fake-inject 的实现过程,其实也是一个可执行脚本。

所以,这个脚本并没有真正触发硬件上的内存错误,而是通过 debugfs 接口模拟错误注入,以便测试系统中的错误处理功能。

它是用来测试和验证系统对错误情况的响应能力,而不是真实地引发硬件故障。

附:X86平台下查看EDAC指令

[root@node3-0 ~]# cd /sys/devices/system/edac/mc/
mc0/ power/ subsystem/
[root@node3-0 ~]# cd /sys/devices/system/edac/mc/mc0/
[root@node3-0 mc0]# ls
ce_count csrow0 dimm12 dimm3 mc_name reset_counters size_mb ue_
ce_noinfo_count dimm0 dimm15 max_location power seconds_since_reset subsystem ue_
[root@node3-0 mc0]# cd csrow0/
[root@node3-0 csrow0]# ls
ce_count ch0_dimm_label ch1_dimm_label ch4_dimm_label ch5_dimm_label edac_mode po
ch0_ce_count ch1_ce_count ch4_ce_count ch5_ce_count dev_type mem_type si
[root@node3-0 csrow0]# ls -l
总用量 0
-r--r--r--. 1 root root 4096 10月 10 17:00 ce_count
-r--r--r--. 1 root root 4096 10月 10 17:00 ch0_ce_count
-rw-r--r--. 1 root root 4096 10月 10 17:00 ch0_dimm_label
-r--r--r--. 1 root root 4096 10月 10 17:00 ch1_ce_count
-rw-r--r--. 1 root root 4096 10月 10 17:00 ch1_dimm_label
-r--r--r--. 1 root root 4096 10月 10 17:00 ch4_ce_count
-rw-r--r--. 1 root root 4096 10月 10 17:00 ch4_dimm_label
-r--r--r--. 1 root root 4096 10月 10 17:00 ch5_ce_count
-rw-r--r--. 1 root root 4096 10月 10 17:00 ch5_dimm_label
-r--r--r--. 1 root root 4096 10月 10 17:00 dev_type
-r--r--r--. 1 root root 4096 10月 10 17:00 edac_mode
-r--r--r--. 1 root root 4096 10月 10 17:00 mem_type
drwxr-xr-x. 2 root root 0 10月 10 17:00 power
-r--r--r--. 1 root root 4096 10月 10 17:00 size_mb
lrwxrwxrwx. 1 root root 0 10月 10 17:00 subsystem -> ../../../../../../bus/mc0
-r--r--r--. 1 root root 4096 10月 10 17:00 ue_count
-rw-r--r--. 1 root root 4096 1月 1 2000 uevent

查看ch*_ce_count就是ECC错误计数

可以通过在shell下敲命令直接输出计数值

[root@node3-0 csrow0]# grep "[0-9]" /sys/devices/system/edac/mc/mc*/csrow*/ch*_ce_count
/sys/devices/system/edac/mc/mc0/csrow0/ch0_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow0/ch1_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow0/ch4_ce_count:0
/sys/devices/system/edac/mc/mc0/csrow0/ch5_ce_count:0

以上显示ECC错误计数均为0
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决:如何在opencv中得到与matlab立体标定一样的矫正图?(python版opencv)

目的:采用一样的标定参数,matlab中和opencv中的立体矫正图像是一样的吗?不一样的话怎么让它们一样? 结论:不一样。后文为解决方案。 原因:注意matlab的标定结果在matlab中的用法和在opencv中的用法不一样&a…

STM32 从0开始系统学习2

目录 C语言基础 位操作 extern 修饰符 typedef 封装复杂的类型 寄存器基础知识 STM32F103架构简单描述(建议先不看) 存储器映射 寄存器映射 寄存器地址计算 下面简单的聊一聊一些需要的前置知识基础。 C语言基础 位操作 这个在单片机里算基操…

ScrollView 真机微信小程序无法隐藏滚动条

问题描述 根据官方文档,使用:show-scrollbar"false",隐藏滚动条无效 解决方法 添加一段样式在 scroll-view 上或者父级节点上下 ::-webkit-scrollbar {width: 0;height: 0;color: transparent;display: none;} eg. .inforDetails_app {p…

Windows通过netsh控制安全中心防火墙和网络保护策略

Windows通过netsh控制安全中心防火墙和网络保护策略 1. 工具简介 【1】. Windows安全中心 【2】. netsh工具 netsh(Network Shell) 是一个Windows系统本身提供的功能强大的网络配置命令行工具。 2. 开启/关闭防火墙策略 在设置端口(禁用/启用)前&am…

中国人寿财险青岛市分公司普惠金融助力民生保障

普惠金融是金融业的重要组成部分,也是服务实体经济、保障民生的重要途径。国寿财险青岛市分公司始终坚持以人民为中心的发展思想,大力发展普惠金融业务,不断提升金融服务的覆盖面和便捷性。 在服务“三农”方面,国寿财险青岛市分…

【宝塔面板】宝塔面板使用docker部署chatGPT-Next-web

1111111 chatGPT-Next-web大家并不陌生,就是下面的这个界面,下面请大家跟随小编部署下这个web 我们先感谢下源码的博主: https://github.com/Dooy/chatgpt-web-midjourney-proxy 本教程部署也很简单,就2步 1、创建容器编排模版 …

循环双链表,将L改造为L=(a1,a3,…,an,a4,a2)

题目:设以带头结点的双向循环链表表示的线性表L(a1,a2,…..,an).试写出一时间复杂度为o(n)的算法,将L改造为L(a1,a3,…,an,a4,a2) 思想:将偶数头插到表尾,奇数顺序保持不变。 代码…

云原生后端概述

目录 云原生后端概述 云原生后端的核心特点 云原生后端的架构组件 云原生后端的常见技术栈 云原生后端与传统后端架构的对比 结论 云原生后端概述 随着企业对数字化转型需求的不断增加,云原生后端逐渐成为构建现代应用程序的核心方法。云原生(Clo…

股票基金大通证券申购大宗交易代理-VUE源码开源版

前后端vue开源 服务端java开源 这套是开源的 1.环境 环境 php7.4 sql 5.7 Nginx1.2 tomcat-8 redis 放行1-65535 2.创建5个网站。xxx.com替换你的域名 ftp.xxx.com api.xxx.com agent.xxx.com admin.xxx.com wap.xxx.com api设置反向代理 代理名称 api 目标URL http://127.…

Spring boot快速集成开发

目录 1. 创建 Spring Boot 项目 2. 项目结构 3. 编写代码 3.1 创建实体类 3.2 创建数据访问层 3.3 创建服务层 3.4 创建控制器 4. 配置数据库 5. 启动应用 6. 运行项目 7. 测试 API 8. H2 控制台 在 Spring Boot 中快速集成开发的步骤通常包括创建项目、添加依赖、编写…

Leetcode 140 Word Break II

题意&#xff1a;给定一个string以及一个wordDict,要求返回一个vector<string> &#xff0c;这个vector中的string都是word Dict中的组合 Input: s “catsanddog”, wordDict [“cat”,“cats”,“and”,“sand”,“dog”] Output: [“cats and dog”,“cat sand dog”…

Qt 学习第 天:线程与多线程

1024程序员快乐&#xff0c;如果这博客让你学习到了知识&#xff0c;请给我一个免费的赞❤️ 一、创建界面文件 LCDnumber 二、创建mythread类&#xff0c;继承QObject 三、在MyThread.h文件做修改&#xff0c;并且加上函数声明 引入头文件&#xff0c;改变继承 #ifndef MY…

迁移学习|ResNet18

一、导入库 二、设置随机种子 三、数据增强和数据加载 四、加载预训练模型 五、定义损失函数和优化器 六、学习率调度器 七、训练模型 八、可视化训练过程 九、总结 1. 常见优化器概述 1.1 随机梯度下降&#xff08;SGD: Stochastic Gradient Descent&#xff09; 简介&…

C++图形库

建议大家多逛逛GitHub&#xff0c;特别是DevWeekly&#xff0c;它每周都会筛选一些优秀的开源项目、开源工具、技术文章等&#xff0c;可以多去看看。接下来不废话了&#xff0c;列举一些我认为较好的C图形库&#xff0c;希望对大家学习有帮助。 NanoVG NanoVG是一个2D图形库…

模拟退火模板

OI WIKI上的模拟退火 #include <cmath> #include <cstdlib> #include <ctime> #include <iomanip> #include <iostream>constexpr int N 10005; int n, x[N], y[N], w[N]; double ansx, ansy, dis;double Rand() { return (double)rand() / RA…

如何使用 Git Cherry-Pick 和 Reset 处理误提交,并确保安全回滚

在开发过程中&#xff0c;偶尔会遇到不小心将功能开发提交到错误分支上的情况。假设我们计划在 10 月 24 号上线某些功能&#xff0c;但却不小心在 10 月 17 号的上线分支上进行了开发。为了解决这个问题并将误提交的内容移到正确的分支上&#xff0c;我们可以借助 Git 的一些功…

使用yield压平嵌套字典有多简单?

我们经常遇到各种字典套字典的数据&#xff0c;例如&#xff1a; nest_dict {a: 1,b: {c: 2,d: 3,e: {f: 4}},g: {h: 5},i: 6,j: {k: {l: {m: 8}}} } 有没有什么简单的办法&#xff0c;把它压扁&#xff0c;变成&#xff1a; {a: 1,b_c: 2,b_d: 3,b_e_f: 4,g_h: 5,i: 6,j_k_l_…

提交任务时,线程池队列已满,这时会发生什么

当提交任务到线程池时&#xff0c;如果线程池的任务队列已满&#xff0c;具体会发生什么取决于线程池的配置和提交任务的方式。以下是对这一情况的详细分析&#xff1a; 一、线程池状态分析 任务队列已满&#xff1a;线程池中的任务队列已经达到其容量上限&#xff0c;无法再…

【Linux系统内核探索】进程调度

文章目录 进程调度什么是进程调度&#xff1f;进程调度算法task_struct的链式结构 总结 进程调度 什么是进程调度&#xff1f; 进程调度是操作系统内核的核心功能之一&#xff0c;负责在多个进程之间分配CPU时间&#xff0c;使得系统能够同时运行多个进程。因为计算机的CPU资…

MongoDB的基本操作

&#x1f337;数据库准备 &#x1f388;Mongoshell 1.在指定目录下创建mongodb文件夹、其子文件log和data以及mongodb.log cd /home/ubuntu mkdir -p mongodb/data mkdir -p mongodb/log touch mongodb/log/mongodb.log 执行mongodb命令启动mongdb服务 mongod --dbpath /h…