ARTIFACT // BENCHMARK-CONCURRENT-LLM.SH (SHELL)
本地模型多并发吞吐量与 P95 首字延迟 (TTFT) 压测脚本 (benchmark-concurrent-llm.sh)
并发发起 N 路标准请求,精确统计多用户/多工作流并发场景下的排队等待耗时、P95 响应时间与系统总吞吐量。
[核心实测结论 / TL;DR]本配置包「本地模型多并发吞吐量与 P95 首字延迟 (TTFT) 压测脚本」(文件名:benchmark-concurrent-llm.sh,格式:SHELL)是 Tinker AI 实测工坊配套指南《vllm-vs-ollama-concurrent-homelab》的参数化生产模板。支持在本地浏览器实时定制 待压测接口地址 (/v1) (BENCH_ENDPOINT=http://127.0.0.1:11434/v1/chat/completions)、压测模型名称 (BENCH_MODEL=qwen2.5:7b)、并发请求路数 (CONCURRENCY=4) 等 3 项核心变量,默认遵循 127.0.0.1 回环绑定与最小权限规范。
01 // HOMELAB本地 AI / HomeLab· 验证日期:2026-10-23
查看全部 42 套配置附件 →benchmark-concurrent-llm.sh
查看配套实测指南 →本地模型多并发吞吐量与 P95 首字延迟 (TTFT) 压测脚本
并发发起 N 路标准请求,精确统计多用户/多工作流并发场景下的排队等待耗时、P95 响应时间与系统总吞吐量。
参数化定制变量 (Variables — 自动保存在本地浏览器)
UTF-8 编码 · 零延迟实时编译
#!/usr/bin/env bash
# Tinker AI — Concurrent Local LLM Throughput & Queue Latency Probe
set -euo pipefail
ENDPOINT="http://127.0.0.1:11434/v1/chat/completions"
MODEL="qwen2.5:7b"
WORKERS="4"
echo "=== Firing $WORKERS Parallel Requests against $MODEL ($ENDPOINT) ==="
START_TS=$(python3 -c 'import time; print(time.time())')
seq 1 "$WORKERS" | xargs -I{} -P "$WORKERS" bash -c '
REQ_START=$(python3 -c "import time; print(time.time())")
RESP=$(curl -sS "'"$ENDPOINT"'" -H "Content-Type: application/json" -d "{
\"model\": \"'"$MODEL"'\",
\"temperature\": 0,
\"max_tokens\": 160,
\"messages\": [{\"role\": \"user\", \"content\": \"Worker #{}: List 3 key differences between continuous batching and static request queues in 80 words.\"}]
}")
REQ_END=$(python3 -c "import time; print(time.time())")
python3 -c "
import json, sys
d = json.loads(sys.argv[1])
toks = d.get("usage", {}).get("completion_tokens", 0)
dur = float(sys.argv[3]) - float(sys.argv[2])
print(f"[Worker #{}] Completed in {dur:.2f}s | {toks} tokens ({toks/max(0.01,dur):.1f} tok/s)")
" "$RESP" "$REQ_START" "$REQ_END"
'
END_TS=$(python3 -c 'import time; print(time.time())')
python3 -c "print(f'=== Total Wall-Clock Duration for $WORKERS parallel requests: {float($END_TS)-float($START_TS):.2f}s ===')"
PARAMETER SPECIFICATION // 参数化变量规范说明表
「benchmark-concurrent-llm.sh」可定制环境变量与默认值说明
本配置模板(SHELL 格式)支持 3 项运行时参数注入,所有替换均在本地浏览器内完成。
| 模板占位符 | 参数用途说明 | 安全默认值 | 填写示例 |
|---|---|---|---|
{{BENCH_ENDPOINT}} | 待压测接口地址 (/v1) | http://127.0.0.1:11434/v1/chat/completions | http://127.0.0.1:11434/v1/chat/completions |
{{BENCH_MODEL}} | 压测模型名称 | qwen2.5:7b | qwen2.5:7b |
{{CONCURRENCY}} | 并发请求路数 | 4 | 4 |
PAIRED HARDWARE MANIFEST // 配套实测环境与边界记录
配套指南《HomeLab 多并发本地模型实测:Ollama 多槽位并发 vs vLLM 连续批处理吞吐量对比》验证基线
实测硬件与操作系统 (Hardware & OS)
NVIDIA RTX 4090 (24GB 独显) · 64GB DDR5 · Ubuntu 24.04 · Docker 27.x
锁定软件栈与模型版本 (Pinned Versions)
Ollama 0.5.7 (GGUF Q4_K_M)vLLM v0.6.4 (AWQ INT4)Qwen2.5-7B-Instruct & 14B-Instruct
离线与安全边界 (100% 局域网内网高并发服务)
模型权重缓存至本地 NVMe 后,Ollama 与 vLLM 均可完全断网运行。
已知限制与失败边界 (Known Limits)
- 显存独占边界:vLLM 启动时会按 `--gpu-memory-utilization`(默认 90%)一次性预分配并长期锁死显存,不像 Ollama 会在闲置 5 分钟后自动释放给其他应用或游戏。
- Ollama 并发倍增陷阱:将 `OLLAMA_NUM_PARALLEL` 设为 4 会直接将 KV Cache 显存占用放大 4 倍;若不配合开启 `OLLAMA_KV_CACHE_TYPE=q8_0`,极易触发层溢出。
DEPLOYMENT CHECKLIST // 配置落地核验步骤
部署 benchmark-concurrent-llm.sh 后的 3 步验收清单
- 调高 `OLLAMA_NUM_PARALLEL` 前,已在显存计算器中核算多并发槽位叠加后的 KV Cache 显存。
- 已运行多并发压测脚本,确认目标并发数下的最慢完成耗时低于客户端超时阈值。
- 已根据机器用途确认显存策略:兼顾桌面日常选 Ollama 自动卸载,专职高并发选 vLLM 预分配。