【问题标题】:Script to extract highest latency from traceroute从跟踪路由中提取最高延迟的脚本
【发布时间】:2025-12-30 20:30:09
【问题描述】:

我正在寻找可以从跟踪路由中提取具有最高延迟跃点的线路的脚本。理想情况下,它会逐行查看 3 个值的最大值或平均值。我怎么能这样?

这是我迄今为止尝试过的:

     traceroute www.google.com | awk '{printf "%s\t%s\n", $2, $3+$4+$5; }' | sort -rgk2 | head -n1
     traceroute -w10 www.google.com | awk '{printf "%s\t%s\n", $2, ($3+$4+$5)/3; }' | sort -rgk2 | head -n1

这似乎是朝着正确方向迈出的一步,除了一些从跟踪路由返回的值是 *,因此总和和平均值都提供了错误的值。

更新 更进一步:

     traceroute www.cnn.com | awk '{count = 0;sum = 0;for (i=3; i<6; i++){ if ($i != "*") {sum += $i;count++;}}; printf "%s\t%s\t%s\t%s\n", $2, count, sum, sum/count }' | sort -rgk2

如果我没有第 4,5 列,现在需要拦截。有时traceroute只提供这样的3星:

     17   207.88.13.153  235.649ms  234.864ms  239.316ms 
     18   *  *  *

【问题讨论】:

    标签: bash latency awk


    【解决方案1】:

    你必须这样做

    • 启动跟踪路由
    • 收集每一行输出(管道可能在这里工作得很好)
    • 使用awk 之类的工具
      • 分析线路并提取您想要的信息
      • 将刚刚获得的值与之前的值进行比较,并在适当的情况下存储当前行
      • 在输入结束时打印存储的值

    【讨论】:

    • @stwissel 有 $$$ 转给我吗?我们通常不编写脚本并为他们做别人的工作,但如果您向我们展示您的工作,我们很乐意为您指明正确的方向,甚至调试内容。
    • 在玻璃上啄了一下原来的问题,现在添加了我到目前为止所做的尝试。对于“干净”的跟踪路由,我有一个解决方案,但是当 * 回来时需要一个步骤
    【解决方案2】:

    试试:

    $ traceroute 8.8.8.8 | awk ' BEGIN { FPAT="[0-9]+\\.[0-9]{3} ms" }
                               /[\\* ]{3}/ {next}
                               NR>1  {
                                       for (i=1;i<4;i++) {gsub("*","5000.00 ms",$i)}
                                       av = (gensub(" ms","",1,$1) + gensub(" ms","",1,$2) + gensub(" ms","",1,$3))/3
                                       if (av > worst) {
                                         ln = $0
                                         worst = av
                                       }
                                     }
                               ND { print "Highest:", ln, " Average:", worst, "ms"}'
    

    给出:

    Highest:  6  72.14.242.166 (72.14.242.166)  7.383 ms 72.14.232.134 (72.14.232.134)  7.865 ms  7.768 ms  Average: 7.672  ms
    

    如果有三个 asterix (asteri?) * * *,脚本假定该跃点没有响应 IGMP 响应并完全忽略它。如果一行中有一个或两个*,它会赋予它们 5.0 秒的值。

    【讨论】:

    • 嗯 - 在所有情况下你都除以 3,所以如果我有 110.666ms * 159.334ms 我会得到 90ms,这不是 135ms 的准确平均值
    • 我认为问题在于缺少* 的定义。在您的评论中,您选择忽略它并除以二。它也可以定义为 5.0 秒,因为这是 traceroute 放弃并显示 asterix 的时间。它也可以定义为无穷大,因为没有看到任何响应。在后一种情况下,您最终可能会得到多行作为最坏情况的响应。
    • 是的。 * 未定义。请求超时时出现。通常,当服务器配置为忽略 traceroute 时会发生这种情况。我检查了 30 秒超时,但仍然得到 *.所以我得出结论,忽略与假设一个值一样好(其中超时 - 默认 3 秒 - 将是合适的)Awk 无论如何都会将其变为零。但是有 2 个值并除以 3 不会产生可用的结果。
    • 我已经(以前)对其进行了编辑,因此如果有三个*,那么它假定服务器正在忽略请求。但是,如果有一个或两个* 和一个响应,则服务器不会忽略该请求,而是需要很长时间才能响应(默认> 5 秒)。
    • 非常感谢您的坚持不懈地帮助我!
    【解决方案3】:

    Stephan,您可以尝试使用 pchar 作为 pathchar 的衍生物。它应该在 Ubuntu 存储库中。

    我需要一段时间才能运行,所以你需要一些耐心。它会向您显示吞吐量,这比确定瓶颈的延迟要好得多。

    http://www.caida.org/tools/taxonomy/perftaxonomy.xml

    这是一个例子:

    rayd@raydHPEliteBook8440p ~ sudo pchar anddroiddevs.com
    pchar to anddroiddevs.com (31.221.38.104) using UDP/IPv4
    Using raw socket input
    Packet size increments from 32 to 1500 by 32
    46 test(s) per repetition
    32 repetition(s) per hop
     0: 192.168.0.20 (raydHPEliteBook8440p.local)
        Partial loss:      0 / 1472 (0%)
        Partial char:      rtt = 6.553065 ms, (b = 0.000913 ms/B), r2 = 0.241811
                           stddev rtt = 0.196989, stddev b = 0.000244
        Partial queueing:  avg = 0.012648 ms (13848 bytes)
        Hop char:          rtt = 6.553065 ms, bw = 8759.575088 Kbps
        Hop queueing:      avg = 0.012648 ms (13848 bytes)
     1: 80.5.69.1 (cpc2-glfd6-2-0-gw.6-2.cable.virginm.net)
    

    【讨论】:

      【解决方案4】:

      使用mtr --raw -c 1 google.com。它更快更容易解析。

      【讨论】: