2026.08.28 —— 今日 10 則
TODAY'S THREAD 今天有四則各自從不同高度盯著同一件事——記憶體怎麼擺、怎麼走、怎麼算錢:Cloudflare 把 1.1.1.1 的快取每筆瘦身 56%,一篇 GPU 讀記憶體的拆解把一次 load 攤成一連串會落空的硬體查詢,向量序列化的 float 把 payload 從 8.6 GB 撐到 15.2 GB,而 Maia 200 乾脆把資料搬運交給程式明確編排。
一次 GPU 記憶體讀取,到底走過哪些路
這篇把一次 GPU 記憶體讀取從 warp 發出載入指令開始,一路追過 coalescing、L1 與 L2 快取,最後落到 RTX 4090 上的 GDDR6X 記憶體晶片。作者把「讀一個 float」拆成一連串會分別命中或落空的硬體查詢,每一次落空都把成本推高一個量級。對正在調推論或訓練 kernel 的人來說,這條路徑決定了你手上那份 profile 該怎麼讀。
資料搬運改由程式明確編排:Maia 200 用 dataflow 架構換掉執行緒思維
Maia 200 這顆 AI 加速器的規格是 750W TDP 下 10,145 Tflop/s FP4 與 5,072 Tflop/s FP8,搭配 7 TB/s 的 HBM 頻寬。真正值得看的是它主張的架構類別——Software Defined Locally Accessed Dataflow:把特化記憶體與資料搬運引擎交給程式明確編排,而不是沿用今天以執行緒為中心的模型。這條路線若成立,寫 kernel 的心智模型要跟著換一套。
「async」「await」長得一樣,語意卻各過各的
越來越多語言提供所謂 straight-line asynchrony——讓非同步函式看起來跟同步函式一樣,藉此避開複雜的控制流。這篇論文逐一拆解這些語言後指出,共用 async 與 await 這兩個關鍵字並不代表語意相通:呼叫非同步函式當下給出什麼保證、task 生命結束時發生什麼、task 被取消時怎麼處理,沒有兩個語言在整體上取得一致。作者用九個設計維度與形式化語意把差異攤開,外觀相似的程式因此可能跑出不同結果。
Apple Silicon 上游化進度:Asahi Linux 7.2 報告出爐
Asahi Linux 發布 7.2 進度報告,交代 Apple Silicon 支援往上游推進的現況:這一輪合併了哪些驅動、GPU 與顯示子系統做到哪裡,以及較新的 M 系列硬體還剩哪些逆向工程缺口。想拿 M 系列機器跑原生 Linux 的人,這份報告是判斷「現在能不能上」最直接的依據。
五招 Rust 記憶體最佳化,讓 1.1.1.1 的快取省下 100 TB
Cloudflare 對 1.1.1.1 resolver 的 DNS 快取連下五刀,把每一筆快取條目的佔用砍掉約 56%,機隊整體的工作集記憶體因此少了大約 100 TB。五刀全落在型別選擇上:Vec 與 String 換成 Box<[T]> 與 Box<str> 以去掉多餘的容量欄位、三段回覆併成一份帶 u16 offset 的清單、owner 與查詢網域相同時整個省略、較大的 RecordData variant 裝箱而 A/AAAA 留在原地、record data 改存成一段 wire format 原始位元組。槓桿完全來自規模——單筆省下的位元組乘上快取條目總量,才是真正的數字。
標準 RoCE 撐不住 AI 訓練叢集,Meta 自己做了一套 RDMA 傳輸
Meta 推出 MetaRoCE,一套針對 AI 訓練叢集設計的 RDMA over Ethernet 傳輸協定,要解的是標準 RoCE 在他們這個規模下壅塞控制與遺失復原的極限。AI 訓練的通訊樣式跟一般資料中心流量不同——大量同步的 collective 操作會把既有機制推到設計假設之外。對自建訓練叢集的團隊來說,這是一份說明「標準協定在哪裡開始不夠用」的第一手材料。
Stripe 把 Envoy 換掉,自己寫了一套 proxy data plane
Stripe 說明他們為什麼捨棄 Envoy、改寫成自建的分散式 proxy,新的代理層叫 mesh-proxy,撐的是他們設定的 99.9995% 可靠度目標。文章講的理由很具體:Envoy 以 worker 為單位的執行緒模型帶來過多的連線開銷,加上升級時的行為變動對他們這種服務組成複雜的機隊風險越來越高。自建代理層通常是最後手段,代價是整套維運與演進責任全部自己扛——文章值得看的正是那條界線。
useMemo 與 useCallback 真正在解的,是參考相等性
這篇把 useMemo 與 useCallback 解決的兩件事拆開:一是避免無關的 state 變動觸發昂貴的重算,二是跨 render 保住物件與函式的參考,免得 React.memo 的純元件被參考不相等打破。作者點名的誤解是——陣列與物件只比較參考、不比較值,所以就算內容從沒變過,每次 render 產生的新實例照樣會讓子元件重新渲染。他的建議是先用 React Profiler 找出慢的 render 再對症下藥,只有可重用的 custom hook 與 context provider 這兩種下游影響難以預期的場合,才值得預先套上。
把 embedding 用 JSON 浮點數送出去,payload 就這樣胖了一圈
這篇拆解把 embedding 向量序列化成 JSON 浮點數時,payload 會膨脹多少:100 萬條 768 維向量,正確輸出只要 8.6 GB,多印了位數之後變成 15.2 GB。Bonsai 抽查自家 18 個向量搜尋叢集,其中 12 個中招。作者給的修法是把輸出校正回九位有效位數,或改走 base64、Arrow、protobuf 這類二進位路徑。
上游改了 schema,下游的 Flink 與 Spark 不該默默壞掉
Pinterest 說明他們新一代 CDC 資料匯入平台怎麼自動處理上游的 schema 變更,整套建在 Kafka、Flink、Spark 與 Iceberg 之上。關鍵設計是把 schema 當成跨系統的契約來管,讓上游的變更沒辦法悄悄弄壞下游的 Flink job 或 Spark upsert。資料管線最難查的故障往往就是這種——沒有人報錯,只是資料開始不對。