Computer Systems

22 篇内容

工程实践Phil Eaton - databases

Intercepting and modifying Linux system calls with ptrace

文章介绍在amd64/Linux上使用ptrace拦截并修改系统调用,用Zig实现故障注入器,通过fork子进程、PTRACE_TRACEME和PTRACE_SYSCALL在系统调用入口与出口暂停。作者实现sys_write钩子:入口处把rdx写入长度截断2字节模拟短写;出口处将rax改为-EIO,从而绕过Go、Python、C内置write对EAGAIN的重试。文中还展示了用PTRACE_GETREGS/SETREGS操作寄存器,以及用PTRACE_PEEKDATA读取子进程内存打印写入内容。最终成功触发短写,并讨论方案局限:仅覆盖amd64/Linux、存在性能开销,未来可结合seccomp过滤优化。

推荐收录,因为文章用可运行的Zig代码完整演示了ptrace拦截系统调用的入口与出口、寄存器修改和内存读取,并通过真实调试发现Go/Python/C内置write对EAGAIN的重试行为,最终用返回EIO成功触发短写故障。适合从事Linux系统调试、故障注入和可靠性测试的工程师,方法可迁移到其他系统调用和语言,但需注意其仅覆盖amd64/Linux且ptrace存在性能开销。

技术文章Phil Eaton - databases

Exploring a Postgres query plan

文章记录作者在探索 Postgres 查询执行钩子时的学习过程,目标是从 QueryDesc 计划对象重建原始 SQL 字符串。作者搭建了带共享库的调试环境,通过 ExecutorRun_hook 拦截查询,并逐步解释 Plan 节点、范围表、OpExpr、Const、Var 等关键结构。文中给出完整 C 扩展代码,示范如何查找关系名、操作符名和列名。最终实现对简单 SELECT 的 SQL 重建,验证了 a > 1、a + 1 和常数比较等场景。该方法仅覆盖顺序扫描、整型常量与基础 Vars,尚未处理连接、聚合、子查询和别名等复杂计划,且依赖特定版本 Postgres 内部 API。

推荐收录,因为这是一篇可复现的数据库内核级工程笔记,而非泛泛介绍:作者提供了完整 hook 代码、构建方式,并逐步验证从计划树重建 SQL 的能力。适合数据库内核、Postgres 扩展开发者以及对查询计划内部表示感兴趣的后端工程师。其可迁移价值在于展示如何遍历计划节点、解析表达式并访问系统目录,但注意依赖特定版本内部 API,升级时可能变化。

技术文章LWN.net

[$] KVM planes head for takeoff

本文介绍了KVM社区正在开发的KVM planes功能,旨在为Linux虚拟化系统提供统一的安全域隔离抽象层。随着CPU厂商推出AMD SEV、Intel TDX等多种硬件安全方案,应用开发者面临碎片化困境,KVM planes尝试将虚拟机资源(如CPU、内存)划分为不同planes,利用底层硬件特性但向用户态暴露一致接口。文章讨论了设计目标、关键机制(如嵌套虚拟化支持)以及当前开发进展,指出项目处于早期阶段,需处理多架构兼容与性能权衡,对上游集成尚有大量工作。

该文章深入解析了KVM planes的设计动机与技术要点,来自权威Linux内核技术新闻源LWN,具有长期参考价值。适合关注虚拟化安全、内核抽象层开发的工程师和研究者,其中对异构硬件安全方案统一接口的探索思路可迁移至其他同类系统设计。

技术文章MaskRay

Estimating branch probabilities

文章深入解析LLVM分支概率信息(BranchProbabilityInfo)在没有PGO(Profile-Guided Optimization)资料时的静态估计机制。作者首先梳理了LLVM估算分支概率的多级回退流程,重点剖析了calcEstimatedHeuristics算法,该算法利用不可达、noreturn、cold等区块的种子权重,通过支配树和后支配树反向传播,并结合循环结构对出口边进行缩放,从而为多后继终结指令分配概率。文中给出了独立的C++实现,并详细讨论了权重标度、边分类、循环嵌套森林的作用,以及不可归约循环对概率计算的影响。此外,还指出了与LLVM源码bit-per-bit匹配所需注意的实现细节,如种子顺序和工作列表顺序。该方法展示了静态分析中如何仅凭控制流图和循环结构生成合理分支猜测,对理解编译器优化有重要参考价值。

