不知道這樣比較有沒有意義,還是有什麼要注意的地方?
有點離題.. 不過我還是說說心得好了。你這份的結果跟我最近測的差不多,我有測純 container 的部份,但也有追加跑應用程式時的實測,大致上來說分幾層:
servlet container 現在都很快,不論是 tomcat/jetty/nio... 什麼的組合。如你的測試結果,每一種組合每秒都能達上千次的 request。但這先決條件是對象是個純 html 檔,或是一個沒邏輯的純 servlet。如果測試只跑到這個階段,那結果通常只受限於硬體和網路。
container 外,再加掛 http proxy 大概會讓效能掉 10~20% 左右 (我測 nginx),不過還是能維持在 千/秒 這個量級。我想只要參數沒調壞一般不用太擔心這層的 cost。
如果網頁開始有邏輯,即網頁是由動態 template 產生,這時第一點的 千/秒 這個量級,會降到 百/秒 這個量級。端看用的 component 有多複雜 (例如 jsp tag 或是 freemarker macro 之類的),越複雜的頁面效能越差。一般網頁東西都塞滿多的,所以都會降 10 倍左右。如果採用的網頁是用 jsp 寫的,那麼測 server 效能就要多測這一項。如果不是 jsp 那大概換什麼 server 結果都差不多。要小心有一些 template 效能很爛 (例如 thymeleaf,會掉到 十/秒 以下的量級)。
再下來是資料庫,測試中如果包含了資料庫存取,會發現效能會掉到 十/秒 這個量級了。而資料庫存取複雜的,掉到 個/秒 以下也很常見。
經過上面的實測,結論跟大家的經驗一樣,真正效能殺手是資料庫。如果資料庫解決了 (比方說加 cache),就是直接快 10 倍以上。而這時候,下一個調整的目標會落在 template 上,不過 template 很難提升的 (複雜的網頁就是這麼複雜...)。等到克服了這關,效能又上升了 10 倍。而這時才有機會進入最後一層,即 container 的 nio/bio 之類的選擇和調整。也就是你這篇測試關心的題目。
由於前兩層的瓶頸太高,我現在只在意它們的調整,而不會在意選什麼牌的 server,我建議選自己熟悉的就好。而 nio/bio/apr,也都用預設的就好,頂多 bio 的 connection 上限數調高一點就是。如果未來有幸,能遇到需要 千/秒 這個量級以上的服務,那時候我會跳過 servlet container,直接用 netty 去處理,去做最細部的最佳化,以求得最高的效能。
題外話,我現在都改用 wrk1 ,而不是 ab,wrk 這個 client 比 ab 更快,可以壓搾更多 server 效能出來。
剛剛換用wrk測試Java Servlet Container Performance Tesing(2)1
增加一個測試(後端有拖慢效能的Task時),結果又不一樣了....@@
我之前有做的 測試結果1 。跟你測的東西不一樣,但有點關聯。可以參考看看。
測試機和web 都是A2的機器,wrk 的測試方法真的很操系統 load average: 32.06, 16.47, 12.81
這是 server load 嗎? server load 超過 CPU core 數時,測試沒有意義喔 (超出硬體極限 )
tomcat 的記憶體是慢慢往上吃,jetty 是頻繁的GC,但是平均記憶體吃的比較少
?我看你的圖兩台在接受 request 時圖都差不多啊
tomcat 用完Thread 就全部還回去,但是Jetty 卻不會!?
兩個 container 都有各自的參數可調,Thread 終究會回到 min value。只是回收時間不一而已,
但是數據結果卻不一樣了tomcat-apr 的數據比jetty9-nio的數據好多了
無法解釋... 不曉得你測試前有無暖機?測了幾輪後才取得穩定值?
其實我就是參考(微調)你之前的測試~XD 只是AB合再一台,會拖慢速度的是C
恩恩看到這個Server load 的確太誇張了,我回去再修改一下測試數據~Orz..
我測試前都有暖機,只是用wrk 不知道應該測多久才準~ 另外想請問一下wrk connection 與thread 之間的關係? 是thread x connection 還是 connection/thread ? 要怎樣換算成concurrent user?