28號在公司分享的內容,打算脫敏之後也放到本身的博客裏好了。linux
第一部分 爲何須要性能測試?git
用戶體驗:怎麼這麼慢?爲何打不開?卡?
———正是基於這些問題,才引出性能測試的概念。
性能測試須要考慮的是最大併發用戶數和響應時間:
併發用戶數大約理解爲一個用戶等於一個請求的話,每秒接收到的請求數。
如何評估最佳併發用戶數?
1. 開發給出
2. 最大併發用戶數 * 80%
那麼如何得到最大併發用戶數?
經過性能測試獲取,這個時候就須要性能測試工具來幫助咱們完成這些事情。github
響應時間
從用戶角度來講,軟件性能就是軟件對用戶操做的響應時間。對用戶來講,當用戶單擊一個按鈕,從用戶單擊開始到應用系統把本次操做的結果以用戶能察覺的方式展現出來,這個 過程所消耗的時間就是用戶對軟件性能的直觀印象。
制定一個測試計劃,說明每秒增長的用戶數並計算平均響應時間,若是平均響應時間出現明顯增長,甚至開始出現error,能夠理解爲,咱們碰到了最大併發用戶數。web
使用哪些工具來幫助咱們獲取呢?redis
第二部分 工具介紹編程
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