本文为编译器开发者、程序分析研究人员或对底层代码优化感兴趣的人员提供了LLVM分支概率静态估计的深入技术剖析,不仅解释了算法原理、设计取舍和工程考量,还附带可复现代码和对比案例。其详细程度足以帮助读者迁移到其他编译系统或静态分析工具的开发中,适合作为长期技术参考资料收录。

工程实践Ken Shirriff

Energizing a vacuum-tube flip-flop module from a 1948 IBM system

文章对IBM 604(1948)电子计算穿孔机中的TR-3触发(触发器)模块进行了逆向工程和实际演示。作者从真空管三极管的工作原理讲起,详细剖析了反相器电路和交叉耦合反相器构成的触发器,解释了电平移位和脉冲输入的实现,并展示了模块如何通过两个稳定状态存储一位信息。文中还结合历史脉络,说明该触发器如何用于十进制计数器(BCD编码)并为早期计算机的状态机提供基础。文章边界在于它聚焦于历史硬件,其高电压设计和模拟敏感性与现代数字电路有较大差异。

本文通过实际逆向工程和上电演示,阐释了真空管触发器的电路原理与历史意义,为理解早期计算机设计提供了第一手资料。适合对计算机历史、电子学基础或反向工程感兴趣的读者,其中的电平移位、交叉耦合和稳定条件分析可迁移到对时序电路基本原理的教学中。

技术文章LWN.net

[$] Hazard pointers for the kernel

文章介绍了hazard pointers作为内核RCU机制的替代方案,用于实现无锁数据更新。作者从原理层面比较了两者的内存开销、延迟和回收确定性,指出hazard pointers在低内存占用和及时回收方面的优势。文章还结合内核社区正在评估的实现,讨论了并发内存排序、安全语义以及实际部署中的工程权衡。内容适合理解内核无锁、垃圾回收机制和并发数据结构的读者,但未深入特定硬件架构或极端性能测试。

文章从原理、优缺点和工程可行性多角度剖析了hazard pointers在内核中的应用,具备深度的技术比较和清晰的适用边界说明。对于系统开发者、内核工程师或关注高性能并发的读者,本文可作为理解无锁同步替代方案的优质参考,迁移价值高。

技术文章Fzakaria Blog

Seriously, what is the large code-model even for?

文章深入分析 x86-64 大代码模型(-mcmodel=large)在处理线程局部存储(TLS)时的根本性缺陷。作者通过构造超过 2 GiB 的 .bss 和 .text 示例,对比普通数据访问与 TLS 访问的编译器重定位类型,指出尽管大代码模型为普通数据生成了 64 位重定位,但 TLS 访问序列仍使用 32 位立即数(如 R_X86_64_TPOFF32),导致二进制文件超出 2 GiB 时链接失败。进一步剖析 GCC 与 LLVM 生成的指令序列,揭示问题并非编译器实现缺陷,而是 x86-64 psABI 从未定义大代码模型下的 TLS 访问模式,使得 64 位 TLS 偏移无法编码到指令中。文章提供了可复用的 Python 脚本用于生成巨型目标文件,验证了现象的通用性,并指出该限制对有大量线程局部变量的静态链接可执行文件尤为严重。

本文并非泛泛而谈,而是通过可复现的构造实验和汇编级分析,定位到 x86-64 ABI 规范的一项具体缺失,揭示了大型二进制工程中的一个隐蔽陷阱。其直接证据清晰、方法可迁移,适合从事工具链、系统软件或性能敏感大型应用开发的读者参考。文章还提供了生成测试用例的脚本,有助于读者在自己的环境中验证和延伸研究,具备长期的参考价值。

工程实践Datadog Engineering

Unbiased Java CPU profiling with JFR in JDK 25

本文介绍了JDK 25中JFR新增的CPU时间采样事件,旨在解决传统Java profiler因依赖JVM内部未公开接口而导致的CPU分析偏差。作者详细阐述了由Datadog、SAP、Amazon等公司和OpenJDK社区共同推动的设计背景,解释了新事件如何基于操作系统线程调度数据实现无偏采样,避免基于栈采样或线程跟踪的常见误差。文章还讨论了该事件的实现原理、性能开销、使用方式以及与现有JFR事件的集成,并说明了其适用于Linux等支持OS级线程调度的平台。该工作为Java应用性能分析提供了更可靠的CPU数据基础,但对JDK版本和操作系统有要求。

