摘要: 幕後隨著套用OSS的用戶越來越多,很多人都想知道,OSS能提供的效能是什麼。這裡的效能主要指的是每秒能處理的要求次數(QPS),以及每次要求處理的時延(Latency)。 該如何對OSS進行效能測試,這是一個很廣泛的話題。
幕後
隨著套用OSS的用戶越來越多,很多人都想知道,OSS能提供的效能是什麼。
這裡的效能主要指的是每秒能處理的要求次數(QPS),以及每次要求處理的時延(Latency)。
該如何對OSS進行效能測試,這是一個很廣泛的話題。
從用戶的角度來看,OSS能提供的效能和要求的壓力類型(同步,非同步),要求Object的大小,要求的方式(讀,寫)都是有關聯的。
從OSS服務端的角度,對外提供的效能和自身的機器型號(磁碟,網卡,記憶體,CPU),機器數量,整個集群的網路,負載都有關聯。
使用範圍
本文講的是:
使用ab和wrk工具
- 在單機的環境下
- 向OSS的Endpoint發出要求
- 然後在用戶端統計要求的QPS,要求的Latency。
工具介紹
ab
ab,全稱是apachebenchmark,是apache官方推出的工具。
該工具是用來測試Apache伺服器的效能的。查看安裝的apache的伺服器能提供的服務能力,每秒可以處理多少次要求。
追蹤和安裝
http://httpd.apache.org/docs/2.4/install.html
http://httpd.apache.org/docs/2.4/programs/ab.html
在編譯apache伺服器的時候,會一起編譯出來。這裡就不贅述了。
使用方法
由於OSS的bucket有權限,而ab不支援OSS的簽章,需要將bucket變成public-read-write(公用讀寫)後進行測試。
假如類比是10個並行,要求100KB的Object
ab 執行時常用的設定項
-c 並行數
一次傳送的總要求數,預設是一次發一個要求。
-k 保留keep-alive
打開keep-alive,在一個HTTPSession中要求多次。預設是關閉的。
-n 要求數
整個benchmark測試程序中需要傳送的要求次數。
預設是一次,預設情況下得到的績效參數沒有代表性。
-t 最大時間
benchmark測試最長時間.預設沒有節流。
-u 上傳檔案
File containing data to PUT. Remember to also set -T.-T content-type
-T 設定上傳檔案的Content-Type
例如:application/x-www-form-urlencoded. Defaultis text/plain.
使用樣本
·測試OSS高並行的讀寫小檔案場景效能
·前置條件
建立了一個public-read-write的bucket,假如叫public。下載了ab測試載入器(開源),linux執行環境。oss提供可服務的endpoint,假如叫oss-cn-hangzhou-test.aliyuncs.com,準備5KB的檔案,假如叫5KB.txt
·測試程序
·預期結果
測試正常結束,Failedrequests 為0,Requestsper second即表示每秒中用戶端能追蹤的處理能力。這不代表OSS服務端的處理能力。
注意事項
- 觀察測試載入器ab所在機器,以及被測試的前端機的CPU,記憶體,網路等都不超過最高限度的75%。
- 測試中可能出現埠不足導致的測試失敗
需要調整核心參數以支援埠重用
例如:在Linux平臺下
1 sudo vim /etc/sysctl.conf
2 新增如下內容
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
kernel.printk = 7 4 1 7
3 執行sudosysctl –p生效
結果剖析
$./ab -c 50 -t 60 -n 300000 -k http://oss-cn-hangzhou-test.aliyuncs.com/public/5KB.txt
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking oss-cn-hangzhou-test.aliyuncs.com (be patient)
Completed 30000 requests
Completed 60000 requests
Completed 90000 requests
Completed 120000 requests
Completed 150000 requests
Completed 180000 requests
Completed 210000 requests
Completed 240000 requests
Finished 250137 requests
Server Software:AliyunOSS
Server Hostname:oss-cn-hangzhou-test.aliyuncs.com
Server Port:80
Document Path:/public/5KB.txt
Document Length:5120 bytes
Concurrency Level:50並行數
Time taken for tests:60.000 seconds測試回合的時間
Complete requests:250137在執行期間完成的總要求次數
Failed requests:0
Write errors:0
Keep-Alive requests:248492keep-alive的要求次數
Total transferred:1382504896 bytes
HTML transferred:1280703929 bytes
Requests per second:4168.94 [#/sec] (mean)每秒的要求次數
Time per request:11.993 [ms] (mean)平均每次要求的時延
Time per request:0.240 [ms] (mean, across all concurrent requests)
Transfer rate:22501.67 [Kbytes/sec] received
Connection Times (ms)要求已連結時間
minmean[+/-sd] medianmax
Connect:000.001
Processing:1127.61287
Waiting:1127.61287
Total:1127.61287
Percentage of the requests served within a certain time (ms)要求的半分比及時延
50%12
66%15
75%16
80%17
90%20
95%23
98%28
99%37
100%87 (longest request)
從測試結果,我們可以看到
- 在50個並行要求的情況下,要求60秒,平均每秒可以處理4168次(也就是說,用戶端在這種壓力下,看到的QPS為4168)
- 平均每次要求處理的Latency為12ms左右
- 由於開啟了keep-alive,串連幾乎不耗時間
- 99%的要求都在37ms內完成,最長的要求是87ms
wrk
wrk是一個用來做HTTPbenchmark測試的工具。可以產生顯著的壓力。
追蹤和安裝
https://github.com/wg/wrk
使用方法
wrk可以配合lua腳本來進行put動作
- 前置條件 > 建立了一個public-read-write的bucket,假如叫public。下載並安裝了wrk,linux執行環境。oss提供可服務的endpoint,假如叫oss-cn-hangzhou-test.aliyuncs.com,準備5KB的檔案,假如叫5KB.txt
上傳
這裡使用lua腳本來做上傳的動作,lua腳本put.lua的內容
counter = 0
request = function()
mypath = "5KB.txt";
local file = io.open(mypath, "r");
assert(file);
local body = file:read("*a");--讀取所有內容
file:close();
wrk.method = "PUT"
wrk.body = body
path = "/public/test-" .. mypath .. "-" .. counter
wrk.headers["X-Counter"] = counter
counter = counter + 1
return wrk.format(nil, path)
end
done = function(summary, latency, requests)
io.write("------------------------------
")
for _, p in pairs({ 50, 60, 90, 95, 99, 99.999 }) do
n = latency:percentile(p)
io.write(string.format("%g%%, %d ms
", p, n/1000.0))
end
end
執行指令:
$./wrk -c 50 -d 60 -t 5 -s put.lua http://oss-cn-hangzhou-test.aliyuncs.com
表示向Endpoint發起PUT要求,要求的內容在put.lua中規定,有5個執行緒,開啟的串連有50個,執行60秒
測試結果:
Running input
-c 50 -d 60 -t 5 -s put.lua http://oss-cn-hangzhou-test.aliyuncs.com
Running 1m test @ http://oss-cn-hangzhou-test.aliyuncs.com, test input http://oss-cn-hangzhou-test.aliyuncs.com
5 threads and 50 connections
Thread StatsAvgStdevMax+/- Stdev
Latency16.23ms9.49ms 159.48ms96.45%
Req/Sec635.3898.380.91k72.63%
189072 requests in 1.00m, 48.73MB read
Requests/sec:3151.10
Transfer/sec:831.58KB
------------------------------
50%, 14 ms
60%, 15 ms
90%, 20 ms
95%, 23 ms
99%, 64 ms
99.999%, 159 ms
結果剖析:
從測試結果,我們可以看到
- 在5個並行要求的情況下,開啟50個串連,要求60秒,平均每秒可以處理3151次(也就是說,用戶端在這種壓力下,看到的QPS為3151)
- 平均每次要求處理的Latency為16ms左右
- 99%的要求都在64ms內完成,最長的要求是159ms
下載
執行指令:
$./wrk -c 50 -d 60 -t 5 http://oss-cn-hangzhou-test.aliyuncs.com/public/5KB.txt
表示向Endpoint發起GET要求,有5個執行緒,開啟的串連有50個,執行60秒
注意這裡的5KB.txt是需要存在的。
測試結果:
Running input
-c 50 -d 60 -t 5 http://oss-cn-hangzhou-test.aliyuncs.com/public/5KB.txt
Running 1m test @ http://oss-cn-hangzhou-test.aliyuncs.com/public/5KB.txt, test input http://oss-cn-hangzhou-test.aliyuncs.com/public/5KB.txt
5 threads and 50 connections
Thread StatsAvgStdevMax+/- Stdev
Latency12.72ms5.14ms62.68ms80.14%
Req/Sec814.86145.651.36k69.43%
241990 requests in 1.00m, 1.25GB read
Requests/sec:4033.14
Transfer/sec:21.26MB
結果剖析:
從測試結果,我們可以看到
- 在5個並行要求的情況下,開啟50個串連,要求60秒,平均每秒可以處理4033次(也就是說,用戶端在這種壓力下,看到的QPS為4033)
- 平均每次要求處理的Latency為12ms左右
總結
以上就是用開源的benchmark工具來從用戶端的角度來衡量所能追蹤的QPS以及Latency。
但從用戶端看到的效能會受到各種因素的影響,例如要求的方式,原生資源(CPU,記憶體,網路),OSS的網路狀況,OSS的負載等都會影響用戶端看到的效能指標。
需要根據實際情況來查看效能瓶頸是來自於OSS還是來自於本機。
相關產品:
- 效能測試
- 物件隱藏OSS
- 雲效
- 雲端服務器ECS