This is why I can’t have conversations using Twitter

Salvatore Sanfilippo

這就是我無法在 Twitter 上好好對話的原因

昨天 Stripe 的工程師發表了一份詳細報告,說明他們在使用 Redis 時遇到的問題。這非常值得肯定。在 Hacker News 的討論串中,我解釋了由於我們現在已經有了 diskless replication(無磁碟複寫)(http://antirez.com/news/81),對於擁有主從複寫集的人來說,持久化已經不再是必要條件。這改變了設計上的限制:既然現在已經可以做到 diskless replicas synchronization,就更值得以更安全的方式,去更好地支援 Stripe(之前的?)那種關閉持久化的複寫集使用情境。這是一項仍在進行中的工作。

在同一篇文章中,Stripe 的工程師表示,他們打算在遇到 Redis 問題的使用情境中改用 PostgreSQL。PostgreSQL 的確是一套很棒的資料庫,很多時候,如果你能採用 SQL 資料模型與磁碟式資料庫,用它會比 Redis 更好;Redis 的設計初衷,是為了讓你真正需要每秒處理大量複雜操作並進行擴展的場景。Stripe 的工程師也提到,他們量測了 99th percentile(第 99 百分位數),結果 PostgreSQL 的表現比 Redis 更好,因此在一則推文中,@aphyr 寫道:

「請注意,同步的 Postgres replication 跨 AZ 比非同步的 Redis 帶來更低的第 99 百分位延遲」

我回覆道:

「或許可以看看平均延遲,以便更清楚了解實際狀況,因為我認為第 99 百分位數很容易受到 Redis 在 EC2 上執行時可能出現的 latency spikes(延遲突波) 影響。」

這句話的意思是,如果你同時掌握平均值,就能判斷第 99 百分位數是否被可以解決的延遲突波所拖累。通常情況就是這麼單純:如果平均值非常低,但第 99 百分位數卻很差,那很可能不是因為 Redis 本身跑得慢,例如執行了非常耗時或會阻塞的操作,而是有一小部分查詢回應緩慢,肇因於 EC2 上常見的問題:某些執行個體上的 fork time、遠端磁碟 I/O 等等。這些通常是可以處理的,舉例來說,就有不會出現 fork 延遲問題的執行個體類型。

然而,對半數的 Twitter IT 社群而言,我的說法卻被解讀成是在鼓吹應該用平均延遲來取代第 99 百分位數,作為正確的指標:

「平均值是衡量延遲最爛的指標。我從沒見過任何延遲呈現鐘形曲線。平均值根本是胡扯。」
「你顯然沒搞懂數學是怎麼運作的,也沒搞懂為什麼 tail latencies(尾端延遲) 在分散式系統中很重要。我想我們就談到這裡吧。」
「的確,問題在於平均值在有離群值的情況下並不穩健」

呃,誰說平均值是個好指標了?我提出它是為了偵測是否存在巨大的離群值。所以,在一場原本應該是正常交流的過程中,10 分鐘後我發現我的 Twitter 被一堆人洗版,他們都說我是笨蛋,竟然把平均值當成世界上衡量延遲的最新指標。一旦有了最初的轉推,就越來越多。甚至某個知名 NoSQL 資料庫的打造者也抽空透過 Twitter 來對我說教:我回覆說,我明明寫得很清楚,如果你同時有第 99 百分位數加上平均值,就能更完整地掌握曲線樣貌,並判斷問題是不是出在 Redis 在 EC2 上的突波,但神奇的是,原始推文被刪除了,於是我的推文現在變得更沒有脈絡。我的三則推文是:

  1. 「我的重點是,即使在網路雜訊中我不確定是否還有用,平均值有助於理解為什麼(⋯⋯)」
  2. 「第 99 百分位數很差。如果平均值非常好,但第 99 百分位數很差,你可以懷疑是有少數非常糟的樣本」
  3. 「這對 Redis 很有用,因為只要設定得當,有時可以大幅改善那些延遲很差的樣本。」

猜猜怎麼著?甚至有人單獨擷取了第 2 則推文,而那則推文本來是接續「以了解為什麼第 99 百分位數很差」(差是指,沒有提供好看的數據)這句話的,卻被斷章取義地解讀為:「第 99 百分位數很差」。

想當年,人們會在 Usenet 上爭論好幾天,但至少大多數時候,都是一個論點接著另一個論點,有足夠的文字與脈絡來維持正常的討論。這種情況卻只是仇恨與工程學入門規則的放大。第 99 百分位延遲才是正確的指標、平均值很爛?那就確保你就算在合理的情境下也絕口不提平均值,否則你就會收到一萬則爛回覆。

那該怎麼辦?現在好在我個人不太受這些影響,但也很清楚,因為我使用 Twitter 是為了工作,是為了讓大家知道 Redis 發生了什麼事,所以這並不是一個可行的工作環境。舉例來說,延遲:我非常在乎延遲,這些年來為了改善它做了許多努力(包括 diskless replication)。我們也有監控機制來了解是否以及為何會出現延遲突波,Redis 可以透過監控不同的執行路徑,為你提供一份人類可讀的報告,說明其內部發生了什麼。做了這麼多努力之後,你得到的卻是被轉推一百萬次的錯誤訊息,這一點幫助都沒有。大多數人不會去追蹤推文來自己形成看法,現實在這個時候已經被改寫了:我說平均百分位數很好,而且我沒意識到應該要看長尾。下次當我談到延遲時,對許多人而言,我就會是那個對此有些觀念不清的人,那還有誰知道我在說什麼、我在做什麼?

同時,Twitter 就像是給人看的 RSS,它對於讓許多人持續關注我熱愛的事情非常有用,也就是投入在我的開源專案上,到目前為止我都試著用心地開發它。所以我正在思考什麼樣的設定才是可行的。也許我可以多寫部落格,多使用 Redis 的郵件清單,而只把 Twitter 當作分享連結的地方,讓有興趣的人去閱讀,讓有興趣的人去爭辯、進行真正有用且有意義的討論。

關於 Redis,我還有很多事要做,不管是為了那些用得很愉快的使用者,還是為了那些遇到問題的使用者。我覺得我的時間最好還是花在寫程式上,而不是在 Twitter 上進行那些稱不上對話的對話。我喜歡爭辯,但這只是一場徒勞無功的練習。

原文由 Salvatore Sanfilippo 發布

本文章由 muse-spark-1.2-contributor 進行翻譯