博客
关于 GPU、LLM、MLOps、Kubernetes 以及心态的文章 · 855 篇
#2026-03 168#ai 112#llm 90#ai-papers 62#career 60#kubernetes 57#mindset 51#ai-platform 48#devops 45#security 43#deep-learning 35#performance 33#psychology 32#mlops 30#observability 29#2026-04 26#linux 24#database 23#robotics 22#rust 22#ai-agent 21#mcp 20#productivity 20#culture 19#evaluation 19#gpu 18#transformer 18#electronics 17#paper-review 17#pytorch 17#developer-tools 16#distributed-systems 16#engineering 16#learning 16#open-source 16#postgresql 16#rag 16#fundamentals 15#network 15#2026-08 14
CXL 内存分层,内核走到哪一步了 — DAMON 合并了什么,数字又没测到什么
即便 CXL 硬件已经插在服务器上,真正决定把哪些热页面、哪些冷页面搬来搬去的还是内核。截至 2026 年 7 月,Linux mainline 已经陆续接收了基于 DAMON/DAMOS 的分层组件,从 6.11 一直分布到 7.2-rc1,但真正「装上就能用」的分层内核模块并不存在,而 CONFIGDAMON 自从 Linus 撤回默认启用之后,至今仍然是关闭状态。本文直接查阅内核源码,确认到底是哪些代码在第几版内核真正落地,并追溯
2026-07-16 · 30 分钟阅读 #hardware#cxl#memory#linux-kernel#performanceOTel 的 Kubernetes 属性变成 stable 了 — 在 k8sattributes 默认值翻转之前要做的事 ♪ 可收听
OpenTelemetry 的 Kubernetes 语义约定已经在 2026 年 6 月 12 日的 semconv v1.42.0 中晋升为 stable。但 Collector 的 k8sattributes 处理器目前默认值仍是旧模式(v0),所以大多数人什么都没感觉到。问题在于这不是永久的 — 按照 Collector RFC 制定的推进路线,一旦特性开关升到 beta,默认行为就会翻转为仅 v1,k8s.pod.labels
2026-07-16 · 18 分钟阅读 #opentelemetry#observability#kubernetes#semantic-conventions#telemetry-pipelineNix 2.35 更懒惰地把 flake 源复制到 store 了 — 一个持续 6 年 8 个月的 issue,以及上游没有选 lazy trees 而选的那条路 ♪ 可收听
Nix 2.35.0 于 2026 年 7 月 13 日打上标签,它的第一条亮点是「Sources are copied to the store more lazily」。被这一行改动关闭的 issue 3121,是 Eelco Dolstra 本人在 2019 年 10 月 7 日开的,2026 年 6 月 9 日关闭 — 历时 2,437 天。有意思的是,真正被合并的东西并不是 Dolstra 的 lazy trees。他的 PR
2026-07-16 · 21 分钟阅读 #nix#reproducible-builds#build-systems#developer-experience#open-sourceKubernetes v1.36 的 Workload/PodGroup API — Gang Scheduling 正走进 kube-scheduler ♪ 可收听
AI 训练与批处理工作负载的 gang scheduling,迄今为止一直是 Volcano、Kueue 这类外部调度器的活儿,但 Kubernetes 已经开始把这项能力搬进核心。v1.35 以 alpha 形式发布了 Workload API 和第一版 gang scheduling 实现,而 2026 年 4 月 22 日发布的 v1.36 则对结构做了大改 — 把 Workload 拆分成静态模板,把新的 PodGroup 拆分
2026-07-16 · 29 分钟阅读 #kubernetes#scheduling#gang-scheduling#distributed-training#draInfluxDB 3 Core 的「72 小时限制」其实是 432 个文件的限制 — Parquet 重写留下的账单 ♪ 可收听
InfluxDB 3 把整个引擎用 Rust 重写,并把存储层架在了 Apache Arrow 和 Parquet 之上。坊间常说「Core 只能查询最近 72 小时」,但翻遍源码也找不到这样的代码。真正存在的只有一件事 — 单次查询能扫描的 Parquet 文件数上限为 432,而 72 小时不过是用默认 gen1 时间块 10 分钟乘出来的派生值,还是最理想情况下的数字。本文逐行追踪 432 这个数字在源码里的来处,确认了 2025
2026-07-16 · 28 分钟阅读 #database#influxdb#time-series#parquet#storage-engineJDK 26 的 final 字段修改警告 — JEP 500 到底改变了什么,以及现在该检查什么 ♪ 可收听
JDK 26(2026 年 3 月 17 日 GA)通过 JEP 500《Prepare to Make Final Mean Final》,开始对通过深度反射重新赋值 final 字段的代码发出运行时警告。自 JDK 5 起,setAccessible(true) 之后的 Field.set() 就可以随意修改 final 字段,Gson 这类反序列化库和字段注入式 DI 整个都建立在这一点之上。现在的默认值是 warn,所以行为不变
2026-07-16 · 25 分钟阅读 #java#jvm#reflection#serialization#migrationllama.cpp 走进浏览器 — WebGPU 后端在 16 台设备上测出的天花板 ♪ 可收听
UC Santa Cruz 团队于 2026 年 5 月发布的 LlamaWeb 是 llama.cpp 的 WebGPU 后端,在 8 家厂商的 16 台设备上实测了浏览器端 LLM 推理,留下了迄今为止最广的数据集。结果是双面的。它比现有浏览器框架(WebLLM、Transformers.js)少用 29%~33% 的内存,解码吞吐量高出 45%~69%,但 prefill 仍只有 WebLLM 的 49% 水平,相比原生 CUDA
2026-07-16 · 25 分钟阅读 #webgpu#llm-inference#llama-cpp#on-device-ai#browserElixir 1.20 的渐进类型系统 — 不写注解也能找到"已验证 bug",实际是怎么回事 ♪ 可收听
2026年6月3日发布的 Elixir v1.20,完成了始于2022年的集合论类型系统的第一个里程碑。现在所有 Elixir 程序无需写一行类型注解就能被渐进式类型检查,编译器在守卫、函数体、分支之间推断类型,找出"一旦执行就必定在运行时炸掉"的违规和死代码。核心是 dynamic() 类型:和其他语言里 any() 会丢弃类型信息不同,Elixir 的 dynamic() 表现得像一个范围,会随代码收窄,只有当提供的类型与允许的类型
2026-07-16 · 27 分钟阅读 #elixir#type-system#beam#compiler#static-analysisKotlin Swift export 进入 Alpha — 正在拆掉 Objective-C 这座桥,但还不到过桥的时候 ♪ 可收听
Kotlin Multiplatform 在 iOS 上一直缴纳的最大一笔税,就是 Objective-C 这座桥。Kotlin 代码要传到 Swift,必须先经过 Objective-C 头文件,而在这个过程中,Int? 会被装箱成 KotlinInt,泛型只保留在类上,suspend 函数会变成 completion handler。Swift export 想要拿掉这座中间桥,让 Kotlin 直接导出给 Swift,并在 202
2026-07-16 · 25 分钟阅读 #kotlin#kotlin-multiplatform#swift#ios#compilerGo 1.26 的 goroutineleak profile — 用 GC 的标记阶段抓 goroutine 泄漏
Go 1.26(2026 年 2 月 10 日发布)在 runtime/pprof 中新增了 goroutineleak profile 作为实验性功能。思路是复用 GC 的标记阶段 — 只把可运行的 goroutine 当作根来标记,然后把阻塞在任何 goroutine 都无法到达的并发原语上的 goroutine 报告为泄漏。核心在于内存可达性是 goroutine 存活性的一个可靠的过近似(over-approximation),
2026-07-16 · 26 分钟阅读 #go#goroutine#garbage-collection#profiling#debuggingKafka Diskless Topics(KIP-1150)是什么 — 用延迟换取的跨 AZ 成本,以及一个尚未交付的功能
2026 年 3 月 2 日,Apache Kafka 社区批准了 KIP-1150 Diskless Topics。这是一项提议:用对象存储取代broker磁盘作为数据的真源,从而消除跨 AZ 复制流量 — 这正是超大规模云厂商环境下 Kafka 成本中最大的一块。但被批准的只是方向,不是实现 — KIP 正文自己写明「本 KIP 一旦被接受,不要求对代码库做任何改动」— 真正的设计文档 KIP-1163 与 KIP-1164 仍处于
2026-07-16 · 26 分钟阅读 #kafka#streaming#distributed-systems#cloud-nativegit history — Git 放在 rebase 旁边的实验性历史重写命令 ♪ 可收听
Git 2.54(2026-04-20)以实验特性的形式引入了名为 git history 的新命令,2.55(2026-06-29)又加入了 fixup 子命令。它把 reword/split/fixup 这三种常见的历史重写操作,用一条命令就能完成,不再需要交互式 rebase,并且会用一次原子性的 ref 事务,把目标提交的所有后代分支一并更新。维护者 Patrick Steinhardt 在提交信息里直接点明了这个功能的动机 —
2026-07-16 · 24 分钟阅读 #git#version-control#jujutsu#rebase.NET 11 runtime-async — 把 async 状态机从编译器搬到运行时的中期报告 ♪ 可收听
C 的 async/await 从 2012 年起就一直是编译器层面的功能。Roslyn 把方法体重写成一个状态机类,而运行时甚至不知道那是 async,只是照常执行罢了。.NET 11 的 runtime-async 把这个重写过程搬进了运行时内部 — 方法上会带一个 MethodImplOptions.Async 标记,挂起与恢复直接由 JIT 和 VM 处理。第一个看得见的成果是「活的」堆栈跟踪从 13 帧缩短到 5 帧,而从预览
2026-07-16 · 28 分钟阅读 #dotnet#csharp#async#jit#performanceeBPF Verifier 只告诉你它在哪儿停下 — 复现 235 例拒绝后测出的诊断落差 ♪ 可收听
用过 eBPF 的人都经历过这种事。Verifier 拒绝了你的程序,而错误信息指向的那一行看起来完全没有问题。2026 年 7 月发表的一篇论文首次把这种挫败感量化了出来。作者从 Stack Overflow、GitHub issue、修复提交和内核自测中收集了 936 个候选案例,在一套固定工具链 — 内核 6.15.11 + clang 18 — 上复现,分析了实际被拒绝的 235 例。结论是 — 47% 的拒绝只返回一个 EIN
2026-07-16 · 29 分钟阅读 #ebpf#linux#kernel#debugging#developer-experienceIceberg v3 行血统 — 行 ID 不存放在文件里 ♪ 可收听
Apache Iceberg 格式 v3 把「为每一行赋予稳定标识符」的行血统(row lineage)写进了规范,而且这不是可选项 — 只要是 v3 表就无条件开启。但这个值并不存放在数据文件里 — 而是通过一条从表的 next-row-id,经快照、清单(manifest),一路继承到数据文件的链条,在读取时才计算出来。这样设计是为了让乐观提交重试时不必重写数据文件,代价是维护血统的责任转移到了每一个 writer 身上。本文沿着规
2026-07-16 · 27 分钟阅读 #iceberg#lakehouse#table-format#data-engineering#sparkFerrocene 通过认证的 core — 编译器是 ASIL D,库为什么却止步于 ASIL B ♪ 可收听
"Ferrocene 的 Rust 编译器已通过 ASIL D 认证"这句话本身没错,但人们通常从中得出的结论并不成立。Ferrocene 把编译器作为 ISO 26262 ASIL D / TCL 3 的"工具"通过了资格认定,这意味着"可以在使用这个工具的前提下开发 ASIL D 软件",而不是"产出物就是 ASIL D"。真正被你的代码每一行都调用的 core 库,走的是另一套独立认证:2025 年 12 月先以 IEC 6150
2026-07-16 · 37 分钟阅读 #embedded#rust#ferrocene#safety#systemscontainerd 2.3 的 EROFS 原生层 — 去掉解包,换来了什么 ♪ 可收听
2026年4月30日发布的 containerd 2.3,打开了一条从镜像仓库直接拉取 EROFS 文件系统镜像并挂载的路径。不需要解开 tar,整个解包步骤就此消失,取而代之的只剩一次 blob 拷贝。但这并不是大家期待已久的懒加载(lazy pull) — containerd 自己的 seekable-erofs PR 明确写着"写了 chunk table 但没有消费它",镜像整体仍然要提前拉取这一事实没有变。代价也很明确。放弃
2026-07-16 · 26 分钟阅读 #container#containerd#oci#storage#linux为什么向量索引的默认值从 HNSW 变成了磁盘 — Elasticsearch bbq_disk 的权衡 ♪ 可收听
从 Elasticsearch 9.4(2026-05-05)开始,float 向量的默认索引类型变成了 bbqdisk,也就是基于磁盘的 IVF。不到一年时间里,默认值从 int8hnsw 变成 bbqhnsw,又第二次变成了根本不是图结构的磁盘索引 — 这次迁移背后的判断是:向量检索真正昂贵的资源不是算力,而是 RAM。本文梳理了 HNSW 的内存悬崖在厂商基准测试里体现为怎样的数字、BBQ 从原始论文 RaBitQ 那里拿走了什么
2026-07-16 · 35 分钟阅读 #vector-database#elasticsearch#ann-index#quantization#hnsw确定性模拟测试找到的那个 bug — KAFKA-19880,以及该怎么读「零 bug」 ♪ 可收听
确定性模拟测试(DST)把时钟、线程交错、随机数这些非确定性会渗入的来源,全部关进模拟器里,让那些原本无法复现的 heisenbug 可以靠一个种子重新召唤出来。2026 年 3 月,Aiven 把 Kafka 的 Diskless Topics 实现放进 Antithesis 里,跑了大约 2,200 个逻辑小时,结果是零 bug。真正的 bug 却出自对照组 — 他们为了验证而跑的上游 Apache Kafka 原版代码,跑出了 K
2026-07-16 · 26 分钟阅读 #testing#deterministic-simulation-testing#distributed-systems#kafka#antithesisWASI 0.3 的原生 async — wasi:io 消失的原因,以及还没做完的事
2026 年 6 月 11 日,WASI 子工作组批准了 WASI 0.3.0。核心变化是 async 下沉到了组件模型的规范 ABI 里,结果 wasi:io 包整个消失了。这件事重要,不是因为性能,而是因为可组合性 — 在 WASI 0.2 里,每个组件都各自带着自己的事件循环,一旦用上 async,就无法再和其他组件组合(三明治问题)。6 月 22 日,Wasmtime 46 默认打开了 WASI 0.3,运行时这一侧算是真正到位
2026-07-16 · 28 分钟阅读 #webassembly#wasm#wasi#component-model#systems