先说是什么:一个单文件的命令行工具,丢到 VPS 、路由器或者 CI 里跑,测这台机器到 AWS 、Azure 、GCP 、阿里云、腾讯云、Hetzner 、OVH 、Vultr 、DO 等 22 家云厂商共 392 个区域的延迟、抖动和丢包。
curl -fsSL https://m2c.1ms.dog/i | sh
装完直接出菜单,回车一路默认就开测。不想装,只跑一次:
curl -fsSL https://m2c.1ms.dog/i | sh -s -- run

为什么要写这个
起因很俗:我想知道手上这台 VPS ,离哪家云的哪个区域最近。
比如在德国有台 netcup ,想给它配一个对象存储做备份、或者找个就近的区域放 API ,选 AWS 法兰克福还是伦敦? Hetzner 的赫尔辛基和纽伦堡差多少?以前的做法是开一堆标签页翻各家的 Looking Glass ,或者对着一串 IP 手动 ping 。问题是 Looking Glass 测的是他们机房到你,方向反了,而且每家一个页面,没法放在一张表里比。手动 ping 呢,你得先知道每个区域该 ping 哪个地址,很多云的 ICMP 还不回或者被限速。
所以干脆把 392 个区域的测速地址整理成一份清单,写个工具一次测完,排好序给我看。
它怎么测的
默认测的是 TCP 握手:对每个区域的 HTTPS 端口发起连接,计时 SYN 到 SYN-ACK ,完事立刻关掉。不走 TLS 、不发 HTTP 请求,所以测到的就是纯网络往返,不掺服务器处理时间,比区域的时候最公平。
另外还有两种测法,也可以三种一起上:
-m https:在复用的 HTTPS 连接上发请求,计时到响应头。数字会比 TCP 多一点服务器处理时间,但更接近应用的真实体感。-m icmp:传统 ping ,需要 root 。部分网络会给 ICMP 降优先级,Naver Cloud 干脆不回。-m all:三种并排,自己看差异。
每个区域给中位数、最小、P90 、抖动(相邻两次采样差值的平均)、丢包,再按中位数分档:T0 ≤ 30 ms 、T1 ≤ 80 、T2 ≤ 150 、T3 ≤ 250 ,再往上是 T4 。
为什么一分钟能测完。 在纽伦堡一台 1 核 1 G 的 netcup 上实测,392 个区域每个 10 次采样,一共 3920 次,用了 1 分 16 秒。快是因为多个区域并发(默认同时 24 个主机),一个区域一个区域串着测要 20 分钟以上。
但并发不等于轰炸。同一个主机任何时刻只有一个采样在飞,两次之间隔 250 ms ;同一家厂商最多同时测 4 个区域;连续失败 3 次就放弃。默认一次运行,每个区域一共只收到 10 次握手。这是测别人家的公共接口,礼貌是底线,也免得触发限流把数据搞脏。
和 Me2Cloud 是一对
这个工具是 Me2Cloud 的命令行版。两个东西回答的是同一个问题的两半:
- Me2Cloud (网页):在你的浏览器里测,测的是你家网络 → 各家云。你的运营商、Wi-Fi 、晚高峰都算在里面。适合回答「我自己用起来,哪个区域快」。
- vps2cloud (命令行):在服务器上跑,测的是这台机器 → 各家云。适合回答「这台 VPS 离哪个区域近」「我的中转、反代、回源该挂哪个区域」。
两边用的是同一份测速点清单,分档、评分算法也完全一致。清单在 Me2Cloud 那边维护,每个测速点每周检查一遍,命令行这边每天自动同步。要注意一点:网页在浏览器里只能用 HTTPS 测,命令行默认是 TCP 握手,前者会多几毫秒服务器处理时间。想让两边口径完全一致,命令行加 -m https 就行。
更顺手的是:命令行测完会给一个分享链接,打开就是 Me2Cloud 的完整结果页,能排序、能看分布图。比如上面那次测试,在网页上打开是这样:

我自己的用法一般是:先在家里用 Me2Cloud 测一遍,看自己(或者用户)到哪些区域快;再在候选的 VPS 上跑一遍 vps2cloud ,看服务器到这些区域怎么样。两头一对,链路两端都心里有数了。
几个我自己常用的姿势
vps2cloud -p aws,gcp -r 'eu-*' # 只看 AWS 和 GCP 的欧洲区域
vps2cloud --continent as --top 10 # 亚洲,只看最快的 10 个
vps2cloud --ip both # IPv4 和 IPv6 一次测完,一份报告分两段
vps2cloud --cdn # 测 Cloudflare 、Akamai 、CloudFront 等 6 家 CDN 的就近节点
vps2cloud --preset game # 标出适合打游戏的区域(中位数 ≤ 60 、抖动 ≤ 10 、不丢包)
vps2cloud -o md # 顺手存一份 Markdown 表格,发帖直接贴
放进 CI 或 cron 做监控也行:
vps2cloud -p hetzner --max-ms 50 # 最快的区域都超过 50 ms 就以退出码 3 结束
vps2cloud -o json --stdout | jq '.regions[0]' # JSON 接管道
一些细节
- 单个静态二进制,零依赖。 Linux 的 amd64 、arm64 、armv7 、386 、riscv64 都有,OpenWrt 用的 mips 、mipsle 也有,路由器上能直接跑。另外还有 macOS 、FreeBSD 和 Windows ( PowerShell 里
irm https://m2c.1ms.dog/i.ps1 | iex)。 - 国内下载不卡。 安装和自更新先走
m2c.1ms.dog/dl/(转发 GitHub Release 的文件),不通再回落 GitHub 。不管从哪下,都用 Release 里的checksums.txt校验,还附带了 GitHub 的构建来源证明,可以用gh attestation verify自己验。 - 装之前想看脚本干了什么,就是仓库里的 install.sh,不到一百行。
- 10 种语言,第一次运行让你选,之后记住。菜单、表格、Markdown 跟着语言走,JSON 和 CSV 的字段名保持英文。
隐私,说清楚
除了测量本身,它会发这几个请求:拉测速点清单(这就是运行次数的统计来源,User-Agent 只有版本号和系统/架构)、问 Cloudflare 这台机器在哪个城市和运营商、生成短链接、每小时最多查一次更新。
短链接这件事要单独说:为了生成 s.1ms.dog/xxxx 这种短链,完整链接(里面就是测试结果:各区域的数值和出口城市、运营商)会存在 s.1ms.dog 上。IP 地址从来不在里面,除非你自己加 --show-ip。
不想让结果存到任何服务器上,加 --long-link:给你完整链接,结果全在 # 后面,浏览器不会把这部分发给服务器。--offline 则连清单和更新检查都不发。
它做不到的
- 测的是各家云在每个区域的公共 API 或对象存储接口,不是一台真实的虚拟机。同区域一般共用网络,但精品线路(比如 CN2 、BGP 和单线的区别)可能不一样。
- 只测往返延迟,不测带宽,也不做路由追踪。
- TCP 握手测的是网络往返;如果你关心的是应用层体感,用
-m https。
链接
- 命令行: https://github.com/yt1988/vps2cloud ( MIT )
- 网页版: https://m2c.1ms.dog
测速点清单肯定还有缺漏和过时的地方。哪家云、哪个区域没收录,或者某个区域测出来明显不对,欢迎回帖或者开 issue ,我会去核实。也很想看看大家手上的小鸡测出来离哪个区域最近,可以直接贴分享链接。