diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
index 764e8d7995d57f11a11f2c717de99356f74180d1..bac0fb2fd747736981162b70c2f52a93aa6b43a8 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
@@ -11,6 +11,9 @@ import java.util.StringTokenizer;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.Semaphore;
 
+import org.rrd4j.core.RrdBackendFactory;
+import org.rrd4j.core.RrdNioBackendFactory;
+
 import net.i2p.I2PAppContext;
 import net.i2p.app.ClientApp;
 import net.i2p.app.ClientAppState;
@@ -83,15 +86,27 @@ public class StatSummarizer implements Runnable, ClientApp {
         }
         _isRunning = true;
         boolean isPersistent = _context.getBooleanPropertyDefaultTrue(SummaryListener.PROP_PERSISTENT);
-        if (!isPersistent)
+        int syncThreads;
+        if (isPersistent) {
+            String spec = _context.getProperty("stat.summaries", DEFAULT_DATABASES);
+            String[] rates = DataHelper.split(spec, ",");
+            syncThreads = Math.min(rates.length / 2, 4);
+        } else {
+            syncThreads = 0;
             deleteOldRRDs();
+        }
+        RrdNioBackendFactory.setSyncPoolSize(syncThreads);
         _thread = Thread.currentThread();
         _context.clientAppManager().register(this);
         String specs = "";
         try {
             while (_isRunning && _context.router().isAlive()) {
                 specs = adjustDatabases(specs);
-                try { Thread.sleep(60*1000); } catch (InterruptedException ie) {}
+                try {
+                    Thread.sleep(60*1000);
+                } catch (InterruptedException ie) {
+                    break;
+                }
             }
         } finally {
             _isRunning = false;
@@ -463,6 +478,11 @@ public class StatSummarizer implements Runnable, ClientApp {
                 lsnr.stopListening();
             }
             _listeners.clear();
+            // stops the sync thread pool in NIO; noop if not persistent,
+            // we set num threads to zero in run() above
+            try {
+                RrdBackendFactory.getDefaultFactory().close();
+            } catch (IOException ioe) {}
         }
     }
 }