vatt'ghern jaskier's ballads

2026.09.09 —— 今日 10 則

TODAY'S THREAD 今天有四則,問題都出在沒人回頭量的預設值上——prefix cache 被當成透明的最佳化、TLS 握手一律先賭 X25519、Rust enum 的 alignment 悄悄把一個值撐成兩倍寬、LLM decompiler 用 recompilability 當分數卻獎勵了錯的路徑。

10 items ai · 3 systems · 3 infra · 2 web · 1 backend · 1
0 / 10 read
#01

同樣的請求,快取開著就不是同一個答案

prefix caching 在主流 serving stack 預設開著,也一直被當成 transparent optimization,這篇把它在可重現性上的代價量了出來——模型、解碼參數、seed 與請求順序全部固定,batch size 1 逐一送出,八十個 episode 的 agentic tool-use 工作流在 16-bit 下有 36.2% 走上不同軌跡,四位元權重下是 75.0%。關掉快取則 800 個 episode 全部 bit-identical,把其他不確定性來源的上界壓在 0.5%。作者的說法是,在 cache state 固定的前提下,快取本身是決定性的;真正的麻煩在於那份 state 不在 request 裡,預設也不會被重置。

read source → deep read llm-serving

#05

四位元還撐得住,一位元就掉到亂猜

同一顆 Qwen3.8 27B 從 BF16 一路壓到 1-bit,跑 GPQA Diamond、IFBench 與 Terminal-Bench 2.1 三套 benchmark,reasoning effort 分低、中、xhigh 三檔。Q4_K_M 把 55 GB 壓成 17 GB,agentic coding 的 pass rate 大約 77%、與 BF16 打平;UD-Q2_K_XL 掉到 68% 上下,1-bit 在 GPQA Diamond 上直接落到亂猜的水準。作者自己標了 caveat——Q8_0 的 Terminal-Bench 數字是內插而非實測,那批 Unsloth 量化檔在 2026 年 8 月 19 日之後也已經取不到。

read source → quantization

#06

編得起來、測試也綠,行為卻換了一個

LLM decompiler 現在幾乎只用 recompilability 與 re-executability 評分,這篇指出那兩個指標會獎勵錯的路徑:函式可以重新編譯、通過所有隨附測試,卻在其他合法輸入上偏離原本行為,已揭露的漏洞甚至可能連 crash 都不見。作者提出的 Decompile-Diverge 不靠固定測試,而是替每個函式合成 driver、從參考實作長出 fuzzing corpus,再拿同一批輸入重跑比對行為。八個系統九種設定下,通過全部隨附測試的候選仍有 4.9% 偏離、單一系統最高 13%;最強的 refinement LLM 把 Ghidra 的 build rate 從 75% 拉到 90%,Matched rate 卻從 74% 掉到 62%。

read source → reverse-engineering

#02

一個值不該佔到 128 個位元

Plush 這個用 Rust 寫的動態語言直譯器原本以 tagged enum 表示值,因為 alignment,每個值實際佔 128 bit,語意上只需要 64 bit。作者把它換成手寫的 tagged word——fixnum 是 62-bit 有號整數、tag 00、以 n << 2 存放所以能直接做算術,flonum 走 tag 10 並把 IEEE 754 的指數位元 rotate 過,immediate 用 tag 01 再配 5-bit subtag 放 nil 與 true 這類值,另外留兩種指標型別分開以便快速比較相等。array-heavy 的 benchmark 記憶體最多降 37%,每一項 benchmark 都變快、多數落在 10 到 20%,代價是整數 overflow 要 box 到 heap。

read source → deep read interpreter

#07

樸素比對法換一件衣服,就成了 Bitap

Bitap 的作法是把「還在進行中的比對」整包存成一個 bitset:每讀一個字元就無條件左移一位讓所有狀態前進,再跟該字元的合法轉移遮罩 AND,一次殺掉所有非法狀態。只要 pattern 短於一個 machine word,複雜度就是文字長度的線性。作者沒有給 benchmark,也直說預計算的成本讓它在實務上未必贏過樸素解法——它的價值在好推導,用他的話說就是換一身衣服的樸素演算法。

