Featured image of post AI 自动化基准测试:LLM 驱动的 VPS 性能基准与异常检测

AI 自动化基准测试:LLM 驱动的 VPS 性能基准与异常检测

探索如何用 LLM 自动执行 VPS 基准测试、分析性能数据并检测异常,将传统手动基准测试升级为数据驱动的持续性能观测。

为什么 VPS 需要自动化基准测试

基准测试(Benchmark)是衡量服务器性能的核心手段。对于 VPS 用户而言,场景可能包括:

  • 新购 VPS 后确认实际性能与标称是否一致
  • 长期监控性能漂移(如邻居干扰导致 I/O 抖动)
  • 对比不同云厂商的真实表现
  • 在升级/降配前量化资源利用

传统方式依赖手动执行 dd、sysbench、fio、iperf 等工具,人工分析输出,耗时且缺乏持续性。LLM 的介入,可以将这一流程升级为数据驱动的持续性能观测:

  1. 自动触发 — 定时或在配置变更后执行
  2. 结构化输出 — 统一收集 CPU / 内存 / I/O / 网络数据
  3. LLM 解读 — 理解上下文(如"今天邻居跑批导致 iowait 飙升"),而不是只看原始数字
  4. 异常检测 — 与历史基线对比,发现性能回归
  5. 自动报告 — 生成人类可读的性能周报/月报

架构设计

整个系统分为四层:

┌─────────────────────────────────────────────────┐
│  报告层:Grafana Dashboard + LLM 生成的 Markdown  │
├─────────────────────────────────────────────────┤
│  分析层:Ollama(本地 LLM)+ 异常检测脚本          │
├─────────────────────────────────────────────────┤
│  采集层:sysbench / fio / iperf3 / 自定义脚本    │
├─────────────────────────────────────────────────┤
│  触发层:systemd timer / cron / webhook          │
└─────────────────────────────────────────────────┘

实现步骤

1. 安装基准测试工具

# 安装常用基准工具
apt update && apt install -y sysbench fio iperf3

# 安装 Ollama 用于本地 LLM 分析
curl -fsSL https://ollama.com/install.sh | sh

# 拉取适合代码/数据解读的轻量模型
ollama pull qwen2.5:7b
# 如果内存 < 4GB,可用 1.5B 或 3B 版本
# ollama pull qwen2.5:1.5b

2. 编写基准采集脚本

#!/bin/bash
# benchmark_suite.sh — 统一收集所有指标
set -euo pipefail
OUT_DIR="/var/log/benchmark/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUT_DIR"

# CPU 基准
sysbench cpu --cpu-max-prime=20000 run 2>&1 | tee "$OUT_DIR/cpu.log"

# 内存带宽
sysbench memory --memory-block-size=4816 \
  --memory-max-size=4000000 run 2>&1 | tee "$OUT_DIR/mem.log"

# I/O 基准
fio --name=randread --ioengine=libaio --iodepth=64 \
    --direct=1 --bs=4k --numjobs=4 --size=2G \
    --runtime=60 --filename=/dev/sda1 \
    --read_iops_log="$OUT_DIR/fio_randread.log" \
    --read_bw_log="$OUT_DIR/fio_randread_bw.log" \
    --group_reporting

iperf3 -s -J > "$OUT_DIR/iperf_server.json" &
IPERF_PID=$!
sleep 3
iperf3 -c 1.1.1.1 -J > "$OUT_DIR/iperf_client.json"
kill $IPERF_PID

