2016-12-25 24 views
2

我們的Web應用程序的吞吐量似乎是由連接速度慢的限制。在負載測試中,我們可以輕鬆達到約5000個請求/秒。但是在實踐中,我們最多可以達到約1000個請求/秒。服務器並不真正承受嚴重的負載,無論是IO還是CPU。這同樣適用於數據庫。主要的區別似乎是最工作者線程是由不能​​接受的響應速度不夠快的客戶放緩(通常反應是幾MB的大小)。如何處理許多連接速度較慢

我們幾乎沒有任何靜態資源。問題是關於動態生成的內容。它是用Spring框架實現的。但是我認爲任何其他基於servlet的實現都不會有所不同。

那麼我們有什麼選擇來提高吞吐量?是否有某種形式的緩存可以將快速吸收反應,釋放工作線程,然後異步它以自己的速度向客戶交付?

我們寧願不增加處理線程的數量,因爲它們保持數據庫連接在大多數處理中處於打開狀態。我們正在尋找一種解決方案,即少量工作線程可以全速工作。

+0

我發現你的問題的解決方案的描述[這裏](http://serverfault.com/a/406684)。 nginx的 「反向代理」 聲音[有爲](https://www.nginx.com/resources/admin-guide/reverse-proxy/)。如果它有效,讓我們知道你自己的問題的答案,那麼我可能有一天也需要它。 – vanOekel

+0

感謝您的提示。是的,啓用緩衝的nginx反向代理似乎是我們正在尋找的。我們需要一段時間才能對其進行配置並驗證它是否會增加我們在現實環境中的吞吐量。 – Codo

回答

0

我建議你使用標準技術,例如gzip作爲迴應。

第二個是在Spring MVC中使用異步處理。請參閱Making a Controller Method Asynchronous瞭解更多信息。

+0

我們已經在使用可壓縮數據壓縮。而我的異步控制器的理解是,他們解決不同的問題:他們幫助,如果與客戶端的HTTP連接處於空閒狀態,可能是因爲它是一個事件驅動的服務器推送或者是因爲服務器將請求轉發到另一個系統,並等待很長時間。在我們的案例中,客戶是瓶頸。你能描述一下它如何應用於這種情況嗎?它真的緩衝輸出,直到客戶吸收它? – Codo

+0

使用異步控制器得到實現與給定的線程池的大小和排隊機制AsyncTaskExecutor而控制器仍然會處理新的請求的能力。 但是,如果我理解正確的話,你應該回顧一下架構:1)聚集應用程序,2)替換輸出格式以減少網絡負載,3)分塊輸出,4)通過代理(如nginx)緩存等等。否則,不可能輸出比客戶真正能夠處理更多的數據。 –

+0

感謝您的想法。仔細一看,nginx作爲具有緩衝功能的反向代理看起來像一個有效的選項(正如vanOekel所提議的那樣)。集羣將需要增加數據庫連接的總數,並且考慮到服務器具有空閒的CPU和IO容量,這似乎是一種浪費。我們沒有選擇替換輸出格式。所有連接都使用分塊輸出。 – Codo