Internals for Interns

RSS: https://internals-for-interns.com/index.xml
以通俗易懂的方式讲解软件内部原理的博客合集。

模型服务器

这是"Kronk"系列的第三篇,前两篇分别介绍了推理 SDK 和模型管理层(下载、适配硬件、加载),本篇聚焦最后一块拼图:用 HTTP API 把整套模型服务暴露给现有的 OpenAI 客户端。 文章以 Go 实现为主线,面向想在本地或私有环境里跑 LLM 并复用 OpenAI 生态的开发者,适合对端侧模型部署有实际需求的读者。
评论点赞收藏2 天前

NUMA:内存到底连在哪里

这是一篇 Linux 内核系列教程的延续,前面几篇追踪了一个网络包从网卡进来到发出的完整内存路径,但始终假设"一个页就是一个页"。 本文指出这个假设在多路服务器上不成立:每个 CPU 插槽有自己的本地内存,访问远端插槽的内存需要绕路,因此内存有位置,位置决定访问速度,内核只能管理、无法隐藏这一点。 文章引出 NUMA 这个概念,解释为什么在双路服务器上假设"内存无差别"会出问题。内容偏教学铺垫,篇幅短,核心是把"内存有 locality"这一反直觉点讲清楚,为后续深入 NUMA 拓扑、调度、内存分配策略做引子。
评论点赞收藏9 天前

模型管理

这是 Kronk SDK 系列教程的第二篇。上一篇讲了批处理引擎、对话缓存和一堆围绕极小公开 API 的 workaround;这篇换成“跟模型本身走”的视角:模型文件在磁盘上怎么存、第一次怎么落到本机、配置从哪里来、Kronk 怎么判断你的 VRAM 装得下模型、以及请求到来时如果目标模型还没加载会怎么处理。 对本地部署大模型、想理解加载/换模型/显存预算这类底层机制的读者有用,但属于单项目机制讲解,讨论入口有限。
评论点赞收藏15 天前

理解 Testcontainers:Ryuk 清理器

Testcontainers 在测试运行时会自动启动一个名为 Ryuk 的容器,负责在测试结束后清理所有测试用的容器。 这个容器出现在 docker ps 输出里,镜像是 testcontainers/ryuk,名字因语言库而异(Go 用 reaper_ 前缀)。 它随测试启动,测试结束就消失,专门用来确保 Postgres、Redis、Kafka 等测试容器不会残留。
评论点赞收藏23 天前

Linux 内核网络子系统:一个数据包的完整旅程

追踪一个网络数据包在 Linux 内核中的完整进出路径,揭示网络子系统如何调用驱动注册的函数指针。文章从上一篇 register_netdev 的"承诺"出发,顺着数据包走一遍内核网络栈的完整流程,包含具体源码位置(netdevice.h:1436、dev.c:11531)。
评论点赞收藏30 天前

Kronk SDK:用 Go 封装 llama.cpp 的 C API

Kronk 是一个 Go 层,把 llama.cpp 的 C API 封装成更友好的 SDK 接口。公开方法只有 Init、New 和几十个方法,但背后有大量封装逻辑。 这是 Internals for Interns 系列的第二篇,上一篇拆解了 yzma 的实现。
评论点赞收藏37 天前

深入剖析 PostgreSQL SQL 查询内部机制

一本讲解 PostgreSQL 查询执行全流程的书,从词法分析、语义校验、规则重写、代价优化到迭代器执行逐一展开,同时涉及内存管理、磁盘组织和并发控制。
评论点赞收藏39 天前

Go 语言现代 REST API 开发实战

一本介绍用 Go 标准库构建生产级 REST API 的实战书籍,强调不依赖重型框架,配合 GORM 和 Squirrel 等轻量库实现可扩展的 API。
评论点赞收藏39 天前

Yzma:用 Go 直接调用 llama.cpp 推理引擎的内部实现

<p>在我们研究了推理的实际情况<em>是</em>——模型如何逐个标记输入提示并构建响应。我提到了两个可以让你本地运行这个循环的Go项目:,使得 Go 称推理引擎直接,以及,它会在其上构建一个友好的 SDK。<br><br>今天我们打开yzma,看看整个过程是如何组合起来的。</p>
评论点赞收藏51 天前

