ping statistics

2

Quando ping exibe estatísticas, o campo mdev é o desvio padrão de todos os tempos de ping. É o tempo médio (em ms) para a média avg .

Mas como os tempos de ping são estritamente positivos, não entendo como mdev poderia ser maior que o dobro do valor de avg , como neste caso:

Eu tenho esse tempo de ping:

[...]
64 bytes from 192.168.1.1: icmp_seq=76 ttl=128 time=1.95 ms
^C
--- 192.168.1.1 ping statistics ---
76 packets transmitted, 76 received, 0% packet loss, time 75097ms
rtt min/avg/max/mdev = 1.617/13.289/468.557/66.726 ms

em que mdev é cinco vezes avg .

EDIT: dados brutos: 1.91,2.83,4.41,1.83,2,98,2,18,2,15,1,68,2.30,2.04,1,64,1,98,1,69,1,88,1.91,1.83,10, 2.12,2.07,1.91,1.84,2.04,2.05,2.10,2.19,2.22,1.94,2.13,1.98,2.08,1.62,3,29,2,17,1,99,2,38,2,55,2,16,1.90,1.92,1.90,2.89,2.04, 2.05,2.12,2.18,1.61,2.08,1.90,2.17,3.01,1.84,2.12,20.9.362,2.07,2,31,2.42,2.05,2.47,2,55,2,13,2,56,2,07,468,2,33,2.32,1.93, 1,87,2,50,1,82,2.45,1.95

    
por Eric 17.08.2015 / 14:00

1 resposta

3

O último valor, chamado mdev no Linux e stddev no Solaris, é calculado de forma ligeiramente diferente, dependendo desses sistemas operacionais.

A fórmula usada pelo ping do Linux é:

sqrt(smean-mean²)

enquanto o usado por Solaris ping é:

sqrt((smean-mean²)*received/received-1)

com smean sendo a média de rtt quadrados, mean a média de rtt valores e received o número de respostas recebidas.

Aqui está um pequeno programa awk usando seus dados e mostrando como são computados esses valores.

echo "1.91 2.83 4.41 1.83 2.98 2.18 2.15 1.68 2.30 2.04 1.64 1.98 1.69 1.88
1.91 1.83 1.70 2.00 2.03 1.89 2.36 2.12 2.07 1.91 1.84 2.04 2.05 2.10 2.19
2.22 1.94 2.13 1.98 2.08 1.62 3.29 2.17 1.99 2.38 2.55 2.16 1.90 1.92 1.90
2.89 2.04 2.05 2.12 2.18 1.61 2.08 1.90 2.17 3.01 1.84 2.12 20.9 362 2.07
2.31 2.42 2.05 2.47 2.55 2.13 2.56 2.07 468 2.33 2.32 1.93 1.87 2.50 1.82
2.45 1.95" | awk '
function abs(v) {return v < 0 ? -v : v}
BEGIN {
  min=0x7fffffff;
}
{
  for(i=0;i<NF;i++) {
    received++
    v=$i
    min=v<min?v:min;
    max=v>max?v:max;
    sum+=v
    sum2+=v*v
  }
}
END {
  mean=sum/received
  smean=sum2/received
  printf("received=%d, min=%f, avg=%f, max=%f\n",received,min,sum/received,max)
  printf("Linux ping mdev: %f\n", sqrt(smean-(mean*mean)))
  printf("Solaris ping stddev: %f\n", sqrt(((smean-(mean*mean))*received)/(received-1)))
}
'

Sua saída é consistente com seu teste:

received=76, min=1.610000, avg=13.294211, max=468.000000
Linux ping mdev: 66.632781
Solaris ping stddev: 67.075529
    
por 17.08.2015 / 14:52