簡體   English   中英

配置Jetty以獲得高請求量

[英]Configuring Jetty for high request volume

在我們的應用程序中,我們需要處理超過每秒5,000個請求的請求量。 我們被告知,Jetty在我們的應用程序類型中是可行的(我們必須將JSON-HTTP API暴露給遠程系統,然后遠程系統將啟動入站請求和連接到我們)。

我們收到數千個入站HTTP連接,每個連接都是持久的,持續時間大約為30秒。 然后,遠程服務器會立即向我們發出請求,因為我們可以在每個連接上對它們做出響應。 30秒后,連接關閉,另一個打開。 我們必須在不到100毫秒(包括網絡傳輸時間)內做出響應。

我們的服務器在EC2中運行,內存為8GB,其中4GB分配給我們的Java VM(過去的研究表明你不應該將超過一半的可用內存分配給JVM)。

以下是我們目前如何根據我們在網上閱讀的各種提示初始化Jetty:

Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(config.listenPort);
connector.setThreadPool(new QueuedThreadPool(5120));
connector.setMaxIdleTime(600000);
connector.setRequestBufferSize(10000);
server.setConnectors(new Connector[] { connector });
server.setHandler(this);
server.start();

請注意,我們最初在我們的線程池中只有512個線程,我們嘗試增加到5120,但這沒有明顯的幫助。

我們發現,通過這種設置,我們很難處理每秒超過300個請求。 我們不認為問題是我們的處理程序,因為它只是做一些快速計算,以及Gson序列化/反序列化。

當我們在嘗試處理此負載時手動執行我們自己的HTTP請求時,我們發現它可能需要幾秒鍾才能開始響應。

我們使用的是Jetty版本7.0.0.pre5。

任何建議,無論是解決方案,還是隔離瓶頸的技術,都將受到贊賞。

首先,Jetty 7.0.0.pre5 非常老舊。 Jetty 9現已推出,並且有許多性能優化。

https://www.eclipse.org/jetty/previousversions.html下載更新版本的7.x系列

以下建議記錄在

一定要讀它們。

接下來,線程池大小用於處理接受的請求,512為高。 5120很荒謬。 選擇一個高於50且小於500的數字。

如果您有基於Linux的EC2節點,請確保在操作系統級別配置網絡以獲得最大利益。 (有關詳細信息,請參閱上述列表中標題為“高負載”的文檔)

確保使用的是最新的JRE / JDK,例如Oracle Java 1.6u38或1.7u10。 此外,如果您有64位操作系統,請使用64位JRE / JDK。

將接受器計數SelectChannelConnector.setAcceptors(int)設置為1和(number_of_cpu_cores - 1)之間的值。

最后,設置優化的垃圾收集,並打開GC Logging以查看您遇到的問題是使用jetty還是使用Java的GC。 如果您通過GC記錄看到有大量GC“停止世界”事件需要花費大量時間,那么您就會知道另一個導致性能問題的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM