]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Only call cull_wedged_cpuworkers once every 60 seconds.
authorNick Mathewson <nickm@torproject.org>
Sat, 19 Nov 2011 23:29:42 +0000 (18:29 -0500)
committerNick Mathewson <nickm@torproject.org>
Sat, 19 Nov 2011 23:30:55 +0000 (18:30 -0500)
The function is over 10 or 20% on some of Moritz's profiles, depending
on how you could.

Since it's checking for a multi-hour timeout, this is safe to do.

Fixes bug 4518.

changes/bug4518 [new file with mode: 0644]
src/or/cpuworker.c

diff --git a/changes/bug4518 b/changes/bug4518
new file mode 100644 (file)
index 0000000..8dcb93b
--- /dev/null
@@ -0,0 +1,4 @@
+  o Minor bugfixes (performance):
+    - Avoid frequent calls to the fairly expensive cull_wedged_cpuworkers
+      function. This was eating up hideously large amounts of time on some
+      busy servers. Fixes bug 4518.
index c5e4863f7fc921a1a8d5e551f147900d92aea2e1..9d196d36eb01f49f6a23e93b8582b365ae085701 100644 (file)
@@ -446,9 +446,19 @@ assign_onionskin_to_cpuworker(connection_t *cpuworker,
 {
   char qbuf[1];
   char tag[TAG_LEN];
+  time_t now = approx_time();
+  static time_t last_culled_cpuworkers = 0;
 
-  cull_wedged_cpuworkers();
-  spawn_enough_cpuworkers();
+  /* Checking for wedged cpuworkers requires a linear search over all
+   * connections, so let's do it only once a minute.
+   */
+#define CULL_CPUWORKERS_INTERVAL 60
+
+  if (last_culled_cpuworkers + CULL_CPUWORKERS_INTERVAL <= now) {
+    cull_wedged_cpuworkers();
+    spawn_enough_cpuworkers();
+    last_culled_cpuworkers = now;
+  }
 
   if (1) {
     if (num_cpuworkers_busy == num_cpuworkers) {