消除 Toil:把重複的維運當成待消滅的 bug

· tech

#sre#reliability

第一篇說 SRE 的內核是「維運可以被工程化」。這篇講的 toil,就是那個要被工程化掉的東西。很多人以為 toil 就是「辛苦的工作」,其實不是——它是一類有明確特徵的工作,而且如果你不主動砍它,它會自然膨脹到吃光你所有做工程的時間。

什麼是 toil(以及什麼不是)

Toil 指的是「跟跑生產服務有關、但具備下面這些特徵」的工作。符合越多,它就越是 toil:

是不是 toil?看這六個特徵 手動 —— 要人一步步動手做 重複 —— 做過很多次、之後還會再做 可自動化 —— 機器能做,只是還沒有人去寫 無長期價值 —— 做完,系統並沒有變得更好 隨規模線性成長 —— 服務變大,它就跟著變多 被動反應 —— 被觸發才做,不是主動規劃出來的 符合越多 → 越是 toil。注意:開會、規劃、寫文件是 overhead,不算 toil
Toil 的六個特徵。它不是「累」,而是「做完什麼都沒留下」——手動、重複、系統沒因此變好。而開會、規劃、email 這些雖然也煩,是 overhead,不是 toil

分清楚一件事很重要:toil ≠ 所有討厭的工作。 開會、寫文件、規劃、回 email 這些是 overhead,雖然也佔時間,但不是 toil。Toil 特指那種手動、重複、機器本來就能做、做完系統卻沒變好的操作——手動重啟服務、手動改設定、手動處理每一次一樣的告警。也不是說一點 toil 都不能有;少量 toil 可以接受,關鍵是不能讓它膨脹

一個很常見的模糊地帶是「手動測試算不算 toil?」——答案是看哪一種,而分界正好落在「無長期價值」這條。每次 release 都手動點一遍相同的 regression 流程,六個特徵全中,是教科書級的 toil,該把它自動化掉;但探索性測試(人憑經驗到處戳、找出新的邊界情況)、第一次測一個全新功能、UX 測試,這些需要人的判斷、每次都在探索新東西、也很難自動化——它們有累積,不是 toil。一句判準:「這次手動測完,下次還要一模一樣再測一遍嗎?」 會,就是 toil;不會、每次都在用判斷探索,就是有價值的人力。

為什麼一定要砍:它會隨規模線性成長

Toil 最危險的特徵是「隨服務規模線性成長」。服務長大一倍,手動維運的量也大約長一倍。如果你放著不管,需要的人力就會跟著規模一路往上,直到把團隊淹沒:

服務規模 → 需要的人力 ↑ 放著不管:人力隨規模線性長 → 淹沒 投資自動化:人力與規模脫鉤 SRE 護欄:花在 toil 的時間 < 50%,另一半必須拿去做「減少未來 toil」的工程
放著不管,toil 隨規模線性長、把團隊淹沒(紅);投資自動化前期多花一點,之後人力與規模脫鉤(綠)。這正是 SRE「用軟體工程做維運」的核心:讓人力不再跟著規模走

更糟的是惡性循環:toil 越多 → 越沒空寫自動化 → toil 繼續累積 → 更沒空……因為 toil 總是「緊急」(告警在響、服務要重啟),而自動化總是「重要但不緊急」,永遠被救火排擠到明天。為了打斷這個循環,Google 設了一條有名的護欄:SRE 花在 toil 的時間應該低於 50%,另一半必須拿去做「能減少未來 toil」的工程。這條線是刻意的——不強制圈出工程時間,它一定會被 toil 吃光。

怎麼砍(但不是全砍)

砍 toil 的主要武器就是自動化:把重複的手動操作寫成程式、做成自助工具、讓系統自己修復。但有個重要的前提——不是所有 toil 都值得自動化。 自動化本身有成本,你得算一筆帳:自動化的投資 vs 未來能省下的 toil × 發生頻率。一年才做一次的操作,花兩週去自動化它,通常不划算;但每天要做、每次十分鐘的,自動化的投報率就極高。所以砍 toil 不是無腦全自動化,而是挑投報率高的先下手

反思

Toil 的本質不是「累」,是「沒有累積」

我以前會把「這工作好煩、好累」跟「這是 toil」畫上等號,後來發現重點根本不在累不累,而在做完有沒有留下東西。蓋一個新功能很累,但它有累積、系統變好了,那不是 toil;手動重啟服務第一百次同樣累,但系統一點沒變、下次還得再來,那就是 toil。這個區分讓我更清楚該保護什麼——我要守住的是「有累積」的時間,砍掉的是「純消耗」的時間。把人放在會累積的地方,把純消耗交給機器,這才是 SRE 說「工程化」的真正意思。

50% 上限是一條「刻意的護欄」,不是理想值

我最欣賞 50% 這條線的地方,是它承認了一個現實:如果不硬性圈出工程時間,它一定會被救火吃光。 因為 toil 永遠比較「緊急」,自動化永遠比較「重要但不緊急」,而緊急的事總是贏。50% 不是說「理想上花一半在 toil」,而是「上限」——一條逼你把重要不緊急的事保護起來的護欄。這跟我做任何長期投資的紀律一樣:重要但不緊急的事,不主動圈時間保護,就永遠不會發生。

別為了自動化而自動化

砍 toil 也要防走火入魔——不是所有 toil 都值得自動化。我看過有人花一個月自動化一個一季才跑一次、五分鐘就做完的流程,純粹因為「手動很不 SRE」。但那筆帳算下來根本虧。自動化是手段不是信仰,判準永遠是那筆 ROI:投資 vs 省下的 toil × 頻率。這又回到 先確認痛點再上重武器——先看這個 toil 到底痛不痛、夠不夠頻繁,值得了再自動化。把力氣花在天天在痛的那幾件事上,比追求「零手動」的潔癖實在得多。