Reversion | Date | Author | Description of change |
0.1 | 2022-01-14 | Vicent GAO (高羅) | 初始版本 |
1) QPM
1.1) 安裝、卸載升級QXDM
1.2) 類似與軟件商店,如APP Store
2) QPST
2.1) 添加或刪除USB DM口
2.2) QXDM需要通過USB DM口抓取log
3) QXDM
3.1) 選擇USB DM口,點(diǎn)擊Connect
3.2) 開始抓取log
安裝順序:
1. qpst.win.2.7_installer_00496.2.zip,解壓后默認(rèn)安裝即可
2. QPM.1.0.84.3.Windows-AnyCPU,此為“高通包管理器”
3. 在QPM里安裝QXDM
1) 第一次打開QPM時(shí),需要輸入高通Case系統(tǒng)賬號、密碼
2) 高通Case系統(tǒng)賬號、密碼登陸成功
3) 切換到“All”選項(xiàng)卡,找到QXDM項(xiàng),點(diǎn)擊Install安裝即可。
4) 如果沒有找到可用的高通Case系統(tǒng)賬號,就無法登錄QPM,無法安裝QXDM
1. 打開QXDM,連接USB DM口
2. 導(dǎo)入與測試固件版本匹配的QShrink4文件(僅在高通最新平臺上需要執(zhí)行此步驟,如:SDX24/SDX55等)
3. 選擇合適的DMC配置
4. 復(fù)現(xiàn)問題,并抓取log
5. 保存log,壓縮成zip文件(一定要壓縮!體積小8倍)
6. 把log和相關(guān)文件(如:QShrink4文件),發(fā)給SW
1. 點(diǎn)擊”Add New Port”
2. 添加“USB DM”口
3. 成功添加“USB DM口”的效果圖
1. 點(diǎn)擊“Connect to device”圖標(biāo)
2. 選擇需要的USB DM口(只有State為“Running”的USB DM口才是可用的),點(diǎn)擊”Connect按鈕”
1) 在固件包中的dbg目錄下有以.qsr4結(jié)尾的QShrink4文件
2) 每一個(gè)固件包中的QShrink4文件都不相同,是該固件包特有的
3) 只有導(dǎo)入與固件匹配的QShrink4文件,才可以通過QXDM抓到有用log、使用QXDM讀取“已抓到的log”( QShrink4文件就像一把鑰匙)
4) SDX24/SDX55/SA415M/SA515M等新平臺,才需要QShrink4文件;其他AG35等都不需要
5) 選擇菜單Options->Load QShrink4.0…
6) 選擇固件包/dbg目錄下的.qsr4文件,dbg目錄下有多于一個(gè)的.qsr4文件,逐一嘗試,當(dāng)觀察到能抓到“黃色”字體的log,說明已選擇了正確的.qsr4文件
7) 如果嘗試完所有的.qsr4文件還是不正確,QXDM先關(guān)掉再重新打開,再來一遍第2步,應(yīng)該就好了
1. 選擇菜單:File->Load Default Configuration
1. 選擇菜單:File->Load
2. 選擇工具包中的“耗流.dmc”
1) 按F5鍵,調(diào)出對話框”CFG File Generator”
2) 左邊的復(fù)選框全部勾上
3) 點(diǎn)擊OK完成
1. 標(biāo)準(zhǔn)方法:
1) 咨詢SW,需要使用哪個(gè)DMC
2) SW說使用Default DMC就可以,就使用Default DMC
3) SW說要提供一個(gè).dmc配置文件,就導(dǎo)入該.dmc配置文件
2. 簡單方法:
1) 設(shè)置ALL DMC,缺點(diǎn)是:如果抓log的時(shí)間很長,log可能會非常大
1. *.isf文件(QXDM log),先壓縮一下再發(fā)給SW,壓縮之后體積小8倍
2. 測試用的固件包/dbg目錄所有的*.qsr4文件
先安裝git
cd /usr/local/src
yum install git -y
下載wrk文件
git clone https://github.com/wg/wrk.git
cd wrk
make
編譯成功后,目錄下就會有一個(gè)wrk文件。
CPU:8核心16線程
內(nèi)存:16G
服務(wù)運(yùn)行平臺:windows10 64位
壓測服務(wù)運(yùn)行平臺:centos6.5
該接口表示獲取uploads文件夾更目錄下所有文件列表。我們用wrk壓測該接口看下性能指標(biāo)。
func listHandler(w http.ResponseWriter, r *http.Request) {
exists := isExists("./uploads")
if !exists {
os.MkdirAll("./uploads", os.ModePerm)
}
fileInfoArr, err := ioutil.ReadDir("./uploads")
if err != nil {
http.Error(w, err.Error(),
http.StatusInternalServerError)
return
}
listHtml := ""
for _, fileInfo := range fileInfoArr {
imgid := fileInfo.Name()
listHtml += "<li><a href=\"/viewPage?id=" + imgid + "\">" + imgid + "</a></li>"
}
pushHtmlString(w, "<a href='/upload'>相冊上傳</a>"+"<ol>"+listHtml+"</ol>")
}
壓測命令:
./wrk -t12 -c400 -d30s http://192.168.136.1:91/all
壓測結(jié)果:
[root@vm1 wrk]# ./wrk -t12 -c400 -d30s http://192.168.136.1:91/all
Running 30s test @ http://192.168.136.1:91/all
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 117.79ms 14.15ms 212.55ms 87.51%
Req/Sec 282.37 92.47 656.00 81.68%
100822 requests in 30.06s, 21.44MB read
Requests/sec: 3353.87
Transfer/sec: 730.38KB
這是一個(gè)普通的接口,向客戶端輸出html信息即可。
func upload(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
pushHtmlString(w, "<a href='/all'>相冊查看</a>"+"<form method=\"POST\" action=\"/upload\" "+
" enctype=\"multipart/form-data\">"+
"Choose an image to upload: <input name=\"image\" type=\"file\" />"+
"<input type=\"submit\" value=\"Upload\" />"+
"</form>")
return
}
}
壓測結(jié)果:
[root@vm1 wrk]# ./wrk -t12 -c400 -d30s http://192.168.136.1:91/upload
Running 30s test @ http://192.168.136.1:91/upload
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 23.58ms 15.25ms 308.32ms 93.15%
Req/Sec 1.51k 349.33 10.53k 80.72%
535748 requests in 30.10s, 164.52MB read
Requests/sec: 17797.87
Transfer/sec: 5.47MB
在當(dāng)前運(yùn)行環(huán)境下,golang編寫的一個(gè)常規(guī)web接口,QPS為17797.87。由于壓測服務(wù)器是vmware虛擬機(jī)里,有性能損耗。
按參考教程里測試結(jié)果顯示,多次測試的結(jié)果在 4 萬左右的 QPS 浮動,響應(yīng)時(shí)間最多也就是 40ms 左右,對于?個(gè) Web 程序來說,這已經(jīng)是很不錯(cuò)的成績了,我們只是照抄了別?的示例代碼,就完成了?個(gè)?性能的 hello world 服務(wù)器。
package main
import "fmt"
/**
golang接口性能測試
壓測工具 wrk。參考教程:
https://www.cnblogs.com/ycyzharry/p/8372168.html
性能指標(biāo):
TPS:Transactions Per Second 寫接口的性能指標(biāo),每秒可以完成的事務(wù)數(shù)量
QPS: Queries Per Second 查詢接口的性能指標(biāo),每秒可以完成的查詢數(shù)量 也叫吞吐量
QoS: Quality of Service 單個(gè)接口服務(wù)質(zhì)量
1.普通查詢接口QPS獲取
./wrk -t12 -c400 -d30s http://192.168.136.1:91/all
[root@vm1 wrk]# ./wrk -t12 -c400 -d30s http://192.168.136.1:91/all
Running 30s test @ http://192.168.136.1:91/all
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 117.79ms 14.15ms 212.55ms 87.51%
Req/Sec 282.37 92.47 656.00 81.68%
100822 requests in 30.06s, 21.44MB read
Requests/sec: 3353.87
Transfer/sec: 730.38KB
Requests/sec: x x就是 qps
2.數(shù)據(jù)庫寫接口TPS獲取 目前尚未提供該數(shù)據(jù)庫交互接口,應(yīng)該是post接口。需要配合post.lua腳本完成
./wrk --latency -t100 -c1500 -d120s --timeout=15s -s post.lua http://127.0.0.1:91/saveToDb
Requests/sec: x x就是 tps qps
wrk補(bǔ)充說明:
wrk可以配合lua腳本,完成各種接口測試,如帶文件上傳,post請求,form表單提交,隨機(jī)數(shù)等等。通過編程手段完成壓測。
*/
func main5() {
fmt.Println("注釋介紹golang接口性能測試")
}
任何一個(gè)接口都有自己的QPS吞吐量,可以最大程度的去提高這個(gè)值,但不會達(dá)到無限大,既然總有一個(gè)極限值,那就意味著,當(dāng)請求特別大總會突破這個(gè)QPS瓶頸,這時(shí)候會發(fā)生什么呢?常規(guī)默認(rèn)情況下,服務(wù)會降低速度或奔潰,所有訪問的用戶都會受到影響,訪問慢甚至服務(wù)不可達(dá)。
這時(shí)候就引入流量限制服務(wù)的概念,超出qps的請求進(jìn)行合理的處理,保障qps以內(nèi)的請求是可用的。
比如阿里的開源系統(tǒng):sentinel流量控制,就是做這個(gè)事情的。詳細(xì)介紹參考:
https://github.com/alibaba/Sentinel/wiki/介紹
golang有自己的第三方庫進(jìn)行流量控制, sentinel流量控制主要服務(wù)于java系統(tǒng)。