28號在公司分享的內容,打算脫敏以后也放到自己的博客里好了。
第一部分 為什么需要性能測試?
用戶體驗:怎么這么慢?為什么打不開?卡?
———正是基於這些問題,才引出性能測試的概念。
性能測試需要考慮的是最大並發用戶數和響應時間:
並發用戶數大約理解為一個用戶等於一個請求的話,每秒接收到的請求數。
如何評估最佳並發用戶數?
1. 開發給出
2. 最大並發用戶數 * 80%
那么如何獲得最大並發用戶數?
通過性能測試獲取,這個時候就需要性能測試工具來幫助我們完成這些事情。
響應時間
從用戶角度來說,軟件性能就是軟件對用戶操作的響應時間。對用戶來說,當用戶單擊一個按鈕,從用戶單擊開始到應用系統把本次操作的結果以用戶能察覺的方式展示出來,這個 過程所消耗的時間就是用戶對軟件性能的直觀印象。
制定一個測試計划,說明每秒增加的用戶數並計算平均響應時間,如果平均響應時間出現明顯增加,甚至開始出現error,可以理解為,我們碰到了最大並發用戶數。
使用哪些工具來幫助我們獲取呢?
第二部分 工具介紹
Jmeter
Apache JMeter是100%純JAVA桌面應用程序,被設計為用於C/S的軟件。
JMeter可以用於測試多種協議/應用程序/服務器(SMTP,FTP,HTTPS, etc)。
JMeter可用於模擬大量負載來測試一台服務器,網絡或者對象的健壯性或者分析不同負載下的整體性能。
JMeter 因其測試腳本的易維護性及可生成動態HTML格式的測試報告,支持多線程測試備受歡迎。
JMeter的文章多不勝數,讓我們跳到下個工具。
wrk
wrk是什么?
github地址是 https://github.com/wg/wrk
它是一個非常小巧高效的開源性能測試工具,支持使用lua腳本來創建復雜的測試場景。wrk 的一個很好的特性就是能用很少的線程壓出很大的並發量,原因是它使用了一些操作系 統特定的高性能 I/O 機制, 比如 select, epoll, kqueue 等。
其實wrk是復用了 redis 的 ae 異步事件驅動框架. 確切的說 ae 事件驅動框架並不是 redis 發明的, 它來至於 Tcl的解釋器 jim, 這個小巧高效的框架, 因為被 redis 采用而更多的被大家所熟知.
遺憾的是,wrk 只能運行在 Unix 類的系統上. 比如 linux, mac, solaris 等. 也只能在這些系統上編譯.
看一下wrk的文件包含什么內容?
將wrk的源碼clone到本地進行編譯(MacOS可以采用brew install wrk),以下是編譯完成后的結果:
當我們操作wrk的時候,是依賴最后一個文件來操作的。
看一下wrk的參數介紹。
執行wrk -h可以看到以下內容
wrk: invalid option -- h
Usage: wrk <options> <url>
Options:
-c, --connections <N> Connections to keep open
-d, --duration <T> Duration of test
-t, --threads <N> Number of threads to use
-s, --script <S> Load Lua script file
-H, --header <H> Add header to request
--latency Print latency statistics
--timeout <T> Socket/request timeout
-v, --version Print version details
一條完整的wrk執行命令包括以下幾個參數
wrk -c2 -t1 -d1m -T10s -s ../base-arch-testscripts/alarm.lua --latency "http://1.2.3.4:8282"
-c 表示使用多少個鏈接
對被測的服務器端來說,這代表了多少個用戶
-t 表示使用了多少個線程來發送請求
一般來說在核數的2-4倍為最佳
-d 表示測試時長 支持d(day) h(hour) m(minute) s(second)
-T 表示timeout,也就是等待服務器返回的時間,默認為1s
-s 表示腳本,需包含腳本的絕對路徑
—latency 表示需要進行響應時長計算,主要計算50%,75%,90%,99% 4個基線,用於描述服務端的響應時間
"http://1.2.3.4:8282" 這里就是被測服務端的地址了
也可以填寫域名。
使用—laterncy后得到的結果:
Thread Stats Avg Stdev Max +/- Stdev
Latency 807.86ms 134.63ms 1.97s 75.92%
Req/Sec 6.95 6.22 70.00 87.60%
Latency Distribution
50% 794.69ms
75% 885.46ms
90% 955.05ms
99% 1.15s
18208 requests in 1.00m, 6.26MB read
Socket errors: connect 0, read 0, write 0, timeout 1129
Requests/sec: 302.94
Transfer/sec: 106.74KB
如果返回中包含4xx,5xx的結果,也會統計出這些特殊response的個數。
說到wrk,就需要介紹一下lua,畢竟lua是wrk支持的腳本語言,那么我們開看一下lua.
Lua 是一種輕量小巧的腳本語言,用標准C語言編寫並以源代碼形式開放, 其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能。
輕量級: 它用標准C語言編寫並以源代碼形式開放,編譯后僅僅一百余K,可以很方便的嵌入別的程序里。
可擴展: Lua提供了非常易於使用的擴展接口和機制:由宿主語言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來就內置的功能一樣。
其它特性:
支持面向過程(procedure-oriented)編程和函數式編程(functional programming);
自動內存管理;只提供了一種通用類型的表(table),用它可以實現數組,哈希表,集合,對象;
語言內置模式匹配;閉包(closure);函數也可以看做一個值;提供多線程(協同進程,並非操作系統所支持的線程)支持;
注:LuaJIT 是wrk支持lua腳本的基礎,確保在編譯wrk之前,你的操作系統支持LuaJIT。
注:table是一個很重要的概念,在wrk中,我們使用table來拼接順序請求的request。
一個完整的wrk腳本怎么寫??
--初始化階段的唯一方法
function setup()
end
--運行時方法,包括init,request,delay,response
function init(args)
end
--發送請求
function request()
end
--是否延遲
function delay()
end
--返回處理
function response(status,header,body)
end
--運行后結果計算
function done(summary, latency, requests)
end