如何使用 k6 框架執行負載測試
1. 簡介
隨著 Web 應用程式的擴展,它們必須有效地處理不斷增加的並髮使用者和請求。負載測試對於評估應用程式在不同流量條件下的效能、識別潛在瓶頸以及確保可靠性至關重要。
例如,限時搶購期間用戶量激增的電子商務平台。如果沒有適當的負載測試,效能瓶頸可能會導致回應時間變慢甚至停機,從而影響使用者體驗和收入。
k6框架是一個強大的開源負載測試工具,它將簡單性與複雜的效能分析結合在一起。旨在使開發人員能夠創建全面的效能測試場景,將 JavaScript 腳本與高效的執行能力相結合。
在本教程中,我們將探討設定 k6、進行負載測試、分析效能指標以及遵循最佳實務以確保最佳系統效能的完整流程。
2. 設定 K6 進行負載測試
要開始使用 k6 進行負載測試,我們需要安裝工具並設定測試腳本。
2.1.安裝
開始使用 k6 非常簡單。我們可以使用系統的套件管理器來安裝它。
例如,在 macOS 上,我們可以執行以下命令:
$ brew install k6
安裝完成後,我們透過檢查版本來驗證:
$ k6 version
輸出確認安裝:
k6 v0.56.0 (go1.23.4, darwin/arm64)
2.2.測試腳本
讓我們開發一個名為test.js
基本負載測試腳本來示範 k6 的核心功能:
import http from 'k6/http';
import { sleep, check } from 'k6';
// test configuration
export const options = {
vus: 10, // simulate concurrent virtual users
duration: '30s',
thresholds: {
http_req_duration: ['p(95)<500'], // 95% of requests must complete under 500ms
http_req_failed: ['rate<0.01'] // less than 1% request failure rate
}
};
// test scenario
export default function() {
// simulate request
const response = http.get('https://test-api.k6.io');
// validate response
check(response, {
'status is 200': (r) => r.status === 200,
'response time is acceptable': (r) => r.timings.duration < 500
});
// simulate user activity
sleep(1);
}
在這個腳本中,k6 定義了10
虛擬使用者和30
秒持續時間的測試配置。它確保95%的請求在500
毫秒內完成,失敗率低於1%。
然後,腳本定義測試場景,其中 GET 請求傳送到 API 端點,確認回應狀態為200
並驗證回應時間保持在500
毫秒以下。
此外,為了維持系統穩定且實際的負載,每個虛擬使用者在請求之間會暫停1
秒鐘。
我們來執行測試腳本:
k6 run test.js
一旦運行,腳本就會捕獲關鍵效能指標、驗證回應條件並提供負載測試的綜合報告。該報告包括回應時間、請求率和任何潛在故障。
3.執行負載測試
透過成功設定 k6 並執行我們的第一個基本負載測試,我們為全面的效能評估奠定了基礎。
有了初始配置,我們現在可以探索模擬真實世界應用程式使用情況的更複雜的測試場景。
3.1.進階測試場景
k6 允許透過options
物件靈活配置測試場景,從而輕鬆模擬真實世界的流量模式。例如,我們可以定義上升和下降階段來模擬使用者行為:
export const options = {
stages: [
{ duration: '1m', target: 20 }, // ramp up to 20 users in 1 minute
{ duration: '3m', target: 20 }, // hold steady for 3 minutes
{ duration: '1m', target: 0 }, // ramp down to 0 users in 1 minute
],
};
此設定逐漸增加負載,在特定時間內保持穩定,然後平穩減少負載,這有助於在實際使用條件下測試應用程式的效能。
3.2.測試多個端點
我們可以在單一腳本中評估多個 API 路由的效能,確保全面的測試覆蓋。以下是一個例子:
export default function() {
// simulate diverse user interactions
const responses = http.batch([
['GET', 'https://test-api.k6.io/public/crocodiles/'],
['POST', 'https://test-api.k6.io/auth/basic/login/', JSON.stringify({username:'test',password:'1234'})]
]);
// validate multiple endpoint responses
check(responses[0], { 'Crocodiles loaded': (r) => r.status === 200 });
check(responses[1], { 'Login done': (r) => r.status === 200 });
}
該腳本透過同時執行一批 HTTP 請求(獲取crocodiles
和login
)並執行同步回應驗證來演示多端點負載測試,以確保每個端點都返回成功的 HTTP 200
狀態代碼。
3.3.內建指標
k6 自動提供一系列有洞察力的指標,例如:
-
http_req_duration
:請求總時長,包括 DNS 查找、連線和回應時間 -
http_reqs
:發出的 HTTP 請求總數 -
http_req_failed
:失敗請求的百分比 -
vus
:目前虛擬使用者數 -
iterations
:執行的腳本迭代總數
這些指標提供了進階和細緻的見解,為我們的績效分析奠定了基礎。
3.4.自訂指標
自訂指標是 k6 中的一個強大功能,使我們能夠監控應用程式效能的特定方面。例如,我們可以使用自訂計數器追蹤失敗的登入嘗試:
import { Counter } from 'k6/metrics';
let loginFailures = new Counter('login_failures');
export default function () {
let res = http.post('https://test-api.k6.io/auth/basic/login/', {
username: 'test',
password: 'wrong_password'
});
if (res.status !== 200) {
loginFailures.add(1); // Increment the counter for failed logins
}
}
因此,k6 的可自訂場景、多端點測試和詳細指標追蹤等功能為我們提供了評估應用程式效能的工具。
4. 負載測試結果
分析負載測試結果對於了解應用程式效能、識別瓶頸和確保可靠性至關重要。
4.1.匯出結果
k6 允許我們以各種格式匯出測試結果以進行進一步分析。例如,我們可以將輸出儲存為 JSON 格式:
$ k6 run --out json=results.json test.js
這使我們能夠將 k6 數據與 Grafana 等視覺化工具整合或共享詳細的測試報告。
k6 終端輸出的範例可能如下所示:
execution: local
script: test.js
output: json (results.json)
scenarios: (100.00%) 1 scenario, 10 max VUs, 1m0s max duration (incl. graceful stop):
* default: 10 looping VUs for 30s (gracefulStop: 30s)
✓ status is 200
✓ response time is acceptable
✓ http_req_duration..............: avg=109.59ms min=104.52ms med=108.86ms max=190.22ms p(90)=113.03ms p(95)=114.66ms
✓ http_req_failed................: 0.00% 0 out of 270
vus............................: 10 min=10 max=10
vus_max........................: 10 min=10 max=10
running (0m30.3s), 00/10 VUs, 270 complete and 0 interrupted iterations
default ✓ [======================================] 10 VUs 30s
這些指標提供了系統效能的清晰概述,突顯了可能需要最佳化的領域。透過結合內建指標、詳細分析和匯出的報告,我們可以確保對應用程式在負載下的行為進行全面評估。
4.2.結果分析
在分析負載測試結果時,我們首先關注**反應時間分析**,其中包括:
- 監控 p95 和 p99 百分位數,以衡量系統對 95% 和 99% 請求的表現
- 追蹤最大回應時間以識別可能影響使用者體驗的潛在異常值
- 尋找效能下降的模式,例如在持續負載下增加響應時間
接下來,讓我們考慮錯誤率分析,其中我們:
- 專注於失敗請求的百分比來評估整體可靠性
- 分析錯誤的類型和模式,例如逾時、4xx 或 5xx 回應
- 觀察系統在負載下的表現,特別是當它接近性能極限時
最後,讓我們檢查一下資源利用率,其中包括:
- 監控 CPU 使用模式以偵測過度利用或瓶頸
- 關注記憶體消耗,特別是在高負載期間
- 追蹤網路吞吐量以確定頻寬或 API 容量的限制
5. 最佳實務與常見陷阱
一旦獲得結果,遵循最佳實踐並避免常見的陷阱對於實現有意義且可靠的結果至關重要。
5.1.最佳實踐
為了確保有效的負載測試,我們應該牢記以下幾點:
- 從小處著手-逐漸增加負載,以避免系統不堪重負,並更了解增量壓力下的應用程式行為
- 測試真實場景-模擬真實世界的交通模式,包括上升和下降階段,以確保測試結果反映使用者行為
- 自動化測試—將 k6 測試納入 CI/CD 管道,以便在應用程式發展過程中持續監控效能並儘早發現問題
- 使用標籤進行分類 – 為 HTTP 請求新增標籤,以便更有效地組織和分析結果
5.2.常見陷阱
我們需要避免這些常見的陷阱,以確保準確的測試結果:
- 測試系統過載-確保運行 k6 的機器有足夠的資源來處理負載,因為動力不足的系統可能會產生不準確的結果
- 不切實際的配置-配置反映實際使用情況的測試參數,避免過多的虛擬使用者或不切實際的請求模式
- 忽視測試後分析:沒有徹底的結果剖析,性能陷阱仍然隱藏,優化潛力尚未被挖掘
6. 結論
在本文中,我們討論了 k6 的設定、真實測試場景的創建、結果分析以及最佳實踐,以實現可靠的負載測試結果。
負載測試不僅僅是對應用程式進行壓力測試,它還包括了解其行為並確保它能夠處理真實世界的流量。
透過 k6 的直覺式腳本、內建指標和靈活配置,我們可以模擬真實的流量模式、準確評估效能並為我們的系統做好有效擴展的準備。我們必須從小處著手,嘗試先進的場景,並改進我們的測試以適應不斷變化的交通需求。
本文的完整程式碼可在 GitHub 上找到。