這就是我無法在 Twitter 上好好對話的原因
原文由 Salvatore Sanfilippo 于 發布,訂閱此部落格
昨天 Stripe 的工程師寫了一份詳細的報告,說明他們在使用 Redis 時遇到的問題。這非常值得肯定。我在 Hacker News 的討論串中解釋過,因為現在有了無碟複製(diskless replication)(http://antirez.com/news/81),對於擁有一組主從複本的人來說,持久化已經不再是必要的了。這改變了設計上的限制:既然現在可以做到無碟的複本同步,就值得用更安全的方式,更好地支援 Stripe(前?)那種關閉持久化的複本集使用情境。這是一項仍在進行中的工作。
在同一篇文章中,Stripe 的工程師也提到,他們打算在遇到 Redis 問題的那個使用情境上改用 PostgreSQL,這確實是一套很棒的資料庫,而且很多時候如果你能採用 SQL 資料模型、搭配基於磁碟的資料庫,用它會比 Redis 更好 —— Redis 是為了當你真的需要每秒處理大量複雜操作、追求擴展性時而設計的。Stripe 的工程師還說,他們量測了第 99 百分位數的延遲,結果 PostgreSQL 比 Redis 來得更好,所以 @aphyr 在一則推文中寫道:
「請注意,同步式的 Postgres 複寫跨 AZ竟然比非同步的 Redis 還能提供更低的第 99 百分位數延遲」
而我回覆說:
「或許也可以看看平均延遲,會更清楚到底發生了什麼事,因為我認為第 99 百分位數很容易受到 Redis 在 EC2 上運行時可能出現的延遲突波所影響。」
我的意思是,如果你同時也有平均延遲,就能判斷第 99 百分位數是不是(或是不是)被延遲突波給拖累了,而這類突波很多時候是可以解決的。通常道理就這麼簡單:如果你平均延遲很低,但第 99 百分位數卻很差,那很可能不是因為 Redis 本身跑得慢,例如執行的操作很耗時或會造成阻塞,而是有一小部分請求因為 EC2 上常見的問題而變慢:像是某些執行個體上的 fork 耗時、遠端磁碟 I/O 等等。這些東西通常是有辦法處理的,舉例來說,就有不會出現 fork 延遲問題的執行個體類型。
但對半個 Twitter 上的 IT 社群來說,我那句話卻被解讀成是在鼓吹應該用平均延遲來取代第 99 百分位數,作為正確的指標:
「平均值是衡量延遲最爛的指標。我從沒見過任何延遲是呈鐘形曲線分佈的。用平均值根本是胡說八道。」
「你顯然沒搞懂背後的數學是怎麼運作的,也不明白為什麼尾端延遲在分散式系統中很重要。我想我們就談到這裡吧。」
「的確;問題在於平均值在有離群值存在的情況下不具強健性」
呃,誰說平均值是個好指標了?我提出它是為了偵測到底有沒有很大的離群值。所以在一場原本應該是正常交流的過程中,十分鐘後我發現我的 Twitter 完全被一堆人灌爆,他們都說我是個笨蛋,居然把平均值捧成全世界延遲的「新指標」。一旦有了第一波轉推,就會有越來越多。甚至某個知名的其他 NoSQL 資料庫的打造者也抽空在 Twitter 上對我說教了一番:我回覆說,我明明寫得很清楚,只要同時有第 99 百分位數加上平均值,你就能對整個分佈曲線有更完整的掌握,也能判斷問題是不是出在 Redis 在 EC2 上的突波,但神奇的是,原始推文被刪掉了,所以我的推文現在看起來更像是斷章取義。我那三則推文是:
- 「我的重點是,就算在網路的雜訊中我也不確定還有沒有用,就是平均值有助於理解為什麼(⋯⋯)」
- 「第 99 百分位數很差。如果平均值很好但第 99 百分位數很差,你就可以懷疑是有少數非常糟的樣本」
- 「這對 Redis 來說很有用,因為只要設定得當,有時你可以大幅改善那些延遲很糟的樣本。」
猜猜怎麼著?甚至還有人把第二則推文單獨截出來 —— 它原本是接續「去理解為什麼第 99 百分位數很差」(差是指,數字不好看)—— 然後斷章取義地只解讀成:「第 99 百分位數很差」。
想當年,大家會在 Usenet 上爭論好幾天,但至少大多數時候,都是一個論點接著一個論點,有足夠的文字和脈絡來維持正常的討論狀態。而現在這卻只是仇恨與工程學入門守則 101 的放大器。第 99 百分位數延遲是正確的指標、平均值很爛?那就確保你就算在談平均值有道理的情境下也絕口不提,不然你就會收到一萬則爛回覆。
那該怎麼辦呢?我個人有個優點,就是不太會被這些事影響到心情,但也很清楚,因為我把 Twitter 當成工作用途,用來讓大家知道 Redis 的近況,這已經不是一個可行的工作環境了。舉例來說,延遲:我非常在乎延遲,所以這些年來為了改善它做了很多努力(包括無碟複製)。我們也有監控機制來了解是否以及為何會出現延遲突波,Redis 透過監控不同的執行路徑,可以提供一份人類可讀的報告,讓你知道內部發生了什麼事。做了這麼多努力後,你得到的卻是被轉推一百萬次的錯誤訊息,這一點幫助也沒有。大多數人不會去追蹤完整的推文脈絡來自己判斷,現實在這個時候已經被改寫了:變成我說平均百分位數很好、我沒意識到應該要看長尾。下次我再談延遲時,對很多人來說,我就會變成那個對延遲一知半解的人,那還有誰知道我在說什麼、我在做什麼?
同時,Twitter 就像是給人看的 RSS,對於讓很多人跟上我熱愛的事情 —— 也就是用心開發我的開源專案 —— 非常有用。所以我在思考什麼樣的配置才是可行的。或許我可以多寫部落格,多使用 Redis 的郵件論壇,而 Twitter 就只用來貼連結,讓有興趣的人去閱讀,讓有興趣的人去爭辯、進行真正有用的討論。
關於 Redis,我還有很多事要做,為了那些用得很愉快的用戶,也為了那些正遇到問題的用戶。我覺得我的時間最好還是花在寫程式上,而不是在 Twitter 上進行那些稱不上對話的對話。我喜歡爭論,但這只是一場徒勞。
隨機一篇部落格
留言
登入後參與討論