From 54f1c0ec6688f7d9b6fc1f485020b617a7839d2c Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Wed, 4 Mar 2009 04:16:57 +0000
Subject: [PATCH] add some comments on peer profile size

---
 .../i2p/router/peermanager/PeerProfile.java   | 50 +++++++++++++++++--
 1 file changed, 47 insertions(+), 3 deletions(-)

diff --git a/router/java/src/net/i2p/router/peermanager/PeerProfile.java b/router/java/src/net/i2p/router/peermanager/PeerProfile.java
index 514a9ae4af..4a94100bda 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerProfile.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerProfile.java
@@ -8,6 +8,21 @@ import net.i2p.router.RouterContext;
 import net.i2p.stat.RateStat;
 import net.i2p.util.Log;
 
+/**
+ * Copied from http://www.i2p2.i2p/how_peerselection.html
+ *
+ * See also main() below for additional commentary by zzz.
+ *
+ * Currently, there is no 'ejection' strategy to get rid of the profiles for peers that
+ * are no longer active (or when the network consists of thousands of peers, to get rid
+ * of peers that are performing poorly). However, the size of each profile is fairly small,
+ * and is unrelated to how much data is collected about the peer, so that a router can
+ * keep a few thousand active peer profiles before the overhead becomes a serious concern.
+ * Once it becomes necessary, we can simply compact the poorly performing profiles
+ * (keeping only the most basic data) and maintain hundreds of thousands of profiles
+ * in memory. Beyond that size, we can simply eject the peers (e.g. keeping the best 100,000).
+ */
+
 public class PeerProfile {
     private Log _log;
     private RouterContext _context;
@@ -315,6 +330,11 @@ public class PeerProfile {
             }
         }
     }
+    /**
+     * @return the average of the three fastest one-minute data transfers, on a per-tunnel basis,
+     *         through this peer. Ever. Except that the peak values are cut in half
+     *         once a day by coalesceThroughput(). This seems way too seldom.
+     */
     public double getPeakTunnel1mThroughputKBps() { 
         double rv = 0;
         for (int i = 0; i < THROUGHPUT_COUNT; i++)
@@ -504,12 +524,36 @@ public class PeerProfile {
     public String toString() { return "Profile: " + getPeer().toBase64(); }
     
     /**
+     * New measurement is 12KB per expanded profile. (2009-03 zzz)
+     * And nowhere in the code is shrinkProfile() called so
+     * the size of compact profiles doesn't matter right now.
+     * This is far bigger than the NetDB entry, which is only about 1.5KB
+     * now that most of the stats have been removed.
+     *
+     * The biggest user in the profile is the Rates. (144 bytes per according to jhat).
+     * PeerProfile:     9 RateStats, 3-5 Rates each - 35 total
+     * DBHistory:       2 RateStats, 3 each -          6 total
+     * TunnelHistory:   4 RateStats, 5 each -         20 total
+     *                ---                            ---------
+     *                 15                             61 total  
+     *                *60 bytes                     *144 bytes
+     *                ---                            ---------
+     *                900 bytes                     8784 bytes
+     *
+     * The RateStat itself is 32 bytes and the Rate[] is 28 so that adds
+     * about 1KB.
+     *
+     * So two obvious things to do are cut out some of the Rates,
+     * and call shrinkProfile().
+     *
+     * Obsolete calculation follows:
+     *
      * Calculate the memory consumption of profiles.  Measured to be ~3739 bytes
      * for an expanded profile, and ~212 bytes for a compacted one.
      *
      */
-    public static void main2(String args[]) {
-        RouterContext ctx = new RouterContext(null);
+    public static void main(String args[]) {
+        RouterContext ctx = new RouterContext(new net.i2p.router.Router());
         testProfileSize(ctx, 100, 0); // 560KB
         testProfileSize(ctx, 1000, 0); // 3.9MB
         testProfileSize(ctx, 10000, 0); // 37MB
@@ -524,7 +568,7 @@ public class PeerProfile {
      *  PeerProfile [filename]*
      * </pre>
      */
-    public static void main(String args[]) {
+    public static void main2(String args[]) {
         RouterContext ctx = new RouterContext(new net.i2p.router.Router());
         DecimalFormat fmt = new DecimalFormat("0,000.0");
         fmt.setPositivePrefix("+");
-- 
GitLab