本文目录导读:

使用 ab (Apache Bench) 工具
# 基本用法:-n 请求总数 -c 并发数 ab -n 1000 -c 100 http://example.com/api/test # 带Headers ab -n 1000 -c 100 -H "Authorization: Bearer token123" http://example.com/api/test # POST请求 ab -n 500 -c 50 -p post_data.json -T "application/json" http://example.com/api/submit
使用 wrk 工具
# 基本用法 wrk -t12 -c400 -d30s http://example.com/api/test # 带脚本 wrk -t4 -c100 -d30s -s script.lua http://example.com/api/test
Python 脚本实现
import requests
import concurrent.futures
import time
import threading
def send_request(url, headers=None):
"""发送单个请求"""
try:
start = time.time()
response = requests.get(url, headers=headers, timeout=5)
elapsed = time.time() - start
return {
'status': response.status_code,
'time': elapsed,
'success': True
}
except Exception as e:
return {
'status': None,
'time': time.time() - start,
'success': False,
'error': str(e)
}
def concurrent_test(url, concurrent_requests, total_requests):
"""并发测试主函数"""
results = []
with concurrent.futures.ThreadPoolExecutor(max_workers=concurrent_requests) as executor:
futures = []
for _ in range(total_requests):
future = executor.submit(send_request, url)
futures.append(future)
for future in concurrent.futures.as_completed(futures):
results.append(future.result())
# 统计结果
success_count = sum(1 for r in results if r['success'])
fail_count = total_requests - success_count
avg_time = sum(r['time'] for r in results) / total_requests
print(f"总请求数: {total_requests}")
print(f"成功请求: {success_count}")
print(f"失败请求: {fail_count}")
print(f"平均响应时间: {avg_time:.3f}s")
# 使用示例
concurrent_test("http://example.com/api/test", concurrent_requests=50, total_requests=500)
使用 Locust 框架
# locustfile.py
from locust import HttpUser, task, between
class WebsiteUser(HttpUser):
wait_time = between(1, 2)
@task
def test_endpoint(self):
self.client.get("/api/test")
@task(3) # 权重3
def test_other_endpoint(self):
with self.client.post("/api/submit",
json={"key": "value"},
catch_response=True) as response:
if response.status_code != 200:
response.failure("Failed!")
运行:
locust -f locustfile.py --host=http://example.com
Golang 并发脚本
package main
import (
"fmt"
"net/http"
"sync"
"time"
)
func sendRequest(wg *sync.WaitGroup, url string, results chan<- time.Duration) {
defer wg.Done()
start := time.Now()
resp, err := http.Get(url)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
defer resp.Body.Close()
elapsed := time.Since(start)
results <- elapsed
}
func main() {
url := "http://example.com/api/test"
concurrent := 50
total := 500
var wg sync.WaitGroup
results := make(chan time.Duration, total)
// 控制并发数
semaphore := make(chan struct{}, concurrent)
for i := 0; i < total; i++ {
wg.Add(1)
semaphore <- struct{}{}
go func() {
defer func() { <-semaphore }()
sendRequest(&wg, url, results)
}()
}
wg.Wait()
close(results)
// 统计
var totalDuration time.Duration
count := 0
for duration := range results {
totalDuration += duration
count++
}
fmt.Printf("总请求数: %d\n", count)
fmt.Printf("平均响应时间: %v\n", totalDuration/time.Duration(count))
}
Bash 并发脚本
#!/bin/bash
URL="http://example.com/api/test"
CONCURRENT=50
TOTAL=500
concurrent_requests() {
for i in $(seq 1 $TOTAL); do
(
curl -s -o /dev/null -w "%{http_code} %{time_total}\n" $URL
) &
# 控制并发数
if (( i % CONCURRENT == 0 )); then
wait
fi
done
wait
}
concurrent_requests
高级特性脚本
import asyncio
import aiohttp
import time
async def async_request(session, url):
"""异步发送请求"""
try:
start = time.time()
async with session.get(url) as response:
await response.read()
elapsed = time.time() - start
return response.status, elapsed
except Exception as e:
return None, time.time() - start
async def run_concurrent_test(url, concurrent, total):
"""异步并发测试"""
timeout = aiohttp.ClientTimeout(total=10)
connector = aiohttp.TCPConnector(limit=concurrent)
async with aiohttp.ClientSession(connector=connector, timeout=timeout) as session:
tasks = []
for _ in range(total):
task = async_request(session, url)
tasks.append(task)
results = await asyncio.gather(*tasks)
success = sum(1 for status, _ in results if status == 200)
avg_time = sum(elapsed for _, elapsed in results if elapsed) / total
print(f"Total: {total}, Success: {success}, Fail: {total-success}")
print(f"Average time: {avg_time:.3f}s")
# 运行
asyncio.run(run_concurrent_test("http://example.com/api/test", 100, 1000))
实用建议
- 监控服务器资源:同时监控CPU、内存、连接数
- 逐步增加负载:从低并发逐渐增加
- 测试不同场景:
- 正常负载测试
- 压力测试
- 突发流量测试
- 关注指标:
- 响应时间分布(P50, P95, P99)
- 错误率
- 吞吐量(QPS)
- 资源使用率
选择哪种工具取决于你的具体需求和环境,对于简单测试,ab 或 wrk 就够用;复杂场景建议使用 Locust 或自定义脚本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播