怎样用脚本自动测试网络带宽?

wen 实用脚本 3

本文目录导读:

怎样用脚本自动测试网络带宽?

  1. 方法一:使用 Speedtest CLI(最推荐,适合单点测速)
  2. 方法二:使用 iperf3(适合局域网/点对点测试)
  3. 方法三:集成告警与存档(完整示例)
  4. 注意事项
  5. 推荐方案选择

要用脚本自动测试网络带宽,最常用的工具是 Speedtest CLI(由 Ookla 提供)或 iperf3,以下是几种脚本化实现的方法,涵盖 Linux、Windows 和 macOS。


使用 Speedtest CLI(最推荐,适合单点测速)

安装

# Linux (Ubuntu/Debian)
sudo apt-get install speedtest-cli
# macOS
brew install speedtest-cli
# Windows (下载官方exe后放入PATH)
# 或使用 pip
pip install speedtest-cli

基本测速脚本(Bash)

#!/bin/bash
echo "=== 带宽测试开始 $(date) ==="
speedtest-cli --json 2>/dev/null | python3 -c "
import sys, json
data = json.load(sys.stdin)
print(f'下载: {data[\"download\"]/1e6:.2f} Mbps')
print(f'上传: {data[\"upload\"]/1e6:.2f} Mbps')
print(f'延迟: {data[\"ping\"]} ms')
"

支持定时测试(使用cron)

# 每2小时运行一次,结果写入日志
0 */2 * * * /path/to/speedtest.sh >> /var/log/bandwidth.log 2>&1

Python 脚本(更灵活)

import speedtest
import json
from datetime import datetime
def test_bandwidth():
    st = speedtest.Speedtest()
    st.get_best_server()
    # 获取下载/上传速度(bit/s)
    download_speed = st.download() / 1_000_000  # Mbps
    upload_speed = st.upload() / 1_000_000
    result = {
        "timestamp": datetime.now().isoformat(),
        "download_mbps": round(download_speed, 2),
        "upload_mbps": round(upload_speed, 2),
        "ping_ms": st.results.ping
    }
    return result
if __name__ == "__main__":
    res = test_bandwidth()
    print(json.dumps(res, indent=2))

使用 iperf3(适合局域网/点对点测试)

服务端启动(需在远程机器运行)

# 监听端口5201
iperf3 -s

客户端脚本(测试到服务端的带宽)

#!/bin/bash
SERVER_IP="192.168.1.100"
DURATION=10
echo "测试到 $SERVER_IP 的带宽..."
# 下载测试(客户端角度)
iperf3 -c $SERVER_IP -t $DURATION -f m | grep -E "sender|receiver" | while read line; do
    echo "$line"
done

批量测试多个节点的 Python 脚本

import subprocess
import re
import json
def test_iperf(server_ip, duration=10):
    cmd = f"iperf3 -c {server_ip} -t {duration} -f m"
    result = subprocess.run(cmd.split(), capture_output=True, text=True)
    # 提取发送/接收速率
    match = re.findall(r'([\d.]+) Mbits/sec', result.stdout)
    return {
        "server": server_ip,
        "sender_mbps": float(match[0]) if len(match) > 0 else 0,
        "receiver_mbps": float(match[1]) if len(match) > 1 else 0
    }
servers = ["192.168.1.100", "10.0.0.1"]
for srv in servers:
    data = test_iperf(srv)
    print(json.dumps(data))

集成告警与存档(完整示例)

#!/usr/bin/env python3
import speedtest
import sqlite3
import smtplib
from email.mime.text import MIMEText
from datetime import datetime
def test_and_store():
    # 1. 测速
    st = speedtest.Speedtest()
    st.get_best_server()
    dl = st.download() / 1e6
    ul = st.upload() / 1e6
    ping = st.results.ping
    # 2. 存入SQLite
    conn = sqlite3.connect("/var/log/bandwidth.db")
    conn.execute('''CREATE TABLE IF NOT EXISTS tests
                    (timestamp TEXT, download REAL, upload REAL, ping REAL)''')
    conn.execute("INSERT INTO tests VALUES (?,?,?,?)",
                 (datetime.now().isoformat(), dl, ul, ping))
    conn.commit()
    # 3. 告警阈值检查
    if dl < 50 or ul < 10:  # 小于50Mbps下载/10Mbps上传告警
        send_alert(f"带宽异常: 下载={dl:.2f}Mbps 上传={ul:.2f}Mbps")
    conn.close()
    return dl, ul, ping
def send_alert(msg):
    # 配置邮件发送
    pass
if __name__ == "__main__":
    test_and_store()

注意事项

  1. Speedtest CLI 限制:免费版有每日测试次数限制(Ookla 官方的 speedtest-cli 约 500次/天)。
  2. iperf3 需要双向:确保服务端已启动,防火墙开放端口(默认5201)。
  3. 并发测试:如果同时跑多个 iperf 实例,可能因带宽抢占导致结果不准确。
  4. 最小化干扰:测试期间关闭其他大流量应用(如视频、下载)。

推荐方案选择

场景 推荐工具 原因
家庭宽带稳定性 Speedtest CLI 直接测运营商带宽
公司内网质量 iperf3 可点对点测量真实吞吐
跨国节点监控 Speedtest CLI + 多服务器 支持全球节点选择
自动化监控集成 Python + speedtest-cli 易与Prometheus/Grafana结合

如果需要更复杂的定时任务、历史趋势图表或邮件告警,我可以帮你进一步扩展脚本。

抱歉,评论功能暂时关闭!