<progress id="jnld5"><th id="jnld5"></th></progress>

        <pre id="jnld5"></pre>

        <strike id="jnld5"><noframes id="jnld5"><pre id="jnld5"></pre>
        <strike id="jnld5"></strike>

        <strike id="jnld5"><span id="jnld5"><pre id="jnld5"></pre></span></strike>

        <font id="jnld5"><track id="jnld5"></track></font>

        記一次基于Docker的性能測試

        發表于:2019-08-16來源:juejin作者: 冰箱沒有油點擊數: 標簽:
        斷斷續續忙碌了幾個月,終于自己寫的開源項目算是有了雛形,打包成Docker image發布到AWS EC2后,寫代碼算是告一段落。隨之而來的問題就是“我的項目能夠支撐多少QPS” ,由于用了Do

        一句話結論

        對于跑在單核CPU上的運算類API, 根據業務需求(最大響應時間)來調試找到最大線程數,然后依據線程數調試出heap大?。ㄖ饕茨昀洗幕厥沾螖担?/p>

        若有理解不到位之處,請在評論區留言,跪謝!

        背景

        斷斷續續忙碌了幾個月,終于自己寫的開源項目算是有了雛形,打包成Docker image發布到AWS EC2后,寫代碼算是告一段落。隨之而來的問題就是“我的項目能夠支撐多少QPS” ,由于用了Docker, 即變成了“我的項目基于Docker的配置能夠支撐多少QPS”, 更進一步細化這個問題的話,有以下幾點:

        • 因為我用了IaaS來創建Linux服務器(選用了Ubuntu)基本配置為 1G RAM 1CPU (2.5GHz)10G+ 硬盤空間(非SSD) 
        • 當然我并不希望一個Docker container就把上述資源全部占用掉。另一個原因是目前IaaS所提供的內存最小單元是500M,算上系統其他進程的開銷,可供一個Docker image 的最大內存資源我定在了400M

        說句題外話,我認為按照服務商提供的最小單元來劃分的好處在于:減少開銷。500M的費用只有1G的一半,而且將來項目動態伸縮的靈活度高,粒度更小。

        • 項目是一個OAuth2的Spring boot實現,本身對于IO的要求不高、都是短鏈接。因為要生成JWT令牌,主要壓力在CPU。用了內置的Tomcat,多線程在一個CPU上跑,請求數目一多,99%使用率簡直是家常便飯

        第一步:確定性能測試的指標(benchmark)

        俗話說的好, 拋開業務需求來談IT就是耍流氓。

        項目是開源項目,業務需求那就只好我自己定了,一般來說我們并不希望用戶登錄過快(并且并發登錄的情況雖然有但是確實比較少見),這次的api (oauth/token) 我定在了2秒的最大值,以此為基礎來找出性能瓶頸。

        第二步:確定可調參數

        那么在不改動項目代碼的前提下,可以調整哪些參數來提升性能的呢?

        • JVM 相關參數,例如 GC、Heap、Thread stack
        • Tomcat 相關參數,例如 max-threads、max-connections、accept-count

        對于計算為主的項目,主要關注點還是在max-threads,設置合理的話可以減少CPU上下文切換帶來的性能開銷,以及合適的Heap大小來避免頻繁觸發GC所造成性能抖動。

        第三步:開測 (多圖預警)

        雖然標題是基于Docker的性能測試,但是我還是想對比一下用與不用Docker上的性能差異,所以測試會分為兩個部分, 以下為jre的基本信息

        ubuntu@ip-xxx-xx-xx-xxx:~$ java -version
        openjdk version "11.0.4" 2019-07-16
        OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3)
        OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode, sharing)復制代碼

        ubuntu jre 信息

        / # java -version
        openjdk version "11" 2018-09-25
        OpenJDK Runtime Environment 18.9 (build 11+28)
        OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)復制代碼

        docker jre 信息

        3.1 無Docker下的性能測試

        3.1.1 Heap 固定,不同線程數關系圖

        50m Heap大小在100個線程的情況下OOM,所以這里為0

        3.1.2 線程數固定,不同Heap大小下關系圖

        3.2 基于Docker的性能測試

        直接上對比圖

        上圖為不限制Docker 容器大小的結果

        上圖限制了Docker 容器大小為450M

        3.3 垃圾回收次數(1000QPS)

        上圖100 threads 50m Heap 的時候程序直接崩潰了所以為0

        第四步:分析

        4.1 Docker vs 非 docker

        很明顯,Docker會帶來一定的性能開銷,并且隨著線程數的增加與QPS的增加,這種開銷會更加明顯。但是并不是說Docker不好,畢竟性能開銷只要多開一個節點就搞定,和Docker帶來的便利性相比,幾乎可以無視。

        4.2 線程數 與 JVM heap

        這里的討論僅限于單核CPU負載較高的運算類API,Serial GC

        • 雖然線程數越多吞吐量越高,但是響應時間會更快的增長
        • Heap過小會導致頻繁的垃圾回收(年輕代影響較小,年老代最為突出)甚至會OOM導致程序崩潰
        • Heap過小時,線程數越大,年老代的回收次數顯著增多,年輕代反而會降低(年老代回收為主力)
        • Heap過大并不會帶來性能提升,但是年輕代回收次數會顯著減少,而年老代幾乎不受影響

        4.3 一句話結論

        對于跑在單核CPU上的運算類API, 根據業務需求(最大響應時間)來調試找到最大線程數,然后依據線程數調試出heap大?。ㄖ饕茨昀洗幕厥沾螖担?/p>

        4.4 回到我的開源項目

        很簡單,10 threads 100m heap

        原文轉自:https://juejin.im/post/5d4cd38cf265da03b120394c

        欧美日韩亚洲中文字幕|欧美变态另类z0z0禽交|久久国产精品-国产精|久久激情四射婷婷五月天

        <progress id="jnld5"><th id="jnld5"></th></progress>

              <pre id="jnld5"></pre>

              <strike id="jnld5"><noframes id="jnld5"><pre id="jnld5"></pre>
              <strike id="jnld5"></strike>

              <strike id="jnld5"><span id="jnld5"><pre id="jnld5"></pre></span></strike>

              <font id="jnld5"><track id="jnld5"></track></font>