通過移除Nginx,Raygun公司怎樣將TPS提高了44%?

Raygun,追求極致性能已然成爲公司文化的一部分。在此前的博客文章中,我們介紹瞭如何通過將Raygun的API遷移到.NET Core 3.1,性能提高12%的方法。

在發佈此內容時,我們在Twitter上被問到一個問題,爲什麼我們會使用Nginx作爲Raygun API應用程序的代理。

我們的回答是,這是微軟推薦的方法。事實證明,自.NET Core 2.1發佈以來,情況並非如此。從我們第一次使用.NET Core 1.0到現在,Kestrel已經成熟很多,並且自.NET Core 2.1發行以來,微軟的安全專家們對Kestrel在前端服務的表現感到十分滿意。

爲什麼移除或使用Nginx?

在某些情況下,大家仍然會堅持使用Nginx這樣的代理,我會在下面給你列舉出來。對於Raygun,我們的API服務器僅託管了一個應用程序,然後僅通過負載均衡設備公開到互聯網。這意味着對端口共享的限制並不適用於我們,開放給外部的服務已經被最小化了。

我們可能要使用代理的一些原因(來自微軟的一篇博文),列舉如下:

  • 限制其託管應用程序的對外公開部分
  • 提供附加的配置和防禦層
  • 方便與現有基礎架構更好地集成
  • 簡化負載平衡和安全通信(HTTPS)配置。只有反向代理服務器需要X.509證書,並且該服務器可以使用HTTP與內部網絡上的應用服務器進行通信。

移除Nginx後的業務表現

對於我們的API節點,從配置中刪除Nginx可以使我們處理更多的請求而無需額外費用。

通過負載測試,我們還發現請求的平均響應時間和第99百分位響應時間得到顯著改善。這意味着我們的客戶對API服務的請求更快,並允許他們在單位時間內發送更多數據。

自從將新的服務器配置投入生產以來,我們的負載均衡設備報告5xx錯誤也大大減少了。現在,我們可以支撐處理更高的客戶端負載,而且用戶遇到的錯誤問題也更少了。

我們如何測試.NET Core性能

我們在亞馬遜的AWS c5.large實例Ubuntu 18.04環境下進行了測試。基準服務器運行了Nginx和Kestrel Web服務,Nginx作爲Kestrel Web服務代理;作爲對比,在另一臺服務器上,服務請求直接由Kestrel處理。

我們使用Apache JMeter將 Raygun Crash Reporting 樣本有效負載發佈到服務API。JMeter可以模擬非常高的併發請求負載。我們對此不斷進行調整,讓每臺服務器都最大程度地利用CPU,逼近服務過載即將不能支撐處理所有請求的極限(但是仍然保證請求的成功率爲100%)。

使用JMeter運行多次測試,每個測試持續10分鐘,每次測試結束時生成保存測試摘要報告。

最後,我們將多次測試的結果取平均值,最終得出下面的測試結果。

移除Nginx後的結果展示

響應時間(毫秒)

平均響應時間(該值越小性能越好)從1.2ms減少到0.8ms,相當於降低了33%;第99百分位響應時間從6ms減少到4ms,相當於降低了33%。

TPS

TPS(該值越大性能越好)從3783個增加到5461個,相當於提升了44%。

在生產環境運行新配置服務的觀察結果

內存使用情況

使用Nginx運行該服務實例時,每個實例使用的平均內存非常一致,內存使用率在13%和16%之間。

自從刪除Nginx以來,我們已經看到服務進程的內存使用率變大,在15%到30%之間,平均值趨近爲22%。我們確信這是由於Nginx限制了Kestrel處理的請求數量。

因此,Kestrel在高併發下始終會以一定的速率處理請求,這意味着內存使用量幾乎沒有很大變化。消除這一瓶頸後,由於Kestrel會處理數量不等的請求,我們現在可以看到更多的內存使用和變化情況。

Nginx + Kestrel

Kestral only

平均活躍節點數

活躍節點的平均數量從5.35下降到4.66。現在,我們可以看到相當長的時間內僅僅運行着四個服務器;而在同一時段的高峯時期,相比之前使用Nginx,我們同樣運行着更少的服務器。

Nginx + Kestrel

Kestral only

負載均衡設備的5xx錯誤率

一段時間以來,我們發現通過負載均衡設備統計的信息報告中,5xx錯誤率很高,如下圖所示。這些錯誤並不是來自我們應用程序,而且在Raygun也沒有對其認定爲故障並進行報告。

原來,這些錯誤來自Nginx,並且通過刪除此代理,我們現在可以更好地處理滿負載,而且大大減少了故障的發生。

總體而言,由於我們服務器處理的請求量很大,即使是以下較高的數量也僅佔我們處理的總請求量的很小一部分。 注意到通過刪除Nginx層可以得到顯著的性能提升,這一點是值得肯定的。我們並不是對Nginx進行批評和否定,當然也有可能是我們Nginx最終的配置問題,但是,簡化配置似乎可以更好地解決這個問題。

總結

敢質疑關於性能問題的原始假設非常棒,在Raygun,我們追根溯源,最終發現問題以及解決了問題。隨着我們基礎架構的不斷拓展,能夠以更低成本處理更多的數據,這給我們帶來了一些可觀的業務收益,而這一切都始於有人問了一個簡單的問題:“爲什麼?”

值得注意的是,.NET團隊一直在努力改善和優化性能。儘管.NET 5計劃於今年11月發佈,但目前已經有很多重要更新可以使用了。

原文鏈接:

How Raygun increased transactions per second by 44% by removing Nginx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章