天天看點

第十八篇:穩定性之長尾延遲

什麼是長尾延遲

長尾延遲總是用百分數來表示,長尾延遲指的是與平均延遲時間相比延遲的更高百分位數(如第99等于P99),業界常用的P99标準, 也就是99%的請求延遲要滿足在一定耗時以内, 1%的請求會大于這個耗時,而這1%就可以認為是長尾延遲。如一個班級内99%同學的成績都非常優秀,但總會有幾位同學拖班級平均成績後腿兒,拉低班級的“平均分,這幾位同學就是“長尾延遲”。

長尾延遲影響

為什麼尾延遲比平均延遲更重要?Gil Tene 在東南電台的一個關于尾部延遲的播客中簡潔地說:這是“因為人類不會感覺到事件的平均結果或者平均影響;并不會因為平均水準比較高而忽略掉自己在該事件中痛苦和糟糕的經曆”。

能夠快速響應使用者操作(100毫秒以内)的系統對使用者來說比耗時更長的系統更自然更容易讓人接受。響應是問題的關鍵。對于使用者而言,系統響應速度的平均值較高是不夠的,不足以提供好的使用者體驗。亞馬遜開展的一項研究涉及到在賬戶測試中以100毫秒為增量延遲頁面,即使微小的延遲也會導緻收入大幅下降,代價高昂。同樣,谷歌運作的一項研究顯示,加載時間延遲半秒鐘導緻流量下降20%。

試想象一個場景,一個用戶端向一個單獨的網絡伺服器送出請求。百分之九十九的請求将在合理的時間内都會接受到對應的響應。然而,百分之一的請求的響應時間可能會很慢。如果您檢查延遲的分布情況,可以發現大多數請求收到響應的延遲是小的,但是在請求分布的末尾部分可能有一個大的響應延遲。這其實倒沒有什麼太大的影響。這僅僅意味着每隔一段時間就會有一個客戶收到稍微慢一點的回複。但是,假設您有數百萬個對多個伺服器的請求。現在,10K受到影響,而不是隻有一個客戶的響應速度較慢,這極大地改變了尾部延遲的影響。使用相同的元件并擴大相應的規模會導預料不到的結果。這是可擴充系統的基本特性: 高性能等于高公差。在大的規模情況下,不能忽視尾部延遲帶來的影響。

長尾産生原因

長尾請求産生的原因有很多,多種多樣且複雜的,其包括實作方式,系統資源情況,硬體因素等等,如:

●系統壓力太大,造成了任務隊列積壓

●服務自身排程,例如采用了簡單的鎖競争機制,導緻有的倒黴的線程一直得不到運作權

●資源競争(包括:檔案、鎖、硬體資源)

●機器負載較大,系統排程,排隊

解決方案

想要完全消除延遲是不切實際的,延遲可變性問題的根源在于大規模場景或共享環境中産生的,隻能通過手段提升或縮短長尾延遲,解決長尾延遲的方法有兩類:請求之内的短時調整和請求之間的長期調整。

請求之内的短期調整

  • 對沖請求(雙發機制):一種簡單的方法就是将一個請求發送給多個副本,然後使用最先傳回的回複。一種實作就是當等待目前請求時間超過95%的時間之後,向第二個副本發起對沖請求。為了減少對沖請求的損耗,其實可以降低處理對沖請求的優先級。
  • 捆綁請求:将請求再多個伺服器上排隊,并且伺服器之間能夠知道彼此的等待狀态。如果一個伺服器開始處理請求,需要告知其他伺服器取消排隊。伺服器需要等待一個消息延遲確定取消消息的到達。

除了以上兩種方法之外,還有種思路就是事先探測隊列,然後将請求交給低負載的伺服器。但是這個方法存在三個問題:

  • 檢測時和請求時的負載會改變;
  • 待處理請求的用時通常難以預測;
  • 如果用戶端都選擇低負載的伺服器,那麼這個伺服器會進入高負載狀态。

上面這些方法起作用的前提是:造成請求延遲的成因并不會影響其他請求。

  1. 分區不均勻,每台機器的性能既不是均勻的,也不是一成不變的
  2. 分區異常情況,假設一些異常分區會導緻負載不均衡。
  • 微分區:讓分區資料遠遠大于機器數量,然後通過動态配置設定分區到機器來實作負載均衡。
  • 選擇性副本:檢測那些導緻負載不均衡的項目,然後通過建立項目額外的副本來緩解負載不均衡問題。
  • 延遲感應察看:排程伺服器可以将一些特别慢的機器移除或者列入觀察,等延遲恢複之後再重新啟用。

繼續閱讀