揭祕 Quora 的 Web 伺服器架構

10111000發表於2018-01-29

【導讀】:Quora 曾經在 2012 年 8 月使用了一種新的並行架構去渲染頁面。相比以前, 3-10 倍的速度來渲染頁面。如今,我們又對原來的架構設計做了一些改進,從而進一步提高了速度並節省了成本。Quora 工程師在本文和大家一起分享他們是如何改造的。

原來的並行架構:Webpara

原來的並行架構設計服從主從模式,它的設計和引數是在生產環境中經過一系列基準測試後選定的。該設計中的主結點和從結點在不同的層級裡:主結點機器我們稱之為 webpara,每個結點上跑有 6 個主程式;從結點機器我們稱之為 webworker,每個結點上有 6 個工作程式和一個用 C++ 語言編寫的 fastrouter 程式。主程式和工作程式中的應用邏輯跑在相同的 web 伺服器中,fastrouter 程式則是跑在一個用 C++ 定製的多執行緒佇列伺服器中,支援任意資料的快速入隊和出隊。這兩層都是使用了AWS的 c1.xlarge EC2 例項,它們有 8 核和 6MB 的共享 CPU 快取記憶體。
Webpara Architecture

一個來自負載均衡器的請求會被分配給某個 webpara 機器中的空閒主程式,這個程式會先完成一部分的頁面渲染工作,然後再把剩餘的工作作為子請求通過工作結點機器上的快速路由分發給對應的工作程式。每個工作程式可以完成子請求需要的所有響應,或者是準備一部分響應並進一步將工作分配給別的工作程式,甚至是不同機器上的工作程式。最終,由原始的主程式把工作程式返回的所有子響應合併,並對客戶的頁面請求發出響應。因為這種分治的思想,使得我們有能力在許多不同的工作機器上並行的工作,從而快速的進行頁面渲染。

不過,因為工作程式和主程式是在不同的機器上,所以所有的通訊都依賴於網路。每個子請求和子響應都需要作為有效載荷在我們的 EC2 環境裡跨機器進行傳輸。2012 年 12 月左右,我們開始面臨一些規模擴充套件問題,儘管我們使用了這種並行的架構設計,但對於Quora的訪問依然慢了下來。

我們的網路流量已經增長到足以挑戰這種設計的極限 — 即使增加主結點機器和從結點機器,也依然不能很好改變這種情況。而像 Memcached 和 Redis 這樣的外部服務呼叫也會隨著時間的推移變得越來越慢。隨後,我們意識到,我們的瓶頸在於網路 I/O 而不是 CPU。太多的網路呼叫導致了大量的上下文切換。

因此,我們不得不找到一種方法去減少網路容量和網路呼叫的數量,而所有的這些都不能影響到 CPU 的執行效率或是增加成本。為了達到這個目標,我們重新安排了架構的各個部分,通過幾次A / B測試收集了詳細的指標,並選擇了可能實現這些目標的最佳配置。由此產生的架構就是我們所說的 Ultralisk。[1]

新的並行架構:Ultralisk

這種新的 Ultralisk 架構是由同一種機器型別組成 — EC2 的 cc2.8xlarge 例項,這種型別的機器在硬體虛擬化這一方面會更有效率(與其他的 EC2 例項型別相比)。另外,這些機器有著很高的網路I/O容量。

這個架構仍然與之前的架構一樣採用主從模式。Ultralisk 架構主要的改進在於其中的每臺物理機器同時擁有主程式和工作程式。所有由主程式生成的子請求都將交給同一臺機器上的工作程式處理。因此,主程式和工作程式之間的通訊不再依賴於外部網路。因為我們這種型別的通訊是並行架構中的其他網路流量的 1.5 倍,所以這種變化使我們的外部網路流量減少了超過 60% 。主程式和工作程式之前的通訊可以很簡單的基於 TCP 連線或者 Unix 套接字實現。在我們的實驗中,這兩種實現方式的效能很接近,Unix套接字只是稍快一些。

Ultralisk_arch

每臺物理機器上主程式和工作程式的個數是整體效能的關鍵。如果工作程式太少,我們就不能很好的利用並行從而導致系統變慢;如果工作程式太多,會導致太多的上下文切換。同樣,在決定主程式的個數時,則需要在成本和速度之間進一步權衡。經過我們的實驗,我們發現一個優化的配置是在每臺物理機器上跑 6 個主程式,27 個工作程式和 1 個快速路由。CPU 的親和性設定可以使得每個工作程式和快速路由程式跑在固定的 CPU 核心上。兩個主程式共享一個核(因此 6 個主程式需要佔用 3 個核心),剩下的核留給系統的核心程式,包括處理所有的 I/O中斷,但並不僅限於此。[2]

這種架構減少了網路 I/O 數量和 I/O 資源的佔用,從而使得外部服務的呼叫變得更快。下圖給出了在 Memcached 呼叫時請求響應時間(毫秒)在 99% 分位處的改進。

effect_on_network_calls

總體來看,新的架構比之前的要快上 20-35%。下圖給出了兩種架構體系中請求響應時間在中位數與 90% 分位處的比率。

effect_on_overall

總而言之,Ultralisk 架構更快,更便宜,對網路資源的佔用更少,而且比我們之前的 Webpara 架構更有擴充套件性。另外,現在每臺機器都是相同的配置,完全與其他所有的機器獨立,而我們也精確的知道每臺機器每秒可以處理多少請求,所以我們可以以自動的方式來水平擴充套件我們的 Web 伺服器。此外,這種新架構將我們需要管理的機器數量減少為原來的四分之一,從而可以更輕鬆的管理和部署。

我們在二月份已經把這種新架構完全部署到了生產環境,儘管我們的網路流量呈指數級增長,但目前還沒有看到任何問題。一如既往,效能對我們至關重要,我們的速度和基礎架構團隊致力於讓Quora給你更好的體驗。

(作者 Nikhil Garg 是一名 Quora 工程師,並供職於速度團隊)

補註:

  • [1] Ultralisk 是蟲族最大和最強力的地面部隊之一。它們非常昂貴。它們的基因物質已經經過無數次的測試和實驗,而最後的可行版本只能用於蟲族的幼蟲。
  • [2] CPU 親和性的正確設定是效能收益的關鍵。從那以後,我們也開始在不同層次的機器上設定 CPU 親和性,而這樣也確實帶來了一定的收益。

相關文章