Swoole?webSocket消息服務(wù)系統(tǒng)壓力測試解析
概述
編程的內(nèi)核是數(shù)學(xué),而測試的本質(zhì)是計算,專業(yè)名詞叫容量預(yù)估,而測試的大體就是用程序模擬程序,檢測程序的正確性,有兩個點需要注意,QPS最佳值和系統(tǒng)接收最大值,根據(jù)測試數(shù)據(jù)的反饋,針對測試的現(xiàn)象和反映進行優(yōu)化。
Jmeter 的基礎(chǔ)使用
在所有的開發(fā)準備就緒的時候,開始準備和上線有關(guān)的事情:測試和服務(wù)部署,測試要注意代碼的邏輯嚴謹、代碼運行的正確,服務(wù)穩(wěn)定,所有的一切都需要用數(shù)據(jù)做指標,所有的計算機編程歸根結(jié)底都是數(shù)學(xué)。
step.01 Thread Group 線程組設(shè)置
jmeter自帶的thread group非常簡單。 一個thread 代表一個vuser,那么我們?nèi)绻枰嗌儆脩舨l(fā),設(shè)置多少線程數(shù)即可。ramp-up period, 本人理解是多少時間從0個 vuser 上升到您指定的vusers數(shù)。從這些參數(shù)可以看,非常簡單。但不能設(shè)置測試的時間,這一點不是特別善解人意。不過還好我們有jmeter plugins, 帶的thread group 添加了這個功能。
Number of Threads(users) //并發(fā)線程(用戶)數(shù) Loop Count //重復(fù)執(zhí)行次數(shù)
step.02 添加測試主體
右鍵單擊左側(cè)導(dǎo)航樹中的 Test Plan,選擇 Add > Threads(Users) > Thread Group ,右鍵單擊 Thread Group,選擇 Add > Sampler,可看到以下新增的采樣器選項,具體說明如下。
WebSocket Open Connection // 建立一個 WebSocket 連接 WebSocket Ping/Pong // 控制幀,發(fā)送 ping 并接收 pong WebSocket request-response Sampler // 發(fā)送和接收文本或二進制 WebSocket 幀 WebSocket Single Write Sampler // 發(fā)送文本或二進制 WebSocket 幀 WebSocket Single Read Sampler // 接收文本或二進制 WebSocket 幀 WebSocket Close // 關(guān)閉 Websocket 連接
step.03 添加結(jié)果樹 選擇 Add > Listener ,結(jié)果樹都在這個下面。
添加聚合報告,執(zhí)行測試,結(jié)果如下圖。
準備測試數(shù)據(jù)
實踐01 - 準備測試數(shù)據(jù)
1.隨機讀取用戶表里1000個用戶,進行壓力測試
select user_id from user where user_status = 1 ORDER BY RAND() limit 1000;
2.構(gòu)造測試需要的數(shù)據(jù)(10w條為例)
drop procedure idata; delimiter ;; create procedure idata() begin declare i int; set i=1; while(i<=100000 )do insert into t2 values(i, i, i); set i=i+1; end while; end;; delimiter ; call idata();
3.查詢最大鏈接數(shù)命令
show variables like '%max_connections%';
4.查詢鏈接線程的狀態(tài)命令
show processlist;
5.檢測服務(wù)器Mysql鏈接狀態(tài)的命令
netstat -ant|grep ESTABLISHED|grep 3306 | wc -l
實踐02 - 代碼部分
請求接口的Demo,主要的思考點在于用戶訪問具有隨機性,模擬數(shù)據(jù)時盡量做到接近真實場景,代碼如下:
$str = '62210,45783,36209,146502,24599,168338,166511,1917...'; $uidTestArr = explode(',',$str); foreach ($uidTestArr as $uid){ if(isset($uid) && intval($uid) > 0){ $json = file_get_contents('http://open.stark.com/login/gettoken?uid='. $uid); $json = json_decode($json,true); $temp[] = [ 'uid' => $uid , 'token' => $json['token'] ]; } } $index = rand(0,count($temp) - 1); $randData = $temp[$index]; //隨機執(zhí)行結(jié)果 /** Array ( [uid] => 166511 [token] => f46540f11a40afeb9998cbe76661ec8234a87054 ) */
Crontab的測試代碼Demo,先灌入測試數(shù)據(jù),考慮的是Crontab的實際吞吐能力,優(yōu)化計劃任務(wù)的執(zhí)行間隔,使用Curl和shell_exec實現(xiàn),執(zhí)行結(jié)果,返回數(shù)據(jù) {"code":200,"result":[],"msg":"OK"}
$str = "62210,45783,36209,146502,24599,168338,166511,1917,135799,8326..."; //去掉可能存在的換行和空格 $str = str_replace(array(PHP_EOL, ' ' ,'',$str)); $testUsers = explode(',',$str); for ($i=0;$i<10000;$i++){ $index = rand(0,99); $uid = $testUsers[$index]; $msg = '{\"rid\":225,\"uid\":'.$uid.',\"top_rid\":225,\"module\":\"novel_chapter\",\"module_name\":\"1022 last dance \u7b2c13\u7ae0\",\"module_id\":1019712,\"module_nid\":163961,\"comment_uid\":268,\"comment_nickname\":\"\u6d4b\u8bd5\u5c0f\u5b9d\u8d1d\",\"content\":\"\u4f60\u597d\u554a\",\"gift_id\":0,\"gift_name\":\"\",\"gift_number\":0}'; $url = 'http://msgdev.stark.com/api/comment/message'; $json = shell_exec( "curl -d 'uid={$uid}&msg={$msg}' {$url} " ); echo 'i:'.$i.',json:'.$json.PHP_EOL; }
在臨時執(zhí)行或停止計劃任務(wù),在執(zhí)行前加入時間毫秒的時間戳,可以打印代碼進行耗時計算,代碼如下:
//返回當前的毫秒時間戳 function msectime() { $stamptime = microtime(); $arr = explode(' ',$stamptime ); $msectime = sprintf('%.0f', (floatval($arr[0]) + floatval($arr[1])) * 1000); return $msectime; }
總結(jié):
- 并發(fā)鏈接和并發(fā)查詢:并發(fā)鏈接只是多消耗一點內(nèi)存,并發(fā)查詢才是CPU的殺手。
- 對系統(tǒng)的流量提前進行容量評估,歸根結(jié)底為計算問題,不管多大的流量最后的解決辦法都采用分而治之的策略。
- 手動的效率太低,用程序測試程序。
- 減少不必要的日志寫入,以減少磁盤I/O的傳輸。
- 緩存和Mysql是一種平衡,需要去計算。
第5點特殊說明有一點事特別需要強調(diào)的,不用被所謂的100w或者1000w流量的標題嚇倒,比如1000w/h的訪問量,Qps就變成了27777/s,每個用戶請求的熱門接口30個,這才是測試的真相,關(guān)鍵地方使用內(nèi)存數(shù)據(jù)庫進行加速,障礙就迎刃而解了:
10000000 / 60 / 60 / 30 = 925/s
以上就是Swoole webSocket消息服務(wù)系統(tǒng)壓力測試解析的詳細內(nèi)容,更多關(guān)于Swoole webSocket壓力測試的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHP將英文數(shù)字轉(zhuǎn)換為阿拉伯數(shù)字實例講解
在本篇文章里小編給大家分享了關(guān)于PHP將英文數(shù)字轉(zhuǎn)換為阿拉伯數(shù)字實例內(nèi)容,有興趣的朋友們可以參考學(xué)習(xí)下。2019-01-01phpfans留言版用到的數(shù)據(jù)操作類和分頁類
phpfans留言版用到的數(shù)據(jù)操作類和分頁類...2007-01-01thinkphp中字符截取函數(shù)msubstr()用法分析
這篇文章主要介紹了thinkphp中字符截取函數(shù)msubstr()用法,結(jié)合實例形式較為詳細的分析了thinkPHP中字符截取函數(shù)msubstr()的功能、定義使用技巧與注意事項,需要的朋友可以參考下2016-01-01thinkphp在php7環(huán)境下提示Cannot use ‘String’ as class name as it is
這篇文章主要介紹了thinkphp在php7環(huán)境下提示Cannot use ‘String’ as class name as it is reserved的解決方法,涉及thinkPHP針對php7關(guān)鍵字判定的相關(guān)底層代碼修改技巧,需要的朋友可以參考下2016-09-09ThinkPHP采用GET方式獲取中文參數(shù)查詢無結(jié)果的解決方法
這篇文章主要介紹了ThinkPHP采用GET方式獲取中文參數(shù)查詢無結(jié)果的解決方法,需要的朋友可以參考下2014-06-06gd庫圖片下載類實現(xiàn)下載網(wǎng)頁所有圖片的php代碼
在前期的php教程就講了php gd庫可以實現(xiàn)遠程圖片的下載,但是那只是下載了一張圖片,原理是一樣的,要想下載一個網(wǎng)頁的所有圖片只要使用正則表達式進行判斷,找出所有的圖片url就可以進行循環(huán)下載了,我特地參照網(wǎng)絡(luò)資源編寫了gd庫圖片下載類!2012-08-08ThinkPHP 在阿里云上的nginx.config配置實例詳解
這篇文章主要介紹了ThinkPHP 在阿里云上的nginx.config配置實例詳解,需要的朋友可以參考下2017-10-10