本文深入剖析了JDK 25 JFR CPU时间采样事件的工程背景和实现细节,是由多家企业合作解决真实性能分析问题的案例,具有明确的长期技术参考价值。适合Java性能工程师、JVM研究者和可观测性平台开发者阅读。文中展示的偏差分析方法和跨社区协作经验可迁移至其他性能工具的设计与改进,帮助读者理解无偏CPU profiling的难点和解决方案。

技术文章MaskRay

Irreducible loops

文章聚焦于编译器和程序分析中的不可约循环(irreducible loops)问题,首先回顾了支配树和自然循环在可约控制流图上的局限性,指出在优化后的机器码及反编译输出中常见的多入口循环无法被基于支配关系的方法识别。随后详细介绍了韦韬等人在SAS 2007提出的单趟DFS算法,该算法无需支配树或UNION-FIND,通过将遍历中遇到的每条边分为五种情况,并结合“头部链”合并机制,在一次深度优先搜索中同时完成循环识别与头部标记。文章提供了完整的C++实现,并借助不可约核心图和嵌套结构示例验证了算法输出Havlak最细化循环嵌套森林,同时展示了可约情况下与自然循环的一致性。该算法的时间复杂度为O(N+k*E),其中k为衡量非结构化程度的系数,在实际代码中接近线性。文章也指出了算法对DFS顺序的依赖以及不可约循环头的不唯一性。

推荐收录,本文不是简单的算法复述,而是从理论缺陷出发,逐步引出单趟DFS解决方案,并配有清晰图示、完整代码和可运行示例。它对编译器工程、程序分析和反编译领域的读者具有直接的参考意义,能够帮助他们理解如何处理非结构化控制流,并将这套轻量级循环识别方法迁移到自己的静态分析工具中。

技术文章LWN.net

[$] Faster RCUs and lockless memory allocation

文章围绕 Linux 内核里两项彼此关联的改进展开:一是 Puranjay Mohan 关于提升 RCU 性能的工作,二是 Harry Yoo 和 Alexei Starovoitov 提出的 kmalloc_nolock(),后者允许在任意内核上下文中进行无锁分配。作者先解释 kmalloc_nolock() 如何借助 RCU 保证并发安全,再回到 RCU 本身的开销来源,说明这些优化为什么能缓解热点路径上的锁竞争。文章强调,这类改动主要服务于高并发、上下文受限的内核路径,并不意味着所有分配都可以无条件去锁。它提供了从 API 设计到同步语义的完整背景,但结论高度依赖 Linux 内核的实现细节。

收录理由很明确:文章直接讨论了 RCU 性能优化与 kmalloc_nolock() 无锁分配这两个内核机制,并交代它们之间的同步关系和性能动机。适合内核、存储、BPF 和系统性能工程读者,尤其是需要理解高并发路径上锁竞争与内存分配约束的场景;可迁移价值在于同步语义和 API 设计的权衡方法。

技术文章Ken Shirriff

Examining circuit boards from the Space Shuttle's I/O Processor

这篇文章以作者实物拆解的两块 Space Shuttle I/O Processor 电路页为线索,系统梳理了航天飞机计算机的 I/O 架构。作者先说明 IOP 并非普通外设,而是连接 CPU 与 24 条数据总线的独立可编程处理器,采用 25 个虚拟处理器的 barrel processor 设计,由 BCE 和 MSC 两套完全不同的指令集分工完成网络搬运与调度。随后文章重点分析了 MIA 网络接口页的模拟前端、变压器隔离、Manchester 编码/解码、串并转换与校验逻辑,以及 PROM 页如何用熔丝 ROM 存放 72 位微指令并驱动物理处理器。文中还比较了 IBM 4 Pi 标准页与 IOP 专用页的尺寸、连接器、散热和封装密度差异,解释了为何航天级板卡会大量使用 hybrid module、flat-pack 与高可靠器件。文章结论指出,后来 AP-101S 将 CPU 与 IOP 合并以提升性能并减重,但原始 IOP 的架构与物理实现仍是理解早期航天计算机的重要样本;部分芯片编号和某些旁证板卡归属仍带有推断成分。

