Ubuntu

使用 ab 執行一些基準測試,tomcat 開始變慢

  • December 20, 2011

我正在使用 apache bench 為在 tomcat 上執行的 java 應用程序執行一些基準測試。

假設我執行如下測試:

ab -c 10 -n 10000 http://localhost:8080/hello/world

它會執行得很好。如果我遵循它:

ab -c 50 -n 50000 http://localhost:8080/hello/world

它會再次執行良好,但如果我再試一次,它可能會在完成 3500 個請求後開始減速。

在嘗試調試此問題的根本原因方面,我需要幫助。

我跑到了頂部,我有一些未使用的記憶體,所以記憶體似乎不是問題。

tomcat6 程序確實達到了 70-80 甚至 107%。

似乎重新啟動 tomcat 解決了這個問題,但有時需要重新啟動伺服器。

這是在一個預設的 tomcat 安裝上,它分配了 200 個執行緒。

Tomcat 日誌為空。

更新

所以我將 tcp_tw_recycle/reuse 都更改為 1,現在執行 netstat 顯示的計數非常低。

在更改 tcp_tw_recycle/reuse 之前,我注意到速度變慢並執行 netstat,我有 32400 個 tcp TIME_WAIT 連接。

所以現在執行基準測試的更新,使用 -k 開關,我看到了更多的吞吐量。但是,在某些時候,事情再次開始變慢,但現在重新啟動 tomcat 會使事情恢復正常。之前,即使我重啟了tomcat,執行ab的響應時間也會非常非常慢。 現在更改 tcp_tw_recycle/reuse 後,重新啟動 tomcat 會使事情恢復正常。執行 top 顯示 tomcat 僅佔 cpu 的 20% 左右,所以現在看來問題出在 tomcat 上,但我該如何弄清楚呢?

這裡可能會發生一些事情。您上面的命令轉換為 50 個並發連接,每個連接發出 1000 個請求。這裡要注意的一件事是,如果我沒記錯的話,apachebench 預設情況下不會啟用保持活動狀態。可能值得添加它(將 -k 傳遞給上面的命令)。無論如何,這將更像是一個真實世界的測試,因為大多數使用者代理都使用 keep-alive,就像 Tomcat 一樣,預設情況下。如果我的以下理論是正確的,這應該有助於解決問題。

1)我懷疑您用太多請求猛擊該執行緒池,因為每個請求都在拆除。這對那些執行緒以及系統上的 TCP/IP 堆棧來說是一個很大的打擊。這導致我…

2)您可能(好吧,您可能是)用完了臨時埠和/或命中 TIME_WAIT 套接字。如果每個請求確實是一個新的、唯一的請求,那麼您很可能會遇到 TIME_WAIT 情況,其中有數千個套接字處於該狀態(查看 netstat -an |grep -ic TIME_WAIT 以了解它們在你的負載)。除非您在系統上啟用了 time_wait_reuse,否則這些套接字將無法重複使用。您使用 localhost 的事實只會使情況變得更糟。

有關設置 time_wait 重用的更多資訊,請查看此處。另請注意,該執行緒正確指出在 time_wait 的上下文中設置 fin_wait 超時是不正確的,因此請避免這種情況。在 TIME_WAIT 的上下文中搔癢 fin_wait 是錯誤的,不會幫助你。

因此,請查看並可能專門調整 tcp_tw_recycle/reuse。這些將幫助您通過測試,以及保持活力。

引用自:https://serverfault.com/questions/342501