用 wget 安装 speedtest-cli 更可靠,因 apt 版本滞后且易受 python 环境影响;测速不准主因是后台流量、tcp_bbr 内核兼容性及过期服务器 id;自动化需加 --simple 和 --csv 参数。

直接用 speedtest-cli 就行,不用装 GUI、不依赖浏览器,一条命令就能拿到真实上传/下载速率——但默认安装方式容易出错,尤其在 Python 环境混杂或权限受限的服务器上。
安装时为什么 wget 下载脚本比 apt install 更可靠
Debian/Ubuntu 的源里 speedtest-cli 版本常滞后(比如 2.1.x),而官方最新版已支持 IPv6 优先探测、更准的延迟采样;apt 安装还可能因系统 Python 版本(如只装了 python3.9 却没装 python3 软链接)导致执行失败。
- 用
wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py直接拉取主干最新脚本 - 立刻加执行权限:
chmod +x speedtest-cli - 验证是否能跑通:
./speedtest-cli --version,输出类似speedtest-cli 2.4.0才算成功 - 如果报
ModuleNotFoundError: No module named 'speedtest',说明系统没装python3命令或环境变量没指向正确解释器,改用python3 ./speedtest-cli --version测试
speedtest-cli 测速结果不准的三个常见原因
不是工具不准,是测试条件没控住。实测中 80% 的“下载 10M 却标称 100M 带宽”问题都出在这几处:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 后台有
rsync、docker pull或日志轮转在偷偷传数据,测速前先用iftop -P tcp看端口流量,确认无其他 TCP 连接占带宽 - 服务器开了
tcp_bbr但内核版本低于 4.9,会导致上传速率虚高(尤其小包场景),可临时关掉:echo 'net.ipv4.tcp_congestion_control = cubic' | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - 用
--server指定的 ID 实际已下线(speedtest-cli --list显示的 ID 不实时更新),建议先用speedtest-cli --list | head -n 5看前 5 个节点的延迟值,选中括号里数字最小的那个 ID
自动化监控必须加的两个参数
写进 crontab 定时跑 speedtest-cli 时,不加这两个参数,日志根本没法分析:
- 必须加
--simple:否则输出含 ANSI 颜色码和空行,grep "Download"会漏匹配 - 必须加
--csv:如果要入库或画图,--csv输出是纯逗号分隔,字段顺序固定为timestamp,sponsor,server_name,download,upload,share,比解析文本稳定得多 - 别信
--share生成的图片链接能长期有效——Speedtest.net 通常 7 天后就失效,且生成过程额外耗时 2~3 秒,监控场景完全没必要 - 示例定时任务:
0 */2 * * * /root/speedtest-cli --simple --csv >> /var/log/speedtest.csv 2>/dev/null
想对比多地区节点?别用 grep 直接筛中文名
speedtest-cli --list 输出的服务器名称是原始英文,中文是网页端渲染加的,命令行里搜 "上海" 或 "北京" 必然为空。正确做法是:
- 先跑
speedtest-cli --list | head -n 20,找地理标签含Shanghai、Beijing、Guangzhou的条目 - 注意看中括号里的距离值,比如
[12.57km]是物理距离估算,不代表网络延迟,实际延迟得靠ping测试对应 IP(speedtest-cli --server=5135 --debug会打印出该节点真实域名) - 批量测多个节点时,用
for id in 5135 7553 12345; do echo "=== Server $id ==="; ./speedtest-cli --server=$id --simple; done
真正影响结果的不是选哪个参数,而是测速前有没有杀掉其他 TCP 连接、有没有确认 Python 解释器路径、以及 CSV 字段顺序是否被后续脚本硬编码依赖——这些细节一错,自动化就变成定时制造垃圾数据。










