I believe another way to suppress the influence of outliers is to use  
a geometric mean, ie. rather than adding N numbers and dividing my N,  
you multiply the N numbers, and take the Nth root of the result.

Ian.

On 10 Apr 2006, at 18:02, John B?ckstrand wrote:

> I was thinking about the mean ping times that are used for handling  
> node load as I understood it, and had the idea to use a median  
> instead.
>
> Using an average means one single node can artificially push the  
> avg ping very high, unless you have more than 13 other active peers  
> (the influence from a 30s ping (is this the max, btw?) with 13  
> peers is 2000ms, so even with ping=0 for the other 13 peers, the  
> mean ping will be 2000ms. This could be a very easy way to DoS the  
> network, no? Just create a very popular node (read: SkarX) and then  
> answer pings/packets very slowly.
>
> A median suppresses outliers, and outliers in a latency calculation  
> will mostly be, I suspect, those with high latency due to DoS:ing  
> or just having very bad connections (or absurd overutilization).  
> Another form of latency outliers is having local nodes, which could  
> have very low latency not affected by internet connection load.
>
> Anyway, attached is a patch to print the median aswell. I had  
> guessed that a few nodes would have "insanely" high ping and be one  
> reason for overloads, and that seems to be the case atleast on my  
> darknet node, which has more active connections. The difference  
> isnt major or anythng though: mean is 353ms, and median is 311ms,  
> caused mainly by one node with a latency of about 3000ms. I will  
> try to graph these two aswell for some extended period of time for  
> my node.
>
> ---
> John B?ckstrand
> Index: src/freenet/node/NodePinger.java
> ===================================================================
> --- src/freenet/node/NodePinger.java  (revision 8505)
> +++ src/freenet/node/NodePinger.java  (working copy)
> @@ -1,5 +1,9 @@
>  package freenet.node;
>
> +import java.util.ArrayList;
> +import java.util.Collections;
> +import java.lang.Double;
> +
>  import freenet.support.Logger;
>
>  public class NodePinger implements Runnable {
> @@ -30,20 +34,32 @@
>       void recalculateMean(PeerNode[] peers) {
>               int peerCount = 0;
>               double total = 1.0;
> +             ArrayList pingTimes = new ArrayList();
>               for(int i=0;i<peers.length;i++) {
>                       PeerNode peer = peers[i];
>                       if(!peer.isConnected()) continue;
>                       peerCount++;
>                       double avgPingTime = peer.averagePingTime();
> +                     pingTimes.add(new Double(avgPingTime));
>                       double avgThrottledPacketSendTime =  
> peer.throttledPacketSendAverage.currentValue();
>                       double value = Math.max(avgPingTime, 
> avgThrottledPacketSendTime);
>                       Logger.minor(this, "Peer: "+peer.getPeer()+", 
> avgPingTime:  
> "+avgPingTime+", avg throttled send time:  
> "+avgThrottledPacketSendTime);
>                       total *= value;
>               }
> +             
> +             Collections.sort(pingTimes);
> +     
> +             for(int i=0; i<pingTimes.size(); i++){
> +                     Logger.minor(this, "at " + i + " " + pingTimes.get(i));
> +             }
> +             
>               if(peerCount > 0) {
>                       total = Math.pow(total, 1.0 / peerCount);
>                       meanPing = total;
> -                     Logger.minor(this, "Mean ping: "+meanPing+"ms");
> +
> +                     double median = ((Double) 
> pingTimes.get((pingTimes.size()-1)/ 
> 2)).doubleValue();
> +                     
> +                     Logger.minor(this, "Mean ping: "+meanPing+"ms, median: 
> " +  
> median + "ms");
>               }
>       }
>
> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl


Reply via email to