给定一个 IP 列表,如何对其进行排序,以便“最近”或最低延迟排在顶部,“最远”或最长延迟排在最后?
答案1
这是我的解决方案,特定于 NIS,用 bash 编写:
yplist=( $( ypcat ypservers|xargs -n1 host|sed -n '/has.address/s/.*[[:space:]]//p'|sort -u ) )
nearest=( $( for pp in ${yplist[@]}; do ping -q -n -c 5 -i 0.3 $pp|awk -F/ '/^rtt/{printf "%d:",($5*1000)}'; echo $pp; done|sort -n -t: -k1|cut -d: -f2 ) )
printf "ypserver %s\n" ${nearest[@]} >/etc/yp.conf
这是一个在讲述过程中不断增长的管道,所以这里是:
$yplist
是一个主机数组,用作我的源列表$nearest
依次获取$yplist
和sping
- 的输出
ping
被缩小为awk
仅匹配摘要行 - 轻微 hack:使用
/
作为分隔符,avg
以 ms 为单位的往返时间乘以 1000,得到以 μs 为单位的整数值 - 后续
echo $pp
只是将有问题的 IP 粘贴到该行的末尾 - 整个
for
循环在字段 #1 上按数字排序 - 较短的响应时间平均值将浮到顶部 - 第一个字段被剪掉,只留下 IP
- 然后将此 IP 列表分配到
$nearest
数组中
这是 IP 的结果列表,最短的延迟位于顶部。
(最后一行只是为 NIS 配置printf
写出一个新的前缀,为每个 IP 添加“ypserver”前缀。)/etc/yp.conf
我考虑过将最小延迟添加到偏差因素(输出mdev
中ping
)中,以暴露潜在的不可靠主机。然而,只有当ping
每个主机运行了几个小时甚至几天时,这个统计数据才有用。因素是什么?看起来 10 到 100 之间的某个值大约是正确的,但这必须进行调整以适应不可靠性的容忍度。为了将结果净化大约 5%,这似乎需要做大量的工作。