- 博客(78)
- 收藏
- 关注
原创 NUMA Balancing 扫描细节 -- PTE 标记、VMA 状态与周期自适应
本文基于 Linux kernel 6.18.26 源码,深入分析了 NUMA Balancing 机制中的三个核心内部问题:NUMA hinting PTE 标记、VMA 活跃状态记录和扫描周期自适应调节。文章首先梳理了从调度器触发扫描到修改页表保护位的完整调用链路,重点解析了 change_prot_numa() 如何通过 MM_CP_PROT_NUMA 标志将扫描意图传递给页表修改框架。通过流程图和代码分析,详细说明了内核如何通过修改 PTE 权限位为 PAGE_NONE 来标记 NUMA hinti
2026-06-19 11:46:20
328
原创 NUMA Balancing 扫描机制 -- 周期性 PTE 标记与内存访问采样
摘要:本文深入分析了 Linux 内核(6.18.26)中的 NUMA Balancing 扫描机制。该机制通过周期性将进程 PTE 标记为 PROT_NONE,在后续访问触发缺页异常时记录页面位置和访问者信息,为 NUMA 优化决策提供数据支持。核心思想是:以可控开销获取内存访问样本,而非直接迁移页面。扫描采用分层限流策略,包括任务级运行时间检查、地址空间级扫描窗口控制,以及 VMA 过滤等,在采样有效性和性能开销间取得平衡。关键流程包括调度器触发扫描、PTE 标记、NUMA hinting fault
2026-06-15 19:43:24
401
原创 NUMA Balancing 调优、调试与生产实践
本文基于Linux 6.18.26内核源码,深入解析NUMA Balancing的运行时调优机制。文章首先展示了NUMA Balancing参数的全景视图,包括numa_balancing(总开关)、scan_delay(首次扫描延迟)、scan_period_min/max(扫描周期范围)、scan_size(单次扫描范围)和promote_rate_limit(内存层级提升限流),并阐释了这些参数如何协同工作形成扫描→统计→决策→迁移→反馈的闭环控制。 随后详细剖析了每个核心参数的实现原理,如scan_
2026-06-09 17:22:41
428
原创 Numa Balancing 入门
本文介绍了 Linux 内核 NUMA Balancing 机制的基本原理和运行流程。通过分析 AMD EPYC 处理器的 NUMA 架构,说明远端访存带来的性能问题。NUMA Balancing 采用采样-迁移的循环机制,通过撤销页面权限、捕获访问 fault 来识别热点数据,并动态迁移页面或任务以减少跨节点访问。文章概述了扫描、fault 处理、统计决策和迁移四个核心环节,为后续代码级分析奠定基础。该机制在观测成本和迁移收益之间权衡,通过自适应策略优化 NUMA 系统性能。
2026-06-09 13:55:28
396
原创 Sched_ext 回调深度解析(八):running —— 任务开始执行(6.18.26)
important;important;fill:none;running要点触发时机每次调度切换时触发与stopping配对 非一次性执行顺序先stopping旧任务后running新任务跨CPU陷阱可能不在目标CPU上执行必须用scx_bpf_task_cpu获取CPU上下文约束持有rq lock 不能阻塞只能调用SCX_KF_REST典型用途推进全局vtime时钟与stopping配合实现vtime调度。
2026-06-05 17:35:54
367
原创 Sched_ext 回调深度解析(一):sched_ext 框架总览——前言
本文深入解析Linux内核的sched_ext eBPF调度框架(基于6.18.26内核版本),该系统允许通过用户态BPF程序自定义CPU调度策略而无需修改内核代码。文章首先介绍了sched_ext作为"调度器插件系统"的架构设计,包括其核心组件:内核空间的调度回调接口、DSQ队列和任务状态机,以及用户空间的BPF调度程序。随后详细梳理了12个关键调度回调函数,将其分为三类:一次性回调(init_task/enable)、状态通知回调(runnable/running等)和调度决策回调(select_cpu
2026-06-04 20:25:53
526
原创 如何为 Claude 写优化协议文档
本文提出了一套为Claude编写优化协议的核心原则:文档应专注于定义问题目标和验收标准,而非解决方案。协议只需包含量化目标、优先级顺序、数据采集方法和工程接口等稳定内容,而应避免描述代码现状、根因假设、实现方案等易过时或可由AI自行推导的内容。关键在于明确"解决什么问题"而非"如何解决",将分析判断权留给Claude。文档结构建议包含目标、诊断流程、优化方向和迭代流程等基本模块,保持简洁稳定。核心思想是让协议成为边界而非指南,充分发挥AI的自主分析能力。
2026-06-03 10:23:22
377
原创 Sched_ext 回调深度解析(五):runnable —— 任务状态转换的哨兵(6.18.26)
本文深入分析了Linux内核调度器框架sched_ext中的runnable回调机制。作为任务状态转换的关键哨兵,runnable在任务首次变为可运行状态时触发,与enqueue形成互补但解耦的关系。文章通过源码解析揭示了runnable的三种触发场景(唤醒、迁移和恢复),并详细阐述了其与running等状态回调共同构成的任务执行状态跟踪体系。通过调用链分析和核心代码解读,展示了enqueue_task_scx()如何协调状态标记、粘性CPU处理等关键逻辑,最终触发runnable回调通知BPF调度器。该机
2026-05-27 20:19:58
426
原创 K8s 容器运行 UnixBench — 代理机器执行记录
摘要 本文记录了在受限网络环境下为K8s容器准备UnixBench性能测试镜像的全过程。由于目标机器(10.59.42.83)无法访问外网,通过代理机器完成了镜像构建和传输工作。主要步骤包括:尝试拉取镜像失败后,修改Dockerfile绕过SSL验证问题,成功构建并导出128MB的镜像文件。在SCP传输失败后改用手动传输方式,并提供了目标机器的镜像导入命令。整个过程解决了镜像仓库不存在、SSL验证失败、Docker权限问题和SSH连接限制等多个技术难点,最终实现了在受限环境中部署性能测试工具的目标。
2026-05-27 09:56:47
437
原创 Sched_ext 回调深度解析(六):enqueue —— 任务入队,调度器的核心决策点(6.18.26)
Linux sched_ext调度框架中的enqueue回调机制分析 摘要:本文深入分析Linux sched_ext调度框架中的enqueue回调机制。作为eBPF调度器的核心钩子之一,enqueue负责将就绪任务放入调度队列(DSQ)。研究基于Linux 6.18.26内核源码,揭示enqueue的三个关键特性:(1)必须调用scx_bpf_dsq_insert将任务放入DSQ;(2)可被select_cpu的直接分发跳过;(3)BPF调度器拥有任务所有权。文章详细梳理了enqueue的五大触发场景,包
2026-05-26 14:26:12
431
原创 Sched_ext 回调深度解析(四):select_cpu —— 任务唤醒时的选核决策(6.18.26)
本文深入分析了Linux内核sched_ext框架中的select_cpu回调机制。作为eBPF调度器框架的关键组件,select_cpu在任务唤醒时负责选择目标CPU,具有三个核心特性:决策非最终性(后续调度阶段可修改)、空闲CPU自动唤醒机制以及直接分发优化路径。文章通过时序图展示了select_cpu在任务生命周期中的触发时机,对比了其与其他回调(如init_task、enable等)的本质区别,并详细解析了两种典型触发场景(任务唤醒和exec执行)的处理逻辑。最后,通过流程图总结了select_cp
2026-05-25 13:42:11
426
原创 Sched_ext 回调深度解析(七):dispatch —— 从队列取出任务送到 CPU(6.18.26)
本文深入分析 Linux 内核 sched_ext 调度框架中的 dispatch 回调机制。dispatch 是 CPU 本地运行队列(DSQ)为空时触发的核心调度钩子,负责从 BPF 调度器或用户自定义队列中选取任务执行。文章剖析了 dispatch 的三个关键特性:1) CPU 驱动而非任务驱动的触发机制;2) 支持通过 dsq_insert 主动分发和 dsq_move_to_local 搬运两种工作方式;3) 通过 dispatch_max_batch 实现的批量分发限制。详细说明了 dispat
2026-05-20 13:46:18
613
原创 Sched_ext 回调深度解析(三):enable —— 任务被调度器接管的关键时刻(6.18.26)
本文分析了Linux内核中sched_ext调度器的enable回调机制。当任务被sched_ext调度器正式接管时触发enable回调,完成从READY到ENABLED状态的转换。与init_task不同,enable回调仅在任务真正由sched_ext管理时触发。文章详细介绍了底层机制,包括调度类选择(scx_setscheduler_class)、任务接管流程(scx_enable_task)以及三种触发场景:注册调度器时批量切换、fork新任务时自动继承和系统调用主动切换。通过流程图展示了状态转换过
2026-05-20 10:34:03
564
原创 Sched_ext 回调深度解析(二):init_task —— 每个任务走进调度器的第一道门(6.18.26)
本文分析了Linux内核中sched_ext调度器框架的init_task钩子函数,重点阐述了其两种触发场景和实现机制。核心发现包括: init_task会在两种情况下触发: 调度器注册时批量初始化已有任务(遍历全局scx_tasks链表) 注册后新fork的任务(在fork流程中调用) 注册过程通过scx_enable_workfn分阶段执行: 先进入bypass模式保护状态 第一轮遍历初始化所有现存任务 开启调度标志后第二轮遍历切换任务调度类 最终退出bypass模式使调度器生效 关键实现细节: 使用s
2026-05-16 21:30:45
460
原创 Sched ext回调1——init_task (linux 6.15.7)
本文分析了schedext调度器中init_task钩子的触发机制。该钩子在两种情况下触发:1)注册调度器时遍历已有任务链表scx_tasks执行初始化;2)新任务fork时若scx_ops_init_task_enabled标记为true则触发。文章详细展示了fork和注册调度器时的调用栈流程,指出用户态任务名称在fork时继承父进程,内核态任务则直接设置真实名称。特别强调init_task的执行时机早于其他调度钩子,为任务调度提供了初始化保障。
2026-01-20 16:51:07
890
原创 eBPF/Sched Ext 编程注意事项
访问数组元素,要显示限制索引值。如果不限制索引值,运行时报错:Global function XXX doesn't return scalar. Only those are supported. “doesn't return scalar.”是 verifier 在控制流分析失败时最常见的“兜底错误”,并不一定是函数返回值不对。下面代码在 cst->buckets[idx]前,判断idx >= NBUCKETS就return。
2025-12-29 14:30:27
1062
原创 sched_ext的update_idle函数(linux 6.15.7)
先看注释,见 kernel/sched/ext.c当cpu进入或退出idle状态时(对应的是,cpu开始执行init_task、停止执行init_task),调度器框架代码会执行struct sched_ext_ops -> update_idle。
2025-11-19 15:27:17
932
原创 eBPF per-CPU map用法示例
本文介绍了eBPF中per-CPU类型map的使用方法。首先定义了一个包含CPU空闲时间统计信息的per-CPU数组map,每个CPU副本中只有一个元素。在用户态程序中,通过bpf_map_update_elem()一次性初始化所有CPU的map值。使用bpftool工具可以查看map内容,确认各CPU的idle_ns值被正确设置。在eBPF程序中,通过bpf_map_lookup_elem()获取当前CPU的map值,注意key要设为0表示访问该CPU副本中的唯一元素。最后展示了eBPF程序读取并打印各C
2025-10-24 17:10:23
334
原创 虚机安装及一些基本操作
先下载虚机配置文件geshifei-vm1.xml:链接: https://pan.baidu.com/s/15wXohrZxFti4NwmK8XEyIg 提取码: 1234注意,这只是从 libvirt 的数据库里去掉了这台虚机,虚机的磁盘文件还在,如果确认不用了,可以通过“六”节将磁盘文件也删除。
2025-10-21 17:52:33
1065
原创 eBPF Skeleton
本文介绍了eBPF程序的基本结构和加载方式。eBPF程序分为内核空间的hook函数和用户空间的加载程序,前者有严格限制,后者可自由编写。加载方式包括底层的bpf()系统调用、基于libbpf库的加载以及更高级的Skeleton方式。Skeleton是libbpf生成的代码,封装了eBPF程序的ELF文件信息,简化了加载流程,支持CO-RE技术。文章详细说明了Skeleton的生成方法、使用示例以及如何通过Skeleton修改eBPF变量和map。最后解释了Skeleton的数据结构,展示了其如何通过&quo
2025-10-05 22:27:03
1074
原创 sched_ext调度器task stall分析
cpu 32因高负载导致local DSQ非空,一致无法执行dispatch函数,无法运行kworker/32:2线程线程。其他部分cpu空闲,虽然可执行dispatch函数,但因为kworker/32:2线程的cpu mask不允许运行在“非32核”上,也不能运行kworker/32:2线程。整个系统无任何cpu可运行kworker/32:2,导致kworker/32:2 task stall异常。
2025-09-25 21:22:09
860
原创 IgH初始化--未接从站
所以ec_fsm_master_state_broadcast中的if条件不好被执行,最终执行最后的ec_fsm_master_restart的函数,在ec_fsm_master_restart函数中将状态机设置为ec_fsm_master_state_start并立即执行。ecrt_master_send发送ec_fsm_master_state_start封装的报文。ec_fsm_master_state_start封装报文,待发送。执行ec_fsm_master_state_broadcast函数。
2025-08-15 17:06:48
881
原创 运行sched_ext调度器
系统信息Linux内核从6.12版本开始正式支持sched_ext调度程序,所以需升级内核至6.15.7或其他高版本。
2025-08-15 15:31:30
1174
原创 调度器类sched_class
内核版本:linux 6.15.7按优先级,从高到低:STOP > RT > FAIR > EXT > IDLE二、调度器类存在哪调度器类按照优先级存在__sched_class_highest开始、以__sched_class_lowest结束的段中。每个调度器类存在在对应的xx_sched_class段中。链接脚本vmlinux.lds.h控制了各个调度器类在段中的位置顺序,这个顺序决定了优先级关系。__section("__" #name "_sched_class")定义
2025-08-14 20:14:27
491
原创 eBPF的helper函数
helper函数,是内核提供给 eBPF 程序调用的辅助函数。eBPF 程序本身是个小型沙盒程序,不能直接访问内核的所有资源。这些helper函数是内核预先实现的,可以让eBPF程序完成复杂功能,而不用自己写复杂的代码。
2025-08-13 10:17:06
163
原创 eBPF简明使用教程
编译生成bpf可执行程序bpf_program.o和加载器bpfload。从upstream或者欧拉社区,下载对应版本的内核源码,并mv到根目录。修改helloword中的loader.c源码,增加如下。
2025-08-06 20:26:36
115
原创 如何通过kgdb调试vbox中的kernel
其他版本的vbox、ubuntu iso,可能会有一些bug,要么增强工具按装不了,要么更改kernel后ubuntu没有图形界面。推荐用上面版本的vbox+ubuntu:-- 如果无法打开terminal,需要更改Setting --> Region & Language中的Language和Formats-- ubuntu的kernel版本,Linux ubuntu18 5.4.0-84-generic-- 增强工具正常-- 图形界面正常。
2025-03-13 21:33:36
1107
原创 bcache的基本操作
1,停止bcache设备lsblk<====停止前,存在bcache0设备#停止bcache设备lsblk<===没有bcache0设备了2,擦除backingdevice上的superblock信息3,按4k大小格式化backingdevice。
2025-01-20 10:37:31
1500
原创 ubuntu20.04 调试bcache源码
搭建单步调试bcache的环境,/dev/sdb作为backing dev, /dev/sdc作为cache dev。
2024-12-25 23:49:29
1369
原创 TwinCAT3 实时核中ADS实现C++ server、clinet数据传输
Automation Device Specification,ADS设备间进行通信的协议规范。协议定义了ADS device之间如何寻址对方、ADS device之间可以执行哪些操作、执行这些操作需要哪些参数,以及操作完成后如何返回结果等。
2024-09-10 22:00:00
4019
原创 Twincat ADS 报文分析(Sum Write)
或者网盘下载:链接:https://pan.baidu.com/s/188GY9zuIrDFMXiTqky4MWg提取码:a9k2抓包工具安装在ADS通讯的机器上,比如我的环境:在开发机中编写一个模块A、B通讯的程序,然后下载到工控机中,那么抓包工具需要安装在工控机上(而不是开发机上)。
2024-09-04 21:45:00
1407
原创 kasan排查kernel内存越界示例(linux5.18.11)
参考资料:1,内核源码目录中的Documentation\dev-tools\kasan.rst2,
2024-03-07 17:19:17
1879
1
原创 Ethercat“APWR配置从站地址”报文分析(0x0010:0x0011)
基于IgH主站接了3个从站,分析报文。一条Ethercat报文中可以包含多个子报文,每个子报文的地址由ADP+ADO组成,ADP即16 bit High Addr,ADO即16 bit Low Addr。APWR模式下,ADP代表的是从站在网络中按连线顺序的地址,比如与master连接的第一个从站的ADP=0x00,第二个从站的ADP=0x01,第三个从站的ADP=0x02,以此类推。ADO代表的是从站物理寄存器地址,寄存器地址可参考。
2024-01-02 16:35:00
2515
原创 Ethercat“BWR配置从站地址”报文分析(0x0010:0x0011)
涉及的从站寄存器:Configured Station Address (0x0010:0x0010)。使用场景举例:IgH启动后,通过“配置从站地址”报文将所有从站地址清零,然后通过APWR指令+“配置从站地址”报文,设置各个从站的地址。
2023-12-23 18:29:41
1797
原创 Ethercat “BRD读从站状态”报文分析(0x0130:0x0131)
涉及的从站寄存器:Register AL Status 0x0130:0x0131。
2023-12-22 20:31:26
1862
1
原创 IgH调试注意事项
现象:虚拟机中运行IgH master并绑定网卡后,主站由ORPHANED状态转换成IDLE状态,但无法收发数据报。这是因为虚拟机用的是虚拟网卡,需通过iptables将数据包到转发到真实的网卡上,实现收发数据的目的。但IgH替换了网卡驱动程序,收到数据包后,处理流程没有走内核的网络协议栈,所以工作中tcp/ip层的iptables就不起作用,导致IgH无法正常收发报文。解决:物理机安装ubuntu用来测试IgH。
2023-12-21 19:48:30
1765
1
原创 IgH Master环境搭建
在ubuntu20.04中搭建一个IgH主站。目标:实时linux内核中运行IgH主站,ethercat的用户态工具能看到主站信息。
2023-11-17 13:09:08
1671
原创 android存储4--初始化.emulated设备的挂载
在正式介绍挂载视图前,需要讲一下bind mount。绑定挂载命令:bindmount --bind olddir newdir1)将olddir绑定到newdir。绑定后,olddir和newdir看到的都是olddir中的内容(newdir中绑定前的内容变不可见)。2)命令中的olddir对应内核mount函数的dev_name参数,newdir对应mount的dir_name参数。
2023-07-28 21:00:00
5167
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