# 汇总
cat "$OUT_DIR"/*.log "$OUT_DIR"/*.json > "$OUT_DIR/all.json"
echo "Benchmark suite completed at $OUT_DIR"

3. 添加 LLM 分析管道

#!/usr/bin/env python3
"""analyze_benchmark.py — 用本地 LLM 解读基准数据"""
import json
import requests
from pathlib import Path

def load_latest_benchmark():
    base = Path("/var/log/benchmark")
    dirs = sorted(base.iterdir(), key=lambda d: d.name, reverse=True)
    if not dirs:
        raise FileNotFoundError("No benchmarks found")
    return json.loads((dirs[0] / "all.json").read_text())

def llm_analyze(data: dict, model: str = "qwen2.5:7b") -> str:
    prompt = f"""你是一名资深 SRE。以下是 VPS 基准测试的原始输出:

{json.dumps(data, indent=2)}

请分析:
1. 各项指标是否达到预期(与标称配置对比)
2. 是否存在邻居干扰、I/O 抖动等异常信号
3. 给出优化建议(至少 3 条)
4. 如果与历史数据(见附件)对比,是否存在性能回归
"""
    # 附加历史基线(取最近 7 天均值)
    import statistics
    baseline = get_baseline(data)
    prompt += f"\n历史基线(7 天均值):\n{json.dumps(baseline, indent=2)}"

    resp = requests.post(
        "http://localhost:11434/api/chat",
        json={
            "model": model,
            "messages": [{"role": "user", "content": prompt}],
            "stream": False,
        },
        timeout=120,
    )
    return resp.json()["message"]["content"]

def get_baseline(current: dict):
    """读取历史数据目录,计算 7 天均值"""
    from pathlib import Path
    base = Path("/var/log/benchmark")
    data_points = []
    for d in sorted(base.iterdir(), reverse=True)[:7]:
        try:
            j = json.loads((d / "all.json").read_text())
            data_points.append(j)
        except Exception:
            continue
    if not data_points:
        return {}
    # 示例:提取 sysbench cpu 事件数
    def extract(d, key):
        try:
            return d.get(key, 0)
        except:
            return 0
    keys = ["sysbench_cpu_events", "fio_iops", "iperf_bw_mbps"]
    return {
        k: sum(extract(dp, k) for dp in data_points) / len(data_points)
        for k in keys
    }

if __name__ == "__main__":
    data = load_latest_benchmark()
    result = llm_analyze(data)
    print(result)
    # 写入报告
    Path("/var/log/benchmark/reports").mkdir(parents=True, exist_ok=True)
    from datetime import datetime
    out = Path(f"/var/log/benchmark/reports/{datetime.now():%Y%m%d_%H%M}.md")
    out.write_text(f"# VPS 基准分析报告\n\n{result}\n")
    print(f"Report saved to {out}")

4. 配置定时任务

# /etc/systemd/system/benchmark-daily.service
[Unit]
Description=Daily VPS benchmark suite
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/benchmark_suite.sh
Environment=HOME=/root

[Install]
WantedBy=multi-user.target
# /etc/systemd/system/benchmark-daily.timer
[Unit]
Description=Run benchmark daily at 03:00

[Timer]
OnCalendar=03:00
Persistent=true
Unit=benchmark-daily.service

[Install]
WantedBy=timers.target
systemctl enable --now benchmark-daily.timer

5. 在 Grafana 中查看趋势

将 LLM 生成的报告中的关键指标推送到 Prometheus(或直接通过 promtail 日志采集),在 Grafana 上创建 Dashboard:

  • 面板 1:CPU 事件数/秒(7 天趋势)
  • 面板 2:I/O IOPS(4k 随机读)
  • 面板 3:网络吞吐量
  • 面板 4:LLM 异常标记(自定义 annotation)

高级:将 LLM 分析结果接入告警

# 在 LLM 输出中检测关键词触发告警
import re
import requests

def check_and_alert(llm_output: str):
    alert_keywords = ["性能回归", "iowait", "邻居干扰", "带宽下降"]
    matched = [kw for kw in alert_keywords if kw in llm_output]
    if matched:
        requests.post(
            "https://hooks.example.com/ops-alert",
            json={
                "title": "VPS 基准测试异常",
                "body": f"LLM 检测到异常: {matched}\n{llm_output}",
            },
        )

总结

维度传统方式LLM 驱动方式
触发手动自动(定时器/webhook)
输出原始数字结构化 + 人类可读报告
异常检测人工判断基线对比 + LLM 上下文理解
告警无关键词匹配自动推送
可扩展单节点多节点聚合 + 跨节点关联

这套方案的核心价值在于:把基准测试从"一次性动作"变成"持续观测能力",让 LLM 充当你的 24/7 性能分析师,而不是只在出事后才开始排查。

📺 看视频版教程 → DuckDB Lab YouTube

Subscribe for more DuckDB & AI automation tutorials