免费xxxx大片国产片_精品在线一区_亚洲午夜福利av_亚洲色大成人一区二区_无码熟妇人妻AV在线影片免费

您的位置:首頁 >熱評 >

Swoole - webSocket消息服務(wù)系統(tǒng)壓力測試篇

2023-03-10 14:05:13 來源:騰訊云

概述

編程的內(nèi)核是數(shù)學(xué),而測試的本質(zhì)是計算,專業(yè)名詞叫容量預(yù)估,而測試的大體就是用程序模擬程序,檢測程序的正確性,有兩個點(diǎn)需要注意,QPS最佳值和系統(tǒng)接收最大值,根據(jù)測試數(shù)據(jù)的反饋,針對測試的現(xiàn)象和反映進(jìn)行優(yōu)化。

Jmeter 的基礎(chǔ)使用

在所有的開發(fā)準(zhǔn)備就緒的時候,開始準(zhǔn)備和上線有關(guān)的事情:測試和服務(wù)部署,測試要注意代碼的邏輯嚴(yán)謹(jǐn)、代碼運(yùn)行的正確,服務(wù)穩(wěn)定,所有的一切都需要用數(shù)據(jù)做指標(biāo),所有的計算機(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è)置測試的時間,這一點(diǎn)不是特別善解人意。不過還好我們有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,可看到以下新增的采樣器選項(xiàng),具體說明如下。

WebSocket Open Connection// 建立一個 WebSocket 連接WebSocket Ping/Pong     // 控制幀,發(fā)送 ping 并接收 pongWebSocket request-response Sampler //發(fā)送和接收文本或二進(jìn)制 WebSocket 幀WebSocket Single Write Sampler// 發(fā)送文本或二進(jìn)制 WebSocket 幀WebSocket Single Read Sampler// 接收文本或二進(jìn)制 WebSocket 幀WebSocket Close                // 關(guān)閉 Websocket 連接

step.03 添加結(jié)果樹 選擇 Add > Listener ,結(jié)果樹都在這個下面。

添加聚合報告,執(zhí)行測試,結(jié)果如下圖。

準(zhǔn)備測試數(shù)據(jù)

實(shí)踐01 - 準(zhǔn)備測試數(shù)據(jù)

1.隨機(jī)讀取用戶表里1000個用戶,進(jìn)行壓力測試

select user_id from user where user_status = 1ORDER 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

實(shí)踐02 - 代碼部分

請求接口的Demo,主要的思考點(diǎn)在于用戶訪問具有隨機(jī)性,模擬數(shù)據(jù)時盡量做到接近真實(shí)場景,代碼如下:

$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];//隨機(jī)執(zhí)行結(jié)果/**Array(    [uid] => 166511    [token] => f46540f11a40afeb9998cbe76661ec8234a87054)*/

Crontab的測試代碼Demo,先灌入測試數(shù)據(jù),考慮的是Crontab的實(shí)際吞吐能力,優(yōu)化計劃任務(wù)的執(zhí)行間隔,使用Curl和shell_exec實(shí)現(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í)行前加入時間毫秒的時間戳,可以打印代碼進(jìn)行耗時計算,代碼如下:

//返回當(dāng)前的毫秒時間戳function msectime() {    $stamptime = microtime();    $arr = explode(" ",$stamptime );    $msectime = sprintf("%.0f", (floatval($arr[0]) + floatval($arr[1])) * 1000);    return $msectime;}

總結(jié):

并發(fā)鏈接和并發(fā)查詢:并發(fā)鏈接只是多消耗一點(diǎn)內(nèi)存,并發(fā)查詢才是CPU的殺手。對系統(tǒng)的流量提前進(jìn)行容量評估,歸根結(jié)底為計算問題,不管多大的流量最后的解決辦法都采用分而治之的策略。手動的效率太低,用程序測試程序。減少不必要的日志寫入,以減少磁盤I/O的傳輸。緩存和Mysql是一種平衡,需要去計算。

第5點(diǎn)特殊說明有一點(diǎn)事特別需要強(qiáng)調(diào)的,不用被所謂的100w或者1000w流量的標(biāo)題嚇倒,比如1000w/h的訪問量,Qps就變成了27777/s,每個用戶請求的熱門接口30個,這才是測試的真相,關(guān)鍵地方使用內(nèi)存數(shù)據(jù)庫進(jìn)行加速,障礙就迎刃而解了:

10000000 / 60 / 60 / 30  = 925/s

關(guān)鍵詞: