觀測者效應(observer effect)
在這個領域每一件工具底下,都流動著一個誠實、略微令人不安的真相:量測一個系統的動作會改變它。借用物理學的說法,觀測者效應指出這個事實:你無法免費地觀察一個運行中的程式——你加上的每一個探針、計數器、日誌行、追蹤,都消耗一些時間、記憶體或快取,於是擾動了你正想理解的那個行為本身。你量測的系統,永遠不會剛好是你若沒量測時會擁有的那個系統。
具體來說,每一個量測器都帶有成本。一個 kprobe 補進一個中斷點,在每次命中時加入一個陷阱(幾百奈秒)。一行日誌要花格式化、寫入與 I/O 的成本。一個 trace span 替每個請求加上一點工作與一點記憶體。即使是硬體效能計數器,再便宜也不是真的零,而開太多會強迫多工、加入估計誤差。危險不只是把東西拖慢——而是「扭曲」:如果你的插樁恰好在程式最熱的地方最重,你可能把一條快路徑弄得看起來慢、把時序改變到足以隱藏或製造出一個競爭條件、或擾動快取使得那些數字不再反映未插樁的程式。一個特別尖銳的版本:一個替每個微小函式計時的插樁式剖析器,可能花在量測一個熱門函式上的時間,比那函式本身還久,純粹因為你看了它,就把它回報成很貴。
它之所以重要,是因為它形塑了整門正式環境可觀測性的紀律,並要求智識上的誠實。它正是「為什麼」整支程式與正式環境工作偏好取樣(偶爾偷看一眼)而非全面插樁、「為什麼」好的探針被設計成未啟用時近乎免費(tracepoints、USDT)、以及「為什麼」你對日誌與 traces 取樣而非捕捉一切的原因。隨之而來的專業習慣是:把負擔做小、並量測負擔本身;在活系統上偏好以讀為主、低影響的工具,以把波及範圍降到最小;而且永遠不要相信單一訊號——拿另一種方法去印證一個令人意外的量測,因為最危險的數字,是那種錯得看似合理的數字。目標從來不是零擾動(那不可能);而是擾動小到、且被理解得夠透徹,使你的結論仍然成立。
未插樁: fast_path() = 每呼叫 40ns 加上一個 kprobe:fast_path() = 40ns + 約 300ns 陷阱 = 每呼叫約 340ns(8 倍!) # 那個「很貴」的函式大半是看它的成本 -> 扭曲的結論
替一個微小的熱門函式插樁,可能主宰它被量到的時間,使它純粹因為被看而顯得很貴——這就是數字化的觀測者效應。
這名字借自物理學,但在系統上的意義具體且無可迴避:目標不是零擾動(不可能),而是擾動小到、且被理解得夠透徹,使結論仍然成立——這正是為什麼你要量測負擔、且絕不單獨相信一個令人意外的訊號。