Pushlet 性能測試計劃v1預覽
根據之前MQ的性能測試經驗,撰寫了Pushlet(高性能,分布式消息推送中間件)的測試計劃。這裏放出來,希望能給大家一些參考,同時也希望大家多提意見~
-
Summary
-
TestMethodology
2.1 Test Conditions
2.2 Test Scenario’s
2.3 Test Duration
2.4 Environment
2.5 Measurement
2.6 Topology
PerformanceResults
3.1 Connection
3.2 Non-Reliable P2P
3.3 Reliable P2P
3.4 Non-Reliable Pub-Sub
3.5 Reliable Pub-sub
References
-
Summary
Pushlet是一個基於socket.io協議的高性能,分布式消息推送服務Suite,為web,無線應用(Android,IOS)提供了一種簡單統一的Push機製。
針對Pushlet這種能夠承載C500k並發連接,並能實時可靠推送消息的特性,我們重點考察如下幾個應用指標:並發連接總數,連接穩定性,TPS(send/get),推送可靠性,推送實時性。同時考察的係統指標有:CPU,Mem,Network,minor/ full GC頻度與時間。
-
TestMethodology
- 1 TestConditions
-
Client-> socket -> connection
-
Pushlet連接分兩階段,所有結果均建立在連接完全建立後。
-
每種測試場景運行多次(3~5),達到統計平均效果
-
測試期間,獨占係統共享資源(CPU,MEM etc.)
-
可靠消息測試需要分standalone和cluster兩種場景
-
所有測試場景均要考慮warmup和cooldown
-
2 TestScenario’s
場景1:並發連接總數&連接穩定性
按照一定的rampup頻率(可設定),腳本控製施壓機發起連接請求(單網卡連接大致在64511),服務端觀測tcp連接狀態(重點關注SYN_RECV,ESTABLISHED,TIME_WAIT,CLOSE_WAIT狀態),同時觀察各個CPU(利用率是否均衡),JVM內存情況(新老生代回收頻率,回收時間)。找到係統穩定連接總數(必要時校準kernel,JVM參數)。
場景2:點對點消息推送
選取10個左右的點對點通道,消息體(50byte,150byte,255byte,1k,5k)持續運行30分鍾,測算推送TPS,推送成功率,推送時延。
場景3:點對點可靠消息推送
同上,選取10個左右的點對點通道,消息體(50byte,150byte,255byte,1k,5k)持續運行30分鍾,測算推送TPS,推送成功率,推送時延。這裏需要考慮測試離線消息推送,在線消息接受的場景。
場景4:廣播消息推送
選取10個左右的廣播通道(訂閱方個數分別為5,10,15),消息體(50byte,150byte,255byte,1k,5k)持續運行30分鍾,測算推送TPS,推送成功率,推送時延。
場景5:可靠廣播消息推送
暫不支持
2.3 TestDuration
所有的測試場景需要持續10分鍾以上,並伴有一定時長的warmup和cooldown。
2.4 Environment
-
Serversystem
RedHat Enterprise Linux Server release 5.7 (Tikanga)
2.6.18-308.4.2.ali1012.el5xen
4CPU Intel(R)Xeon(R)L5630@2.13GHz
x86_648G RAM 6T disk
-
Clientsystem
RedHat Enterprise Linux Server release 5.7 (Tikanga)
2.6.18-308.4.2.ali1012.el5xen
4CPU Intel(R)Xeon(R)L5630@2.13GHz
x86_648G RAM 6T disk
-
NetworkSettings
分兩種情況:辦公網絡,公網
網速1GBPS
-
Serverkernel(sudo vi /etc/sysctl.conf ... sudo /sbin/sysctl -p,另外也可以通過echo,cat形式驗證,如echo 1 >cat /proc/sys/net/ipv4/tcp_tw_reuse cat /proc/sys/net/ipv4/tcp_tw_reuse)
fs.file-max =1000000
ulimit -n 1000000
net.ipv4.tcp_max_syn_backlog=3240000
net.core.netdev_max_backlog=3240000
net.core.somaxconn= 3240000
net.ipv4.ip_local_port_range= 1024 65535
net.ipv4.tcp_wmem= 4096 65536 524288
net.core.wmem_max= 1048576
net.ipv4.tcp_rmem= 4096 87380 524288
net.core.rmem_max= 1048576
net.ipv4.tcp_max_tw_buckets= 6000
net.ipv4.tcp_tw_reuse= 1
net.ipv4.tcp_syncookies= 1
net.ipv4.tcp_max_orphans= 262144
這裏簡單說明一下TCP的連接隊列和半連接隊列。半連接隊列,收到syn包但是還沒有收到ack包,半連接隊列長度由min(min(somaxconn,listen的backlog參數),tcp_max_syn_backlog)決定,再取大於這個值的2的n次冪的值; 連接隊列,已完成3次握手,但是由於應用程序accept線程(boss線程)忙,尚未accept。隊列長度由min(somaxconn,應用socket的listen方法的backlog參數)決定。更詳細說明,請參看:
https://gist.github.com/vongosling/9929680
補充說明:
The current TCP/IP parameters can be edited without the need for reboot in the following locations:
/proc/sys/net/core/
rmem_default = Default Receive Window
rmem_max = Maximum Receive Window
wmem_default = Default Send Window
wmem_max = Maximum Send Window
/proc/sys/net/ipv4/
You’ll find timestamps, window scalling, selective acknowledgements, etc.Keep in mind the values in /proc will be reset upon reboot.You still need to add the code in /etc/rc.local or /etc/boot.local in order to have the changes
applied at boot time as described above.
-
Software
JavaHotSpot(TM) 64-Bit Server VM (20.0-b11, mixed mode) 1.6.0_25
JavaHotSpot(TM) 64-Bit Server VM (20.0-b11, mixed mode) 1.7.0_51
Jdk6 jvm options
Xmx6g –Xms6g-Xmn256m
-XX:PermSize=128m-XX:MaxPermSize=256m
-Xss256k
-XX:+DisableExplicitGC
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+UseCMSCompactAtFullCollection
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=85
-XX:+UseFastAccessorMethods
-XX:+CMSPermGenSweepingEnabled
-XX:+HeapDumpOnOutOfMemoryError
Jdk7 jvm params
Xmx6g –Xms6g-Xmn256m
-XX:PermSize=128m-XX:MaxPermSize=256m
-Xss256k
-XX:+DisableExplicitGC
-XX:+UseG1GC
-XX:MaxGCPauseMillis=500
-XX:InitiatingHeapOccupancyPercent
-XX:G1HeapRegionSize=32
2.5 Measurement
綜合使用iostat,jstack,jmap,mat,jps,top,jstat等工具,見後續博文
2.6 Topology
3. PerformanceResults
3.1 Connection
連接總數 |
CPU |
內存 |
GC情況 |
TCP狀態 |
C100K |
|
|
|
|
C300K |
|
|
|
|
C500K |
|
|
|
|
… |
|
|
|
|
3.2 Non-Reliable P2P
消息體 |
送達率 |
平均延時 |
|
50byte |
|
|
|
150byte |
|
|
|
255byte |
|
|
|
1kb |
|
|
|
5kb |
|
|
|
3.3 Reliable P2P
消息體 |
TPS(Put/Get) |
送達率 |
平均延時 |
50byte |
|
|
|
150byte |
|
|
|
255byte |
|
|
|
1kb |
|
|
|
5kb |
|
|
|
3.4 Non-Reliable Pub-Sub
消息體 |
TPS(Put/Get) |
送達率 |
平均延時 |
50byte |
|
|
|
150byte |
|
|
|
255byte |
|
|
|
1kb |
|
|
|
5kb |
|
|
|
3.5 Reliable Pub-sub
暫無
4.References
https://write.blog.csdn.net/postedit/7200738
https://docs.oracle.com/javase/7/docs/technotes/guides/vm/
https://blog.mgm-tp.com/2013/12/benchmarking-g1-and-other-java-7-garbage-collectors/
https://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
https://blog.mgm-tp.com/2014/04/controlling-gc-pauses-with-g1-collector/
CMSand G1 Collector in Java 7 Hotspot: Overview,Comparisons andPerformance Metrics
最後更新:2017-04-03 05:39:44