中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用ab工具對服務器進行API壓力測試

發布時間:2021-12-09 15:03:56 來源:億速云 閱讀:212 作者:柒染 欄目:開發技術

本篇文章為大家展示了如何使用ab工具對服務器進行API壓力測試,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

    1 系統吞吐量的簡單介紹

    一個系統的吞度量(承壓能力)與request對CPU的消耗、外部接口、IO等等緊密關聯。

    單個reqeust 對CPU消耗越高,外部系統接口、IO影響速度越慢,系統吞吐能力越低,反之越高。

    系統吞吐量幾個重要參數:TPS、并發數、響應時間

    • TPS:每秒鐘處理的事務數量

    • 并發量: 系統同時處理請求數(事務數)

    • 響應時間: 一般取平均響應時間

    TPS= 并發量/平均響應時間

    這里因為說的事務如果是單一接口請求,我們也可以認為TPS即為QPS。

    下面舉例說明:

    比如3000個用戶(并發量)同時訪問待測試接口,在用戶端統計,3000個用戶平均得到響應的時間為1188.538ms。所以TPS=3000/1.188538s= 2524.11 q/s。

    我們就可以這樣描述本次測試,在3000個并發量的情況下,TPS為2524.11,平均響應事件為1188.538ms

    Tps:在實際測試中表現為:

    一個系統吞吐量通常由TPS、并發數兩個因素決定,每套系統這兩個值都有一個相對極限值,在應用場景訪問壓力下,只要某一項達 到系統最高值,系統的吞吐量就上不去了,如果壓力繼續增大,系統的吞吐量反而會下降,原因是系統超負荷工作,上下文切換、內存等等其它消耗導致系統性能下降。

    實際表現為tps即先上升后下降,我們需要找到性能拐點。并得到限制瓶頸。

    2 測試方法

    參考文獻(詳細輸出說明):

    http://www.5655pk.com/article/231492.htm

    2.1 客戶端測試工具

    我們采用apacheBench 工具進行測試。

    ubuntu安裝ab:

    sudo apt-get install apache2-utils

    linux默認登錄端口只能打開1024個文件,因為在linux一切皆文件,所以ab并發數受到整個打開文件數的限制,需要使用ulimit -n 10000(打開文件數)進行修改后才能支持較大的并發。本人測試修改到15000。

    2.1.1 GET方法

    ab -n 100 -c 100 https://www.baidu.com/index.html

    -n:請求 總數

    -c:并發用戶數.

    -url:待測api。

    當測試發起請求數量較少,完成較快,無中間過程顯示。在請求數量很多時會分行顯示當前完成數量。

    2.1.2 POST方法
    ab -n 10 -c 1 -T 'application/x-www-form-urlencoded'  -H "Authorization:Bearer 2393d8db9b9d7f4b9d1570cc8776bca69b421b62"  -p ./post http://172.28.28.17:3017/oauth3/token
    • -H:可以設置響應header

    • -T: Post http header類型 默認為text/plain

    • -P:Post body內容, ab要求寫在文件中,-p后跟文件目錄,文件內容如name=hello&password=1234

    2.1.3 測試結果解讀

    來份ab的測試輸出:

    如何使用ab工具對服務器進行API壓力測試

    ab -n 10 -c 2 上圖結果為總請求10 并發為2的結果

    我們主要關注的輸出信息為:

    • Concurrency Level: 10 //并發級別,也就是并發數,請求中-c參數指定的數量

    • Time taken for tests: 1.093 seconds //本次測試總共花費的時間

    • Complete requests: 100 //本次測試總共發起的請求數量

    • Failed requests: 0 //失敗的請求數量。因網絡原因或服務器性能原因,發起的請求并不一定全部成功,通過該數值和Complete requests相除可以計算請求的失敗率,作為測試結果的重要參考。

    • Total transferred: 103314 bytes //總共傳輸的數據量,指的是ab從被測服務器接收到的總數據量,包括index.html的文本內容和請求頭信息。

    • Requests per second: 91.50 [#/sec] (mean) //平均(mean)每秒完成的請求數:QPS,這是一個平均值,等于Complete requests/Time taken for tests=100/1.093=91.50

    • Time per request: 109.287 [ms] (mean) //從用戶角度看,完成一個請求所需要的時間(因用戶數量不止一個,服務器完成10個請求,平均每個用戶才接收到一個完整的返回,所以該值是下一項數值的10倍。)

    • Time per request: 10.929 [ms] (mean, across all concurrent requests)// 服務器完成一個請求的時間。

    • Transfer rate: 92.32 [Kbytes/sec] received  //網絡傳輸速度。對于大文件的請求測試,這個值很容易成為系統瓶頸所在。要確定該值是不是瓶頸,需要了解客戶端和被測服務器之間的網絡情況,包括網絡帶寬和網卡速度等信息。

    其中我們最為關注的為Requests per second: 即tps。我們將它最為服務器性能最為重要的指標。

    2.2服務器端檢測方法

    可以通過 iftop命令和nethogs -d 對服務器網絡情況進行檢測。

    可以通過iptables命令監控服務器端口流量。

    可以通過 top | grep “node” 對內存和cpu進行判斷。

    對云上測試 可以使用云主機后臺,但后臺參數是分鐘級后的平均值。

    感覺好像這樣測優點蠢

    3 實際測試

    使用apacheBench 可以使用編寫shell腳本進行多次測試。可以將待測api 放入api數組并修改循環數量,實現一次測試多個api并生成關鍵參數xls文件。現在看來還是原來太天真才會有這種想法。

    3.1 shell腳本

    使用說明:a 是請求總數 ,b是并發用戶數一一對應,即a[0]對應b[0],傳入參數第一個是待測api服務器地址,第二個是api所需參數。api設置在api數組中。添加多個api 或同意api多組測試請修改循環計數。

    echo "you maybe use this sh like:"$0" serverIP userParam"
    a=(1000 2000 4000 6000 7000)#待測請求總數
    b=(50 100 200 300 400)#并發用戶數
    runTime=$(date +%Y%m%d%H%M%S)
    
    if [ -z "$1"]
    then
    	serverip="http://127.0.0.1"
    else
    	serverip=$1
    fi
    
    if [ -z "$2"]
    then
    	param="deviceid=XXX&bindingplatform=XXX&bindingid=XXX"
    else
    	param=$2
    fi
    
    filename=${runTime}"-test.log"
    touch filename
    
    #api=('XXX'${param} 'XXX'${param} '/users/account')
    api=('XXX'${param})
    echo "********webserver test info*************"
    echo "testTime :"$(date) 
    echo "LogName  :"${filename}
    echo "serverIP :"${serverip}
    echo "userparam:"${param}
    echo "********webserver test info*************" 
    #echo ${filename}
    
    for j in {0..0}#待測api個數 即api數組數
    do
    	echo "API test:"${serverip}${api[j]}
    	for i in {0..4}#待測api測試次數 5次也就是對應a b數組有個五個值
    	do
    		ab -r -k -n ${a[i]} -c ${b[i]} -C ${param} ${serverip}${api[j]} | grep -e"Document Path:" -e "Complete requests:" -e "Concurrency Level:" -e"Failed requests:" -e"Time taken for tests:" -e "Requests per second:" -e "Time per request" -e"Total transferred: " >> ${filename}
    	done
    done
    sed -i 's/^.\{24\}//g' ${filename}# 按照時間生成txt文件 并按上面的參數進行提取。
    export LD_LIBRARY_PATH=
    ./change ${filename} ${runTime}"report.xls"#chang 函數功能是將txt中關鍵數據變成xls文件。
    rm ${filename}

    3.2 C++提取程序:使用了libxl.h

    #include <iostream>
    #include <fstream>
    #include <string>
    #include "libxl.h"
    using namespace std;
    using namespace libxl;
    int main(int agrc, char *argc[])
    {
    
    	//cout << "helloworld" << endl;
    	fstream f;
    	ifstream ifile(argc[1]);
    	string temp;
    	int i = 0, j=1, k = 0;
    
    	Book* book = xlCreateBook();//創建一個二進制格式的XLS(Execl97-03)的實例,在使用前必須先調用這個函數創建操作excel的對象
    	//book->setKey(......);//如果購買了該庫,則設置相應的key,若沒有購買,則不用這行
    	if (book)//是否創建實例成功
    	{
    
    		Sheet* sheet = book->addSheet("Sheet1");//添加一個工作表
    		
    		for(i=0;i<30;i++)
    		{
    			for(j=0;j<10;j++){
    				sheet->setCol(i, j, 20);//設置列寬,格式等
    			}
    		}
    		i=0;
    		j=1;
    		
    		if (sheet)
    		{
    			sheet->writeStr(j, 0, "API");
    			sheet->writeStr(j, 1, "Concurrency Level");
    			sheet->writeStr(j, 2, "Time taken for tests");
    			sheet->writeStr(j, 3, "Complete requests");
    			sheet->writeStr(j, 4, "Failed requests");
    			sheet->writeStr(j, 5, "Total transferred");
    			sheet->writeStr(j, 6, "Requests per second");
    			sheet->writeStr(j, 7, "Time per reques(user)");
    			sheet->writeStr(j, 8, "Time per reques(server)");
    			j++;
    			while (getline(ifile, temp))
    			{
    				if (temp[0] == '/'){
    					f << temp << " ";
    					sheet->writeStr(j, i, temp.c_str());
    				}
    				else if (temp.find('[') != string::npos){
    	
    					f << temp.substr(0, temp.find('[') - 1) << " ";
    					sheet->writeStr(j, i, temp.substr(0, temp.find('[') - 1).c_str());
    				}
    				else if (temp.find('b') != string::npos){
    	
    					f << temp.substr(0, temp.find('b') - 1) << " ";
    					sheet->writeStr(j, i, temp.substr(0, temp.find('b') - 1).c_str());
    				}
    				else if (temp.find('s') != string::npos){
    					sheet->writeStr(j, i, temp.substr(0, temp.find('s') - 1).c_str());
    					f << temp.substr(0, temp.find('s') - 1) << " ";
    				}
    				else{
    					sheet->writeStr(j, i, temp.c_str());
    					f << temp << " ";
    				}
    				i++;
    				if (i == 9){
    					f << " " << endl;
    					i = 0;
    					j++;
    				}
    			}
    			ifile.close();
    		}
    		if (book->save(argc[2]))//保存到example.xls
    		{
    			//.....
    		}
    		else
    		{
    			std::cout << book->errorMessage() << std::endl;
    		}
    		book->release();}
    	return 0;
    }

    4 測試中遇到一些問題

    在用云主機時要注意一下云主機帶寬的問題,小水管很可能成為瓶頸。

    ab軟件中Total transferred 與端口流量有差距。端口流量大于Total transferred,猜測是有封包的因素。所以不能把Total transferred作為服務器消耗的流量來處理,用于計算云上某些按流量消耗的服務。

    上述內容就是如何使用ab工具對服務器進行API壓力測試,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    乐亭县| 涡阳县| 武山县| 普安县| 两当县| 阿图什市| 高雄市| 神木县| 榆林市| 奇台县| 上思县| 奉化市| 佛教| 济源市| 肃宁县| 舞阳县| 任丘市| 遂溪县| 陕西省| 安徽省| 修武县| 龙里县| 右玉县| 金山区| 丰城市| 广昌县| 萍乡市| 江阴市| 漠河县| 崇明县| 溧阳市| 女性| 碌曲县| 昭苏县| 若尔盖县| 博乐市| 伊川县| 上虞市| 三穗县| 周口市| 疏勒县|