read source → string-matching

#10

兩個 nested function,共用同一個 frame

GCC 在 middle-end 很早的一個 pass 就把 nested function 降成普通的 static function:父函式裡被存取到的變數收進一個合成的 structure,指標當成隱藏參數傳進去,於是這件事跟編譯器其他部分解耦。跟 C++ lambda 的差別在共用——同一個父函式裡的兩個 nested function 拿到的是同一個 frame structure 指標,C++ 則替每個 lambda expression 產生各自的物件,儘管實作不同,兩邊語意相同。作者給的 Godbolt 例子最後被最佳化成 lea eax, [rdi+1] 加一個 ret,並提到 WG14 的 N3884 想讓這種不捕獲的 local function 用 static 儲存類別寫進標準。

read source → compilers

#03

握手之前,先把 origin 支援什麼量出來

TLS 1.3 要求在 ClientHello 就送出 keyshare,等於在還不知道對方支援什麼之前先賭一個 key agreement 演算法;Cloudflare 過去一律賭 X25519,對大約三成的 origin 賭錯,代價是一個 HelloRetryRequest 與 p90 多出的 150 毫秒。Automatic Key Exchange 把猜換成量——在 production 流量之外對每個 TLS 1.3 origin 逐一試 X25519、P-256、P-384、P-521 與 X25519MLKEM768,結果按各 subdomain 的實際流量加權,再定出 per-origin 偏好。掃過的 origin 上 HelloRetryRequest 從 52% 降到 3.7%,每天約 450 億條 post-quantum 連線;代價是約 0.34% 的 origin 一收到 post-quantum keyshare 就握手失敗,多半是舊 middlebox 丟掉跨多個封包的 ClientHello。

read source → deep read post-quantum

#08

從 archive.org 挖出根憑證,兩天把它分解掉

作者從 archive.org 的舊瀏覽器安裝檔裡挖出 E-Certify 的兩張 512-bit RSA 根憑證,以及 IE 3.02 裡那張 VeriSign 測試用的 code signing 根,再用 CADO-NFS 在一台 Ryzen 9 5950X、32 條執行緒上分別跑 32 小時與 29 小時把 E-Certify 那兩張分解掉。沒有什麼特殊弱點,就是 512 bit 太短——這批根憑證是 1999 年 3 月隨 Netscape 4.51 出貨的,而同等規模的 RSA-155 在同年稍晚就被分解掉了。私鑰到手之後,把系統時鐘調回去,簽出來的憑證在當年的 Netscape 4.51 裡就驗得過。

read source → cryptography

#04

一條不關的連線,撐起一整局 Flappy Bird

作者用 Rust 後端寫了一個沒有任何 client-side JavaScript 的 Flappy Bird:HTTP 連線一直開著不關,持續把 CSS 更新以 60 FPS 涓滴送過去,管子、鳥與分數全靠瀏覽器重新套用樣式來移動。輸入走另一條路——一個蓋滿整個畫面的隱形按鈕把表單送進隱藏的 iframe,伺服器用一組自己發的 UUID 認出是哪個玩家,畫面因此不會重新載入。普通硬體上一個 CPU core 大約撐得住 500 場遊戲、一場約吃 20 KiB/s,但延遲完全由地理距離決定,隔著一座海洋就沒法玩了。

read source → ssr

#09

弱 isolation 換來的效能,帳記在偶發的錯誤上

多數 data store 應用為了可擴充的效能把 isolation 調弱,換來的是零星的不可序列化執行,而那些執行不是算錯就是直接失敗。既有的 dynamic predictive analysis 有兩個缺口——處理不了帶複雜 predicate 的 SQL 查詢,而且會報出其實沒有違反 View Serializability 的執行。Augur 說自己是第一個同時補上這兩點的動態預測分析,並在 OLTP-Bench 的程式與 Spree 這套電商應用上找出可行的不可序列化執行。

read source → database

today's deep reads

deep · 01 同樣的請求,快取開著就不是同一個答案 deep · 02 一個值不該佔到 128 個位元 deep · 03 握手之前,先把 origin 支援什麼量出來