RSF 異步訪問性能分析報告 - 百兆網卡下的彪悍性能

簡介

    一個輕量化的分佈式服務框架。典型的應用場景是,將同一個服務部署在多個Server上提供分佈式的 request、response 消息通知。RSF 的設計吸取了 HSF 的設計精華,而 HSF 是阿里內部使用最普遍的一款 RPC框架。久經考驗。固然這並不意味着 RSF 也一樣具有 HSF 的超高穩定性,可是不能否認的是 RSF 在分佈式 RPC 框架的設計中確實走了不少捷徑。git

    RSF的源碼地址:http://git.oschina.net/zycgit/rsf
    RSF 功能盤點:http://my.oschina.net/u/1166271/blog/38637服務器

服務器配置

    本文的目的是測試 RSF 在高併發下其性能表現如何。測試 RSF 的機器是「阿里雲,按量計費」中最高配置,由於財力有限阿里雲 16核機器只能意淫的想想。下面是配置詳情:網絡

Server節點爲:青島
數量:2(一臺客戶機、一臺Server)
網絡:100M帶寬(網絡流量走外網地址)
CPU:4核
內存:16G
價格:機器配置費 2.736元/時,公網流量0.72 元/GB併發

    整個測試耗時 2 個小時,測試成本 26元。先看一下Server這兩個小時的總體狀況:框架



    從上面統計信息能夠看出,4核CPU其實並未盡心盡力(這個稍後我會提到)。而網卡的入網和出網流量都基本上已經達到最大流量限制,換句話說:100M的網卡打滿了。後面的實際測試數據中也能夠看到網卡是最大的性能瓶頸。異步

RSF - Server 端說明

 

address 綁定到:121..42.193.51 這個外網IP上,意爲全部流量走公網IP。
port 端口號綁定到 8000 上。
server 所屬虛擬機房爲 local(該配置在測試中並未產生任何做用,虛擬機房策略是當有多server,多client下負責控制跨網絡調用的策略配置)分佈式

下面這個參數是Server的關鍵配置:
    <queue maxSize="1000000" minPoolSize="1" maxPoolSize="4" keepAliveTime="300">高併發

在解釋這個配置的時候先解釋一下 RSF Server端內部的一個保護機制。性能

    RSF在設計的時候留了不少可配置的參數,這些參數用來設定一個閥值用以保護應用程序穩定性。若是一個框架本身沒有任何保護措施就開始「裸奔」極可能框架在某一個業務壓力下把本身跑死而,開發者還在苦苦追尋緣由。queue其中就是一個保護機制。測試

    queue是用來管理 request 積壓的一個隊列。這個隊列能夠用來保證Server在高併發下不會自身產生OOM,同時合理的調整隊列容量也能夠調整服務策略服務模式。它的實現是由ThreadPoolExecutor、LinkedBlockingQueue 兩個類提供。

    在上面配置中,處理隊列的線程數最小爲 1個,最大爲4個。 取這個值的緣由是業務方法自己很簡單不會消耗過多的CPU週期,設定最大4已經戳戳有於,前面Server總體狀況上CPU的使用率也反映了這個事實。keepAliveTime是新線程產生時的等待時間。咱們不去過多關注它。

   <network workerThread="8" listenThread="1" /> 

    表示的是 Nett 方面將會採用 8條線程來處理網絡IO,1條線程處理鏈接請求。

RSF - Client 端說明

    接受測試的遠程Server地址列表爲:rsf://121.42.193.51:8000/unit  <-- unit 應該改成 local,但這裏可有可無。由於虛擬機房策略並未配置,因此只是保證有值就能夠了。

    <testConfig clientCount="2" threadCount="100"/>

    表示的意思是,客戶端將會啓動 2 個全新的RSF實例程序來模擬壓測,每一個客戶端下同時開啓 100 個無阻塞異步調用。無阻塞異步調用指的是:client 異步的發起調用請求,當調用完成時馬上發起下一個異步調用,中間不間斷。

    在這個配置下,client最大能夠產生 2 * 100 =2000 個併發 RSF 請求。

    connectTimeout="500" 這個參數是指,RSF 容許client 到 server 之間創建鏈接的最大期限。當超過這個期限。鏈接的遠端server地址將會被置爲失效。

    maximumRequest="100000" ,client 容許最大 10W 條併發 request。超過這個值 client 會進行自我保護,自動進行回絕 client 的調用請求,在目前這個配置裏是根本達不到這個量的。

