如何从输入文件传递随机参数到Apache Benchmark做URL负载测试
用Apache Benchmark(ab)实现带随机搜索文本的负载测试
我来帮你搞定这个需求~因为ab本身没法直接从文件里读随机内容动态替换URL参数,所以咱们得借助shell脚本实现,下面是具体的方案和步骤:
先做好准备工作
- 把你的搜索文本整理成一个文件(比如叫
search_terms.txt),每行放一个搜索词,格式如下:text1 text2 text3 - 确认你已经装了ab,在终端敲
ab -V能看到版本信息就没问题
方案一:用循环脚本实现随机请求
写一个bash脚本(比如命名为load_test.sh),内容如下:
#!/bin/bash # 先把你的配置参数填好 BASE_URL="https://your-base-url.com/apps/your-app-id/courses/search" INPUT_FILE="search_terms.txt" TOTAL_REQUESTS=100 # 总请求数 CONCURRENT_REQUESTS=100 # 并发数 # 循环发送请求,每次随机挑一个搜索词 for ((i=1; i<=TOTAL_REQUESTS; i++)) do # 从文件里随机读一行搜索词 SEARCH_TERM=$(shuf -n 1 "$INPUT_FILE") # 给搜索词做URL编码,避免空格、特殊字符搞砸URL ENCODED_TERM=$(printf "%s" "$SEARCH_TERM" | xargs printf "%q") # 拼出完整的请求URL FULL_URL="${BASE_URL}?query=${ENCODED_TERM}" # 用ab发请求,后台运行来实现并发 ab -n 1 -c 1 "$FULL_URL" & # 每发够并发数的请求就等一下,别一下子把服务器冲垮 if (( i % CONCURRENT_REQUESTS == 0 )); then wait fi done # 等剩下的后台请求都完成 wait
脚本里的关键点
shuf -n 1:专门用来从文件里随机抽一行,保证每次请求的搜索词都不一样- URL编码:处理空格、特殊字符这些容易让URL失效的内容,确保请求能正常发送
- 后台执行+
wait:模拟ab自带的并发参数-c,控制同时发起的请求数量
方案二:先批量生成请求文件再测试
如果想要更精准的并发控制,也可以先把所有随机URL的请求内容生成一个文件,再用ab批量发送:
- 先写个脚本生成请求文件(比如
generate_requests.sh):
#!/bin/bash INPUT_FILE="search_terms.txt" BASE_URL="https://your-base-url.com/apps/your-app-id/courses/search" REQUEST_FILE="requests.txt" TOTAL_REQUESTS=100 # 先清空请求文件 > "$REQUEST_FILE" for ((i=1; i<=TOTAL_REQUESTS; i++)) do SEARCH_TERM=$(shuf -n 1 "$INPUT_FILE") ENCODED_TERM=$(printf "%s" "$SEARCH_TERM" | xargs printf "%q") # 按照HTTP请求格式写入内容 echo "GET ${BASE_URL}?query=${ENCODED_TERM} HTTP/1.1" >> "$REQUEST_FILE" echo "Host: your-base-url.com" >> "$REQUEST_FILE" echo "" >> "$REQUEST_FILE" done
- 然后用ab执行测试:
ab -n 100 -c 100 -T 'text/plain' -p requests.txt https://your-base-url.com/
一些小提醒
- 如果你的搜索词有很多特殊字符,建议装个
urlencode工具(比如Ubuntu上用apt install urlencode),替换脚本里的printf "%q",编码会更准确 - 测试前先少发几个请求试试(比如把总请求数改成5,并发数改成2),确认URL是对的,别一下子发一堆无效请求
- 注意服务器的承受能力,别搞太猛把服务器搞挂了哦
内容的提问来源于stack exchange,提问作者Abhishek kumar
相关产品推荐
相关产品推荐