收录依据很明确:文章基于实物电路板、部件编号和官方文档,完整解释了航天飞机 IOP 的架构、总线协议、微码与板级实现,不是泛泛的历史回顾。适合做硬件逆向、古典计算机体系结构和高可靠系统设计的参考,尤其能迁移到“从板级结构反推系统工作方式”的分析方法。

技术文章LWN.net

[$] Reports from OSPM 2026, day two

这篇文章是对 OSPM 2026 第二天会议内容的整理报道,聚焦 Linux 内核中的电源管理与调度议题。涉及的主题包括设备频率调节、基于时间片时长进行 CPU 选择、多簇 Arm 系统的调度域设计、LAVD 调度器等,反映了内核社区在性能、能耗和调度策略上的最新讨论方向。文章价值主要在于把多个分散的会场议题串联起来,帮助读者把握当前 Linux 内核相关子系统的演进脉络与权衡点。

推荐收录,因为它围绕 Linux 内核电源管理和调度这一长期重要主题,汇总了多个具体技术议题,适合系统方向读者跟踪社区讨论和设计取舍。虽然它是会议报道而非深入教程,但对理解内核调度与能耗优化的演进方向仍有较强参考价值。

工程实践Cloudflare Blog

How we found a bug in the hyper HTTP library

这篇文章复盘了 Cloudflare 在 Images binding 迁移后遇到的一起间歇性响应截断问题,最终定位到 Rust HTTP 库 hyper 的 HTTP/1 连接状态机里:flush 还没完成就被当作已完成,随后触发过早 shutdown,导致大响应在 socket 背压下被截断。作者通过复现工单、分层排除、分布式 tracing 和 strace 观察系统调用,最终用一个可控的“满缓冲 socket”测试稳定复现并修复了这个 race condition。文章特别说明了该问题只在特定时序、大响应、真实生产并发和读取方稍慢时出现,curl 等快速读取场景很难触发,因此很适合作为连接层故障排查与异步 I/O 正确性案例参考。

推荐收录,因为它不是简单的 bug 通报,而是完整展示了从现象、复现、分层排除到根因确认与最小修复的工程分析链路。文章对理解异步 flush/shutdown 顺序、socket 背压、以及为什么应用层观测可能看不到底层丢包问题,很有迁移价值。

技术文章LWN.net

[$] Free-threaded Python: past, present, and future

这篇文章围绕 Python 的 free-threaded 版本展开,系统回顾了移除 GIL 的动机、相关历史、当前实现状态以及它对 Python 运行时和生态的影响。文章不仅解释了为什么要推进无 GIL,还讨论了这一变化在并行执行、兼容性、扩展模块支持和后续演进上的现实边界,因此适合作为理解 CPython 运行时演化的重要参考。

推荐收录,因为它提供了对 Python 核心运行时演进的结构化梳理,而不是停留在“去掉 GIL”这一结论层面。对于关注解释器实现、并发模型、C 扩展兼容性和语言未来方向的读者,这篇内容有较强的长期参考价值。

技术文章Xe Iaso

Why are cached input tokens cheaper with AI services?

这篇文章解释了为什么大模型 API 里的 cached input tokens 通常比未命中的输入 tokens 便宜,核心原因是服务方可以复用前缀计算结果,避免对相同上下文重复做推理。作者用聊天消息不断累积的调用方式说明了 KV cache / prefix cache 的工作思路,并把它和延迟、算力成本以及用户侧费用直接联系起来。文章也给出一个实用建议:尽量保持推理设置和前置消息稳定,以提高缓存命中率、降低成本并改善响应速度。

推荐收录,因为它用通俗但正确的方式解释了大模型服务定价背后的系统原因,帮助读者把“缓存更便宜”从现象理解到机制层面。内容对做 AI 应用、推理优化或成本控制的人都很有参考价值,且经验可以迁移到其他依赖前缀复用的系统设计中。

技术文章知乎 - 严格鸽

C++从内存别名到vector为什么都是维护三个指针