生產環境實測數據

    如下測試數據是 Server 端配置保持不變,適當調整 client 端的 clientCount、threadCount 兩個配置值。

  請求量
(成功數/總數)
客戶端報告:RT
單位:毫秒
服務端報告:QPS
單位:秒
服務端:CPU
max:400%
服務端內存:RAM
使用率%
clientCount=2,threadCount=100 6450000/6450189
6455000/6455200
6460000/6460197
6465000/6465119
6470000/6470119
5
4
2
4
3
  3.4W+   188.1%   1.7%
clientCount=2,threadCount=1000 9745000/9746843
9750000/9751699
9755000/9756664
9760000/9761740
9765000/9766673
38
39
41
37
47
  4.6W+   198.5%   1.9%
clientCount=2,threadCount=4000 15955000/15968371
15960000/15973724
15965000/15978511
15970000/15981194
15975000/15987266
249
409
298
263
181
  4.6W+   239.3%   6.7%
clientCount=2,threadCount=10000 18655000/18674284
18660000/18679269
18665000/18684844
18670000/18689318
18675000/18694204
315
360
293
364
430
  4.7W+   203.5%   9.3%
clientCount=10,threadCount=100 11840000/11840417
11845000/11845387
11850000/11850584
11855000/11855311
11860000/11860398
32
6
14
5
21
  3.3W+   203.2%   1.7%
clientCount=10,threadCount=1000 14875000/14880505
14880000/14887261
14885000/14893780
14890000/14898746
14895000/14903842
24
126
242
151
139
  4.3W+   245.1%   4.5%
clientCount=10,threadCount=4000 8585000/8623539
8590000/8628938
8595000/8634636
8600000/8638767
8605000/8643556
753
767
721
776
785
  4.1W+   239.0%   9.4%
clientCount=10,threadCount=10000 9915000/10055117
9920000/10063842
9925000/10070482
9935000/10084538
9940000/10089888
1816
2025
2053
2227
2269
  4.1W+   233.7%   9.5%
clientCount=20,threadCount=100 10730000/10730905
10735000/10735550
10740000/10740714
10745000/10746152
10750000/10751195
7
11
21
24
46
  3.3W+   211.5%   1.1%
clientCount=20,threadCount=1000 5800000/5818674
5805000/5822908
5810000/5828438
5815000/5830541
5820000/5838423
409
379
342
337
374
  4W+   259.3%   8.8%
clientCount=20,threadCount=4000 1095000/1308640
1100000/1309727
1105000/1315539
1110000/1322031
1120000/1311961
1645
1590
1619
1900
1970
  3.3W+   206%   9.5%
clientCount=20,threadCount=10000 55000/141942
60000/159892
65000/173944
70000/187413
75000/202027
3975
4196
4450
4601
4859
  ERROR:timeout   70%   17.3%

意淫一下更高配置 ^_^

    在測試例子中,100M網卡已經跑滿,出網流量約 100Mbps,折算成字節約爲12.5MB,根據上面表顯示測試中網卡穩定在70%的工做狀態,吞吐數據約爲8MB。平均Server的 QPS在4W左右,咱們粗略估計一下RSF數據包大小爲:8MB / 4W = 209Byte。

    209Byte這個很接近Demo測試例子的網絡單向數據包的大小。由於測試環境有限,我沒法在千兆網卡上進行測試。按照千兆網卡傳入傳出 50MB速率來算。 RSF 單個節點能夠到 25W 的 QPS。

 

RSF博客:http://my.oschina.net/u/1166271/blog?catalog=574765

RSF源碼:https://gitee.com/zycgit/hasor/tree/master/hasor-rsf

Demo項目:https://gitee.com/zycgit/hasor/tree/master/example/example-rsf

若是你對 RSF 感興趣能夠加入:193943114 QQ羣,歡迎討論。更歡迎各類拍磚提意見。

相關文章
相關標籤/搜索