一個輕量化的分佈式服務框架。典型的應用場景是,將同一個服務部署在多個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的網卡打滿了。後面的實際測試數據中也能夠看到網卡是最大的性能瓶頸。異步
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條線程處理鏈接請求。
接受測試的遠程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羣,歡迎討論。更歡迎各類拍磚提意見。