簡體   English   中英

詢問jetty如何嵌入在maven中

[英]Ask about how jetty works embedded in maven

我一直在 maven 項目中使用碼頭。

它正在使用以下流程:

圖表

我覆蓋了碼頭的服務器QueueThreadPool的 QueueThreadPool:

QueuedThreadPool threadPool = new QueuedThreadPool(StaticConfig.JETTY_MAX_THREADS, 
StaticConfig.JETTY_MIN_THREADS, StaticConfig.JETTY_IDE_TIMEOUT, 
new BlockingArrayQueue<Runnable>(maxCapacity));

JETTY_MAX_THREADS=50JETTY_MIN_THREADS=5

但是我在啟動服務器時在監視器中創建了 5 個線程:

xxx_thread-14
xxx_thread-15
xxx_thread-16
xxx_thread-17-acceptor-0@3d01ec3d-ServerConnector@11758f2a{HTTP/1.1, (http/1.1)}{0.0.0.0:90}
xxx_thread-18

線程14、15、16、18是線程池中的線程(img圖)? 什么是連接隊列?

如何創建 mutils 接受者線程?

請幫助我處理對服務器的請求,其中包含在配置中創建的編號線程的第一張圖像中的圖表。

非常感謝。

這是一個過早優化的案例,不了解 Jetty,也不了解您自己的 web 應用程序實際上是如何工作的。

建議,不要過早配置QueuedThreadPool

保持默認,測試,再次測試,然后進行負載測試,然后再次進行負載測試,但方式不同。 始終收集有關默認QueuedThreadPool行為方式的信息。

然后,只有這樣,您才應該調整QueuedThreadPool以滿足您的需求。

但是永遠不要停止監視您的服務器和 web 應用程序,因為您將經常調整您的配置。 (尤其是如果您將QueuedThreadPool配置為小於默認值)

重要提示:如果您需要限制請求或連接的數量,或者控制請求或連接的數量或速率,嘗試在 ThreadPool 級別這樣做是行不通的。

該圖是錯誤的(或至少已過時 10 年)。

從 Jetty 7 開始,沒有連接隊列,也沒有接受器和請求線程的分離。

線程池(實際上只是一個java.util.concurrent.Executor )用於 Jetty 服務器上的所有線程需求。 這可能是接受連接、處理 nio 托管選擇器、處理單個 nio 選擇器、處理來自網絡的讀取事件、處理請求的初始分派、處理從 web 應用程序到網絡的寫入事件、處理來自Servlet 3.0、QoSFilter、DoSFilter、處理來自 Servlet 3.1 的異步 I/O、升級連接、websocket、HttpSession 管理、熱部署處理、字節碼掃描等。

最大線程數限制為 50:

  • 你永遠不需要另一個接受者。
  • 你會餓死客戶並導致大量問題。
  • 瀏覽器加載的典型 web 頁面將使用 8 到 12 個連接,這意味着在這個最大 50 個線程配置上將能夠同時處理 4 到 6 個客戶端。

需要另一個接受器的應用程序類型是處理大量新連接的應用程序(對於 Eclipse Jetty,當您超過每秒 30,000 個新連接的閾值時,您通常需要另一個接受器)。

Jetty 使用的接受器數量是在 ServerConnector 級別配置的,而不是在 ThreadPool 級別。

查看 ServerConnector 構造函數並選擇最適合您的環境的構造函數。

@Joakim Erdfelt,非常感謝您的回復!!

我的服務器位於圖表微服務中,而不是 web 服務器,連接數無法達到 30,000,可能是 Google ^.^。

我只想將 go 的任務序列從圖中的網絡服務器中取出,因為如果不是任務序列,我會收到來自合作伙伴服務器的響應 TIMEOUT。

響應時間大約為 10 秒,因此在最小線程中沒有線程忙。

我一直在使用:

<jetty.version>9.4.30.v20200611</jetty.version>

我認為上圖是碼頭的核心,因為我仍然發現它允許這樣做,但是我有配置我的服務器的解決方案高級圖:

boolean checkOOM = threadPool.getThreadPoolBudget().check(StaticConfig.JETTY_MAX_THREADS);
LOGGER.info("check maxThread allow with memory : "+checkOOM);
if(!checkOOM) {
   LOGGER.info("please increase merory server or decrease maxThread.");
   System.exit(1);
}
//depend info system
//get core processor of server
int coreProcessor = Runtime.getRuntime().availableProcessors();
LOGGER.info("coreProcessor : "+coreProcessor);

Server server = new Server(threadPool);
int port = 0;

try {
   port = Integer.parseInt(System.getProperty("server.port"));
} catch (NumberFormatException ex) {
  LOGGER.error("Property server.port not found. " + ex.getMessage(), ex);
  System.exit(1);
}
// if acceptor 0 then the selector threads are used to accept connections
// selector backup for acceptor
// only init with limit system
try (ServerConnector httpConnector = new ServerConnector(server, coreProcessor, coreProcessor)) {
    httpConnector.setAcceptQueueSize(StaticConfig.JETTY_MAX_QUEUED);
    LOGGER.info("acceptors : "+httpConnector.getAcceptors());
    LOGGER.info("queueSize : "+httpConnector.getAcceptQueueSize());
    httpConnector.setPort(port);
    server.setConnectors(new Connector[]{httpConnector});
} catch (Exception e) {
    LOGGER.error(e.getMessage(), e);
    System.exit(1);
}
server.start();
server.join(); << init thread pool.

上面帶有配置的代碼初始化允許在服務器運行中,我將為接受器備份 coreProcessor 編號接受器和 coreProcessor 編號選擇器。

我使用了與您的建議類似的 ServerConnector。

我嘗試使用默認的 QueueThreadPool(初始化構造函數服務器未在上面的代碼中輸入參數 threadPool),我將日志打印為 4 個線程初始化:

int cntThread = server.getThreadPool().getThreads();
LOGGER.info("idleThread server : "+cntThread);

我只是想知道圖中線程池的作用是否正常工作!

ps:你有最新的碼頭當前版本圖嗎?

非常感謝。

親愛的@Joakim Erdfelt,

我應用了上述配置,但服務器的 Memory 有問題(當前設置為 3GB),每次處理的總請求數約為 2500!

我不明白為什么 memory 一樣滿? 因為當線程關閉的時候HeapByteBuffer會reset free!!

而且我打開了 8 個接受器和 8 個選擇器,當 package 碼頭的 class 服務器時,我看到評論選擇器將在接受器滿時使用,但我監控線程我已經看到使用選擇器,接受器是免費的:(

請建議我,謝謝。

暫無
暫無

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

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