是它掛了,還是只有你?
多觀察點檢查從其他人的網路、其他國家中的探針上,在你從自己網路執行它的同一時刻,執行同一個測試——一次 ping、一次 HTTP 請求、一次 DNS 查詢。這一處改變把一個無從回答的問題(「我這兒能用——還有別人也這樣嗎?」)變成了一個對比:如果每個觀察點都失敗,目標就是掛了;如果只有你的失敗,問題就住在你與它之間的路徑上。本指南講清单個第二觀察點到底能證明什麼、人人都會踩一次的 anycast 陷阱,以及如何用本站的全球 ping 來做這個檢查。
「我這兒能用」的問題
每個事故頻道都在同一小時內聽過這兩句話:「網站掛了」和「我這兒能用」。它們可以都是誠實的報告。從單個觀察點——你的筆電、你的辦公室、一台監控機——執行的一次測試,測量的恰恰只有一件事:那一個網路、在那一條路徑上、在那一個時刻的體驗。它分不清一個對所有人都掛了的服務,和一條只對你斷了的路徑:一個生病的傳輸提供商、一條區域性過濾規則、一個回傳被汙染或陳舊答案的 DNS 解析器、一場發生在三張網路之外、你從未聽說過的對等糾紛。從單個觀察點內部看,這些全都長得一模一樣——一個沒有回郵地址的失敗。
工單和狀態頁受著同樣的幾何之苦。狀態頁說「運行正常」,因為提供商自己的探針——坐在提供商自己的鄰里裡——能順利到達服務,而一整個地區到不了。使用者報告「掛了」,因為他們的 ISP 把流量黑洞了,而服務正哼著歌運轉。兩邊都沒有撒謊;兩邊都在從一把椅子上做概括。修法不是從同一把椅子上做更精確的測量。而是更多的椅子。
第二個觀察點能證明什麼
在其他網路上加上探針——其他自治系統、其他國家、其他種類的連線——並從它們全部同時執行完全相同的測試。現在模式自己會爭辯。如果三個洲、五張網路上的探針在同一時刻以同樣的方式全部失敗,共同因素就是目標:服務、它的主機、或它自己的網路掛了,再多的本機擺弄也改變不了這一點。如果四個成功而只有最接近你處境的那個探針失敗——或者只有你失敗——共同因素反轉:目標是活著的,斷裂在失敗的觀察點所共享的路徑上的某處。獨立觀察點之間的一致,是「它掛了嗎?」這個問題能得到的最接近證明的東西。
本站使用的探針屬於由 jsDelivr 運行的 Globalping 網路:數千個由全世界志願者託管的小型軟體探針,從資料中心伺服器到家庭連線都有,它們接受標準化的測量——ping、traceroute、MTR、DNS 和 HTTP——並報告它們所看到的。價值不在任何單個探針;一個城市裡的一台志願者機器只是一個軼事。價值在於這些軼事是獨立的:不同的網路、不同的上游、不同的故障模式,全都在同一時刻回答同一個問題。
anycast 與 CDN 的注意事項
陷阱在這裡,人人都會踩一次:來自不同地方的不同答案可以全部都是對的。現代服務不是一個地方的一台機器。Anycast 從許多位置通告同一個位址,所以法蘭克福的一個探針和聖保羅的一個探針向「同一個」 IP 發包時,談話的是不同的物理邊緣,可能在不同的基礎設施大陸上——一個健康,一個正在重啟。CDN 把每個用戶端引向附近的邊緣,而一個邊緣可以在一個地區掛掉、服務在其他地方卻完美無缺。探針之間的分歧並不自動等於矛盾;對一個 anycast 目標來說,分歧正是設計在按意圖工作,問題也隨之變成「在哪裡掛了?」而不是「掛了嗎?」。
DNS 從另一面說明同一點。權威伺服器和解析器按設計給出不同答案——GeoDNS 回傳「最近」邊緣的位址,EDNS 用戶端子網讓解析器可以代表你的鄰里提問,所以東京的一個探針解析器和德克薩斯的一個解析器會合理地為同一個名字收到不同位址(當問題是世界持有的是哪些記錄時,用 DNS 傳播檢查器把它們並排比較)。來自不同探針的不同位址不是不一致的證據。它們是那個名字正在做在地化的證據——並且它們告訴你每個地區的使用者實際會遇見哪個邊緣。
選能回答問題的那種測量
全球 ping 提供五種測量類型,選得好比跑得多更重要。每一種回答不同的問題,跑錯一種會得到對你沒問過的東西的自信答案。在看任何人的結果之前,先把類型與症狀對應好。
Ping 回答最窄的問題:目標從這裡可達嗎,路上丟了多少?它是「這個網路到底能不能看見那台主機」的正確測試,也是對應用層任何事情的錯誤測試——一台主機可以在它的 Web 服務已死時仍然回答 ping。HTTP 回答使用者的問題:一次真實的請求從那裡能成功嗎,狀態碼是什麼,整件事花了多久?當爭論是「網站能用/網站不能用」時,來自多個探針的 HTTP 是雙方都該接受的證據。DNS 回答命名問題:每個地區實際為這個名字拿到哪些位址?它是你區分「服務掛了」和「我所在的地區被送往已死的邊緣」的方法。
Traceroute 回答在哪裡的問題:一跳一跳地,從這個探針到目標的路徑在哪裡停住、卡住、或拐向意想不到的地方?請從失敗的那個觀察點執行它,而不是從一個能用的觀察點。MTR 是隨時間推移的 traceroute——同一條路徑被反覆探測,於是遺失和延遲以速率而不是一個凍結樣本的形式按跳顯示;它是為「它間歇性地壞」準備的工具,那時單次 traceroute 抓到的恰是路徑表現良好的一天。五種測量共同的紀律是:先判定你在測哪種故障,選那一種能看見它的測量,讓其他測量等一等。
讀結果而不自欺
先分開人們習慣性合併的兩個數字。遺失——從未回來的請求——是損害;延遲——慢慢回來的請求——是不適,而兩者的成因和修法不同。一個顯示 100% 遺失的探針找到了一堵牆;一個顯示零遺失和高延遲的探針找到了一條長路或擁堵的路,把後者報告成「掛了」正是健康服務被半夜叫醒的原因。然後做同類比較:以中位數探針為故事,而不是最好的,也不是最差的。一個探針回傳一個離譜的離群值——巨大的延遲、一個別人都沒見過的逾時——那是關於那個探針的那一刻、它的主機、或它的上游的陳述。只有當獨立的探針與它一致時,它才成為關於目標的證據。
也請留意記帳。一個探針報告目標「離線」、而它的鄰居們都成功時,它最可能報告的是它自己——一個崩掉的探針、一段斷掉的家庭連線、一個本機過濾器——而志願者探針這些都有;這是一個沒人集中運營的網路的代價。記下時間戳記,並把陳舊的或快取的結果當作歷史,而不是新聞。而當每個探針都一致認為目標活著、你的使用者卻依舊到不了時,兩邊都信:你已經學到故障是真的、而且是窄的——它住在一條你的探針碰巧都沒有共享的路徑上,這是一個發現,不是一個矛盾。
誠實的限制
探針是志願者,網路的行為也像個志願者網路。探針來來去去——一個今天早上還可用的位置今晚可能就離線,覆蓋在一些國家稠密、在另一些國家稀薄到不存在,而且你不能因為你的使用者在那裡就要求某個具體 ISP 內部的一個探針。探針們也大多坐在資料中心和愛好者連線上,而不是你的真實使用者瀏覽時用的住宅和行動網路;一個資料中心探針證明服務從連線良好的地方可達,這涵蓋了問題的大部分,但不是問題的全部。把這張地圖當作世界網路的一個慷慨繪製的樣本——而不是世界本身。
本站對這個網路的使用是刻意克制的:它運行在 Globalping 的匿名、共享免費層上,所以檢查帶有每位訪客的限額,結果會被短暫快取,而不是猛敲一份志願者資源——如果一個檢查請你等一等,那是共享層正在被共享。在這些限制內,工作模式是:先在這裡跑多觀察點檢查來定清「掛了還是只有我」,然後對勝出的那一方深入——用網站健康檢查看一次對網站的詳細審視能告訴你的一切,並且在你改動了什麼之後,再從全球 ping 跑一輪新的。對所有人掛了和只對你掛了需要不同的下午;十分鐘別人的觀察點,就是你弄清自己正在過哪種下午的方法。
常見問題
我應該從多少個位置測試?
這個工具每次檢查最多執行四個位置,而選得好的四個勝過隨便選的四十個。挑與爭論相配的一組分布:一個靠近你自己使用者的探針、一個在另一個洲的、一個靠近目標託管地的,以及一個遠處的作為對照。如果近的和遠的探針一致,你就有了答案;如果只有近的失敗,你也同時定位了問題。更多位置主要在前四個以你尚讀不懂的模式不一致時才有幫助。
一個探針說離線——網站掛了嗎?
僅憑那個證據不能。單個探針自己也可能離線——崩掉了、斷線了,或在它自己的一個過濾器後面——而志願者探針沒有運營者在為它們擔保。「掛了」是一個你從一致中得出的結論:幾個獨立的探針,在不同的網路上,在同一時刻以同樣的方式失敗。一個探針失敗而它的鄰居成功,告訴你的是那個探針的路徑,誠實的報告是「從那一個觀察點不可達」,而不是「掛了」。
為什麼同一個網域名稱從不同探針解析出不同位址?
因為它本該那樣工作。GeoDNS 和 EDNS 用戶端子網讓 DNS 答案取決於查詢看似來自哪裡,於是每個地區被遞給它最近的健康邊緣的位址;anycast 和 CDN 在路由層依賴同樣的把戲。來自不同探針的不同位址,是在地化正在做它的工作。它只有在一個地區的位址死了、而其他位址能用時才成為一個發現——那時這個名字在忠實地把那個地區的使用者送往一個壞掉的邊緣。