用于从traceroute中提取最高延迟的脚本

时间:2014-09-08 06:58:23

标签: bash latency awk

我正在寻找一个可以从traceroute中提取具有最高延迟跳跃的行的脚本。理想情况下,它会逐行查看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返回的一些值是*,因此总和和平均值都提供了错误的值。

更新 更进了一步:

     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   *  *  *

4 个答案:

答案 0 :(得分:5)

你必须

  • 启动traceroute
  • 收集每一行输出(管道在这里可能会很好用)
  • 使用awk之类的工具
    • 分析该行并提取您想要的信息
    • 将您刚刚获得的值与之前的值进行比较并存储当前行(如果适用)
    • 在输入结束时打印存储值

答案 1 :(得分:1)

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)

答案 2 :(得分:1)

尝试:

$ 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 :(得分:0)

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