digiRunner壓測大師之路 - 首部曲
前言
嗨嗨,大家今天好嗎?我們的深入淺出digiRunner系列文章在看過一輪後是否仍覺得好像少了點什麼, 沒錯!新的支線:digiRunner壓測大師之路上線啦!本系列將會聚焦在如何設定環境來進行壓力測試與效能檢視,相信大家一定等不及想知道我們要端出哪些好料的,在開始之前,也補充一下筆者為開發團隊中的QA,因此本系列文章會以非程式開發人員的角度來進行說明,希望將這些內容已最淺顯易懂的方來跟大家分享,那我們就準備開始囉!
首先,簡述我們的壓力測試方式:使用一個Nignix伺服器,將已註冊到digiRunner(以下簡稱dgR)中的api進行大量呼叫並且觀察dgR的負載表現,以下用五個操作步驟來跟大家介紹。
1.Nginx準備後端API
前情提要:不管是在本機、遠端VM或是雲端,我們需要一個後端服務,我們以Nginx做示範。
操作說明:
1-1.準備多個不同的json檔案,並將這些檔案放到Nignx服務裡面,並且設定Nginx可以用瀏覽器檢視這些json檔的內容。
1-2.接著在瀏覽器這個清單頁面上點選檔案檢視檔案內容。
1-3.成功看到內容,那後端API的部分就準備好啦!
2.digiRunner註冊後端API
前情提要:後端API URL準備好,深入淺出digiRunner系列已經有介紹API註冊流程,這邊我們就不贅述,或是點選連結參考。
操作說明:
2-1.確認已啟動要測試的API。
2-2.至用戶端維護申請x-api-key,呼叫API的指令會加上x-api-key進行驗證。
2-3.回到API List找一支API進行 x-api-key驗證的測試,回應200成功。
3.壓測環境呼叫API驗證
前情提要:壓測啟動之前,先確認已啟動的註冊API可以打得通。
操作說明:
3-1.進入terminal,使用curl 呼叫API進行驗證,成功取得回應。補充:依照不同環境的配置進到對應環境底下執行指令。
4.Docker ab(ApacheBench)指令說明
前情提要:本機terminal先安裝好docker。
操作說明:
我們先解釋一下壓測指令組成各個參數代表的意義。
nohup docker run --network host --rm httpd:alpine ab -n 64900030 -c 15 -H "X-API-KEY: YWJiYmU4N2EtYi00YjZlLhMjYz" http://34.111.179.40/api/productlist30_s > /result.txt 2>&1 &
4-1. nohup 、 &:讓壓測指令在背景執行,如果terminal被關掉不會受到影響。
4-2. ab:指令要進行 apachebenchmark 。
4-3. --network:容器內的服務使用的網路,使用host共用宿主機網路。
4-4. --rm:容器執行結束後自動刪除容器,避免佔用空間。
4-5. -n:總共要發送的請求數,數量越大執行的時間越久;-c的併發數量越大,代表這個總請求數可以被越快執行完但系統的負載也會跟著上升。
4-6. -c:同時併發多少個請求,數量越大壓力越大,所以壓測時會依照API數量跟情境去調整。
4-7. -H:自定義 HTTP request headers,這邊會帶上x-api-key的驗證資訊。
4-8. > /result.txt 2>&1 &: 將壓測結果標準輸出(stdout)與錯誤輸出(stderr)輸出檔案到執行壓測環境的特定路徑下,可以視需要加上。
照著上面的說明,如果我們想達到連續72小時不間斷一直呼叫,那麼-n 呼叫總數量我們就會把它設定的很大讓他至少可以執行72小時,筆者過往的經驗是先用一個小量的壓力執行一個小時看看大概執行多少呼叫量,再去延伸72小時的-n數量應該要設定多少。假設我一個小時的呼叫量大概是200000,那麼72小時的-n 就可以至少設定14400000。
而我有五隻API要進行壓測,但不想要開那麼多的terminal視窗,故使用背景執行讓這些指令跑,這五條指令也就會呈現如下:
nohup docker run --network host --rm httpd:alpine ab -n 14400000 -c 15 -H "X-API-KEY: YWJiYmU4N2EtYi00YjZlLhMjYz" http://34.111.179.40/api/productlist30_s > /api1result.txt 2>&1 &
nohup docker run --network host --rm httpd:alpine ab -n 14400000 -c 15 -H "X-API-KEY: YWJiYmU4N2EtYi00YjZlLhMjYz" http://34.111.179.40/api/productlist29_s > /api2result.txt 2>&1 &
nohup docker run --network host --rm httpd:alpine ab -n 14400000 -c 15 -H "X-API-KEY: YWJiYmU4N2EtYi00YjZlLhMjYz" http://34.111.179.40/api/productlist28_s > /api3result.txt 2>&1 &
nohup docker run --network host --rm httpd:alpine ab -n 14400000 -c 15 -H "X-API-KEY: YWJiYmU4N2EtYi00YjZlLhMjYz" http://34.111.179.40/api/productlist27_s > /api4result.txt 2>&1 &
nohup docker run --network host --rm httpd:alpine ab -n 14400000 -c 15 -H "X-API-KEY: YWJiYmU4N2EtYi00YjZlLhMjYz" http://34.111.179.40/api/productlist26_s > /api5result.txt 2>&1 &
再把這些指令複製起來貼到terminal中就可以執行囉,小提醒一下指令建議可以用純文字編輯器或是vscode打開編輯,使用像是雲端文件或是word可能會有隱藏字符導致指令失敗喔!
補充:若我的壓測時間到了但指令還在跑可以怎麼停止呢? 在terminal中下查詢指令ps aux | grep "ab -n"尋找執行中的PID,然後再使用kill -2 <PID>就可以暫停指令了。
5.測試指令
前情提要:壓測開始前,用一個小量-n與-c的數量確保指令的參數正確且可執行完畢。
操作說明:
5-1.因為是測試指令,所以我們不需要背景執行與輸出檔案,完成後檢視終端的測試結果。
指令參考:
docker run --network host --rm httpd:alpine ab -n 30 -c 1 -H "X-API-KEY: YWJiYmU4N2EtNzkwYi0" http://34.111.179.40/api/productlist30_s
5-2完成後我們可以看到終端中就會出現測試結果,如果是將結果輸出到檔案中的話就是把檔案打開檢視囉。
結語
看到這裡的你,對於上述說明是否已經躍躍欲試了呢?我們再快速複習一下幾個重點:1.準備Nginx後端API、2.dgR啟動註冊API與測試、3.壓測指令執行環境測試、4.小量壓力指令執行。一個簡易的壓測流程就這樣串起來啦。接下來,二部曲將會針對本機環境壓力測試的設定做延伸介紹,這樣即使我們沒有遠端VM或是雲端環境也一樣可以進行壓力測試,那我們就下一篇見囉!