如何获取服务器间延迟以构建矩阵分解所需的延迟矩阵?
我正在尝试构建服务器间的延迟矩阵,用**矩阵分解(matrix factorization)**算法预测P2P网络延迟。这个算法需要约20台服务器(原本考虑用DNS服务器)的相互延迟数据,矩阵结构如下:
| Servers | DNS1 | DNS2 | DNS3 | ... | Client 1 |
|---|---|---|---|---|---|
| DNS1 | 0 | ? | ? | ... | ping值 |
| DNS2 | ? | 0 | ? | ... | ping值 |
| DNS3 | ? | ? | 0 | ... | ping值 |
| ... | ... | ... | ... | 0 | |
| Client1 | ping值 | ping值 | ping值 |
拿到服务器间的延迟数据后,我可以通过让客户端ping所有服务器来补充客户端数据,最终用这个矩阵预测任意两个客户端之间的延迟。但现在我无法直接访问DNS服务器获取它们的互访延迟,不确定能不能用traceroute或DNS递归查询来解决;自己部署20台服务器成本太高,想找可行的替代方案。
关于traceroute和DNS递归查询的可行性
traceroute只能获取从你的节点到目标服务器路径上各跳的延迟,无法直接得到两台DNS服务器之间的端到端延迟,而且很多服务器会过滤ICMP探测包,导致数据不全。- DNS递归查询只能得到你的节点到DNS服务器的单向延迟,完全无法获取DNS服务器之间的互访数据,所以这两种方法都不适用。
低成本/零成本获取服务器互访延迟的方案
1. 利用公开网络测量数据集
很多学术机构和网络组织会公开大规模的网络测量数据,比如RIPE Atlas的公开数据集,里面包含大量全球节点之间的延迟、丢包率等数据,你可以筛选出20个符合需求的节点,提取它们的互访延迟来构建矩阵。另外你提到的MIT P2P模拟项目也有配套的公开测量数据,直接复用即可。
2. 申请云服务商免费试用实例
AWS、阿里云、腾讯云等主流云服务商都提供免费的云服务器试用额度,你可以在不同区域申请20个左右的轻量实例,然后在这些实例之间互相执行ping或mtr命令采集延迟数据,完成矩阵构建后销毁实例即可,几乎零成本。
3. 借助志愿者网络测量平台
加入网络测量类的志愿者社区(比如BOINC生态下的相关项目),可以获取志愿者节点之间的延迟数据,或者申请使用社区内的节点进行互测,这类平台的节点分布广泛,能满足你的数据需求。
4. 公共DNS服务器的间接估算(备选)
如果一定要用DNS服务器,你可以找一台能访问多个公共DNS服务器的VPS,从VPS分别ping每个DNS服务器得到单向延迟,然后用双向延迟的平均值(比如VPS到DNS1的延迟为A,到DNS2的延迟为B,近似DNS1到DNS2的延迟为|A-B|或A+B)来估算,但这种方法误差较大,仅适合对精度要求不高的场景。
内容的提问来源于stack exchange,提问作者Seife

