blob: 8ac2aad6b993ab9c3b49d50c3324840fabdd8295 [file] [log] [blame] [raw]
calc_metric() {
local filename="/tmp/cost.$1"
# Ping目标IP地址5分钟,每秒一个ping
if ! ping_result="`ping -nq -w 300 -i 1 \"$1\"`"; then
# Node is down...
rm -f "$filename"
echo 65535 > "$filename"
return
fi
# 从ping结果中提取平均延迟和丢包率
avg_delay="`printf %s \"$ping_result\" | sed -En 's#^rtt min/avg/max/mdev = [0-9.]+/([0-9.]+)(/[0-9.]+){2} ms\$#\\1#p'`"
packet_loss_rate="`printf %s \"$ping_result\" | sed -En 's/.+ ([0-9.]+)% packet loss,.+/\\1/p'`"
# 设置参数值
# gamma: 这个参数调整了丢包率的影响,使之成为一个非线性的因素。具体来
# 说,它决定了丢包率被提升到 delta 次方后的影响强度。通过调整 gamma
# 可以控制丢包率在整体度量值中的相对权重,从而在某种程度上模拟丢包对网
# 络性能的实际影响。
gamma=0.2
# delta: 这个参数是丢包率影响的非线性调节器。将丢包率提升到 delta 次方
# 可以让我们模拟丢包率增加对网络性能影响的加速或减速效应。例如,一个较
# 高的 delta 值意味着随着丢包率的增加delta 量值的贡献将超线性增长,
# 反映了在丢包率较高时对性能的更大影响。
delta=3
# theta: 这个参数直接乘丢包率,代表了丢包本身对延迟的直接加成影响。
# 这反映了每个百分比的丢包对总延迟的直接贡献,模拟了由于丢包导致的重传
# 等待时间。通过调整 theta, 我们可以控制丢包率对度量值的线性贡献,
# 以此来模拟重传对延迟的影响。
theta=10
# 以毫秒为单位的延迟阈值,该值以内视为等效。
fine_grain_delay_step=40
# 用于微调最终的度量值计算
metric_offset=${2:-0}
rm -f "$filename"
printf %s\\n \
"metric = $avg_delay + $gamma * ($packet_loss_rate ^ $delta) + $theta * $packet_loss_rate" \
"scale = 0" \
"metric = metric / 1 + 1 - (metric % 1 == 0)" \
"metric = metric / $fine_grain_delay_step + 1" \
"metric = metric + $metric_offset" \
"if(metric > 65535) metric = 65535" \
"if(metric <= 0) metric = 1" \
"metric" \
| bc > "$filename"
}