Fake Clocks, Real Guarantees: Inside Go's synctest

The first time I reached for testing/synctest, I assumed it was a sleep helper with better manners. The public API is small enough to support that assumption: synctest.Test(t, func(t *testing.T) {... ...
评论点赞收藏58 天前

区块层

<p>在 中,我们从 <code>read()</code> 开始,一路向下遍历 VFS:从系统调用开始,经过 <code>struct file</code>,再到 ext4,最终进入页高速缓存。<br><br>而就在那一刻,我们恰好跳过了许多细节。当页高速缓存发生<em>未命中</em>——即这些字节尚未加载到内存中——文件系统不得不真正去从磁盘上读取它们,而我们当时只是简单地说道:“它会通过块层来读取磁盘。”接下来,我们就将深入探讨这一时刻。</p>
评论点赞收藏65 天前

什么是推理?

介绍在 Go 语言中本地运行大语言模型的技术路径。重点提及 Yzma 项目允许 Go 直接调用 llama.cpp 库(无需 cgo),以及基于其构建的高层 SDK Kronk。 旨在向开发者普及本地推理概念及 Go 生态下的实现方案。
评论点赞收藏72 天前

深入 Linux 内核:虚拟文件系统 (VFS) 原理

Linux内核系列续篇,从调度器深入文件系统层。解析程序打开文件时的内核路径:VFS如何统一不同文件系统接口,以及底层驱动交互机制。 适合想补齐操作系统底层知识的开发者。
评论点赞收藏79 天前

Go 运行时深度解析:Profiling 机制揭秘

深入解析 Go 运行时五种 Profile(CPU、Heap、Block、Mutex、Goroutine)的底层采集机制与数据格式。文章揭示了它们共享同一 pprof 协议骨架,但采集模型截然不同:CPU 基于信号中断与无锁环形缓冲区流式处理;Heap/Block/Mutex 在分配器或锁内部原地聚合采样;Goroutine 则是全量快照。 详细拆解了采样率随机化、延迟计数(GC 配合)、时长加权采样及缩放估算等关键工程细节。
评论点赞收藏84 天前

真实Go存储引擎中的MMAP与pread之争

以VictoriaLogs为例,深入剖析Go存储引擎中mmap与pread的性能权衡。指出mmap虽能减少系统调用开销,但冷数据引发的Major Page Fault会导致Go线程阻塞且无法被Runtime调度器感知,从而引发整体停顿。 文章展示了结合mincore检查页面驻留状态的双路径读取实现,为高性能Go数据库开发提供了极具价值的底层优化思路。
评论点赞收藏84 天前

理解 Linux 内核:调度器

深入解析Linux 7.1内核调度器机制。澄清进程与线程在底层均为task_struct,详解EEVDF算法如何通过虚拟运行时间(vruntime)实现公平性与低延迟平衡。 剖析上下文切换的缓存冷启动成本及抢占触发逻辑,适合希望理解操作系统核心原理的开发者。
评论点赞收藏95 天前

Understanding the Go Runtime: The Reflect Package

In the previous article we watched the runtime rebuild an entire stack trace out of metadata the compiler and linker had frozen into the binary at build time. I told you at the end that reflect works ...
评论点赞收藏102 天前

Memory Manager

In the previous article we looked at how a user program crosses the ring 3 → ring 0 boundary to ask the kernel for help. The example we used was read — a file descriptor, a buffer pointer, a byte coun...
评论点赞收藏114 天前

Memory Manager

In the previous article we looked at how a user program crosses the ring 3 → ring 0 boundary to ask the kernel for help. The example we used was read — a file descriptor, a buffer pointer, a byte cou...
评论点赞收藏114 天前

Stacktraces

In the previous article we took apart the select statement and saw how it’s really two features in one, with the compiler rewriting the easy shapes away and only the hard cases falling through to the ...
评论点赞收藏121 天前

Stacktraces

In the previous article we took apart the select statement and saw how it’s really two features in one, with the compiler rewriting the easy shapes away and only the hard cases falling through to the...
评论点赞收藏121 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。