文章围绕“为什么主流 C++ std::vector 通常维护三个指针”展开,从严格别名、TBAA、自动向量化失败案例一路分析到 vector 的三指针布局、ABI 约束和 libc++ 的 size-based vector 提案。作者先用一个 `data + size` 结构展示当元素类型与长度字段同型时,编译器可能因别名疑虑而保守重读循环上界,再对比三指针布局为何更利于把 `size()`、`capacity()` 和循环次数提前固化,从而获得更稳定的优化结果。文章还进一步补充了 libc++ hardening、ABI break、非法 reinterpret_cast 暴露问题以及与 LLVM RFC 的关系,说明三指针并非唯一原因,但确实兼顾了优化、接口语义和历史实现路径。

推荐收录,因为文章把一个看似“vector 实现细节”的问题,拆解成了别名分析、对象布局、自动向量化、ABI 和库演进等多个层面,能长期帮助读者理解 C++ 容器实现背后的工程逻辑。它不仅给出结论,还展示了何时 `data + size` 会让编译器保守、为何三指针更稳,以及现代库为何会在性能收益和 ABI 兼容之间做取舍。

工程实践Microsoft Research Blog

mimalloc: A new, high-performance, scalable memory allocator for the modern era

这篇文章系统介绍了 mimalloc 现代内存分配器的设计目标与实现取舍,包括线程本地 heap、按页组织的固定大小块、三层 free list、跨线程释放的原子 CAS 路径,以及通过 page stealing 在可扩展性和内存共享之间取得平衡。作者还给出了小对象分配/释放的快路径、跨线程同步开销为何可控,以及在大规模并发服务和超大内存工作负载中的基准表现,说明它既能支撑高吞吐也能保持较低碎片与可接受的提交内存比例。

推荐收录,因为它不是泛泛介绍 malloc,而是把并发分配器的关键设计点、数据结构、快慢路径和性能边界讲得很清楚,适合长期作为系统性能与内存管理参考。文章对“低争用、高局部性、可迁移到真实服务”的工程取舍有很强的迁移价值,尤其适合做系统编程、运行时和基础设施方向的读者学习。

工程实践Amazon Science

Isabelle/HOL: The proof assistant behind the Nitro Isolation Engine

文章介绍 AWS 如何用 Isabelle/HOL 对 Nitro Isolation Engine(NIE)做形式化验证,证明其在云隔离与客户数据保护上的正确性和安全保证。作者解释选择 Isabelle/HOL 的原因:它在表达力、自动化、证明可读性和可扩展性之间更平衡,且支持可控的中间目标、定制解析器、locale、sledgehammer、反例搜索和代码生成。为验证 NIE,他们在 Isabelle/HOL 上实现了 separation logic,将 Graviton-5 架构规范、Rust hypercall 代码及安全性质组织成约 25 万行证明。文章还说明该证明可在普通笔记本上约半小时运行,显示工具能处理大规模目标。同时作者也强调,高阶逻辑无法完全自动化,实际部署仍需测试覆盖未形式化部分与前提假设,因而其价值主要在高风险系统的关键路径验证。

推荐收录,因为它给出了选择 Isabelle/HOL 的直接工程证据:不是抽象地谈形式化验证,而是落到云 hypervisor、25 万行证明和实际运行性能。适合做云安全、系统软件和证明辅助器选型参考,但也要注意它依赖严格规格与大量人工交互式证明。

工程实践Go Blog

The Green Tea Garbage Collector

文章介绍 Go 1.25 中实验性垃圾收集器 Green Tea 的设计与落地。作者先回顾 Go 现有的标记-清扫 GC,指出其主要成本集中在标记阶段,而且大量时间浪费在指针追踪带来的随机内存访问和 CPU 缓存失配上。Green Tea 的核心改动是“按页而不是按对象”组织工作队列:在页级别积累待扫描对象,用 seen/scanned 位图在页内区分已发现和已扫描的对象,从而把零散遍历变成更连续的内存扫描。文章进一步说明它如何借助 AVX-512 和 VGF2P8AFFINEQB 等指令做位图扩展与筛选,把多个步骤压缩到寄存器内完成。实测显示,多数负载可减少约 10% 的 GC CPU 时间,部分负载可达 40%,但结构很不规则、每页常只出现单个待扫对象的场景收益会变小甚至可能回退,因此仍是一个依赖工作负载形态的优化。

推荐收录,因为文章给出了 Go 运行时 GC 的具体瓶颈、页级扫描的新算法、位图与向量化实现细节,以及在生产环境中的量化收益,证据充分且可迁移性强。适合关注运行时、性能优化、缓存友好数据布局和指令级加速的读者;同时也提醒读者该方案对负载形态敏感,实验性开关阶段仍需做基准验证。

工程实践fasterthanli.me

Making our own spectrogram

文章以“自己实现一个频谱图”为目标,先说明频谱图如何把声音波形分解为不同频率,再把结果映射成随时间滚动的可视化图像。作者并没有只停留在概念层面,而是结合自己的 Rust 应用,讲解了项目由哪些 crate 组成、音频线程与图形线程如何协作,以及数据如何从采集、分析到绘制流转。文中重点不只是“怎么画出来”,还包括实时处理时的组织方式、线程分工和界面刷新策略,体现出一个可运行工具的整体结构。它更偏向具体实现与工程组装,而不是纯理论推导,因此对理解音频可视化管线很有帮助。边界在于文章主题集中在作者这套实现上,读者若要迁移到其他语言或更专业的 DSP 场景,还需要补充信号处理基础。

文中直接给出了频率提取、Rust crate 组合、音频/图形线程协作和绘制流程,证据明确,不是泛泛展示效果。适合做音频可视化、实时图形或 Rust 工程实现的参考,但迁移到更严肃的 DSP 场景时仍需补足信号处理细节。

科研议题Stanford Hazy Research

Look Ma, No Bubbles! Designing a Low-Latency Megakernel for Llama-1B

本文聚焦低延迟、batch size=1 的 Llama-1B 推理优化,指出 vLLM 和 SGLang 在 H100 上因大量小 kernel、launch/teardown 开销、以及严格的 kernel 顺序同步而只能利用约一半 GPU 带宽。作者提出把整层前向传播融合为一个“megakernel”,并用 GPU 端解释器统一调度各类指令。为解决资源竞争与依赖同步,他们设计了共享内存分页机制和基于计数器的显式同步,把权重加载、激活读写和计算更紧密地流水化。实验显示,H100 上前向传播可达到约 78% 内存带宽利用率,较基线提速 1.5x 至 2.5x;B200 上单次前向可压到 680 微秒以内。文章同时说明该方法主要适用于内存带宽主导、且追求极低延迟的场景,仍受激活加载、原子操作和同步开销限制。

文中给出了可验证的性能数据、明确的瓶颈分析和完整的实现取舍,不是泛泛而谈的加速口号。适合做 LLM 推理、GPU runtime 和系统优化的参考,但其收益主要局限于 batch=1 的低延迟内存受限场景。

技术文章PlanetScale Blog

The MySQL adaptive hash index

这篇文章系统解释了 MySQL InnoDB 中的自适应哈希索引(AHI)是如何在 B-tree 索引之上再加一层内存加速的。作者先回顾了 B-tree、InnoDB buffer pool 和普通哈希查找的差异,说明 InnoDB 虽然不支持磁盘上的 HASH 索引,但会在运行时为高频访问的索引值或前缀构建 AHI 条目,把键映射到 buffer pool 中的数据位置。文章还说明 AHI 会根据访问模式和 buffer pool 命中情况自动增减,适合重复查同一批热点值的场景,不适合缓存很小或数据访问很分散的负载。通过 3.9 亿行表上的基准测试,作者展示了开启 AHI 后约 16% 到 20% 的 QPS 提升,并用 InnoDB 状态输出验证了哈希搜索确实被使用。结论强调:AHI 不是通用银弹,但在高并发、热点明显且索引较深的系统中,哪怕单次收益不大,也可能显著影响整体延迟和服务器容量。文章的边界也很清楚:收益高度依赖工作负载、buffer pool 大小和重复访问模式。

推荐收录,因为文章不仅解释了 AHI 的工作机制,还给出了 buffer pool、哈希命中统计和真实基准测试结果,能帮助读者判断它为什么快、何时有效。适合做 MySQL/InnoDB 性能优化、热点查询分析和存储引擎原理参考;但收益强依赖访问模式,不能把文中的提升直接外推到所有业务。