]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Record and report the overhead of how we handle onionskins.
authorNick Mathewson <nickm@torproject.org>
Thu, 3 Jan 2013 18:20:20 +0000 (13:20 -0500)
committerNick Mathewson <nickm@torproject.org>
Thu, 3 Jan 2013 18:20:20 +0000 (13:20 -0500)
changes/timed_onionqueue
src/or/cpuworker.c
src/or/cpuworker.h
src/or/main.c

index d0900ba342045966531812b734c98dda359e0ec5..fe54d78ac8b2f545c7cd00ad68b93b782455a6b2 100644 (file)
@@ -5,3 +5,7 @@
       estimate the time it will take to process an onionskin based on average
       processing time of previous onionskins.  Closes ticket 7291. You'll
       never have to configure MaxOnionsPending again.
+
+    - We compute the overhead from passing onionskins back and forth to
+      cpuworkers, and report it when dumping statistics in response to
+      SIGUSR1.
index a6262241e360a06ad042713b7049054a38a41edd..42f7b9572ce497f469e67dba3897de5d3e38be0a 100644 (file)
@@ -235,6 +235,54 @@ estimated_usec_for_onionskins(uint32_t n_requests, uint16_t onionskin_type)
   }
 }
 
+/** Compute the absolute and relative overhead of using the cpuworker
+ * framework for onionskins of type <b>onionskin_type</b>.*/
+static int
+get_overhead_for_onionskins(uint32_t *usec_out, double *frac_out,
+                            uint16_t onionskin_type)
+{
+  uint64_t overhead;
+
+  *usec_out = 0;
+  *frac_out = 0.0;
+
+  if (onionskin_type > MAX_ONION_HANDSHAKE_TYPE) /* should be impossible */
+    return -1;
+  if (onionskins_n_processed[onionskin_type] == 0 ||
+      onionskins_usec_internal[onionskin_type] == 0 ||
+      onionskins_usec_roundtrip[onionskin_type] == 0)
+    return -1;
+
+  overhead = onionskins_usec_roundtrip[onionskin_type] -
+    onionskins_usec_internal[onionskin_type];
+
+  *usec_out = (uint32_t)(overhead / onionskins_n_processed[onionskin_type]);
+  *frac_out = U64_TO_DBL(overhead) / onionskins_usec_internal[onionskin_type];
+
+  return 0;
+}
+
+/** If we've measured overhead for onionskins of type <b>onionskin_type</b>,
+ * log it. */
+void
+cpuworker_log_onionskin_overhead(int severity, int onionskin_type,
+                                 const char *onionskin_type_name)
+{
+  uint32_t overhead;
+  double relative_overhead;
+  int r;
+
+  r = get_overhead_for_onionskins(&overhead,  &relative_overhead,
+                                  onionskin_type);
+  if (!overhead || r<0)
+    return;
+
+  log_fn(severity, LD_OR,
+         "%s onionskins have averaged %u usec overhead (%.2f%%) in "
+         "cpuworker code ",
+         onionskin_type_name, (unsigned)overhead, relative_overhead*100);
+}
+
 /** Called when we get data from a cpuworker.  If the answer is not complete,
  * wait for a complete answer. If the answer is complete,
  * process it as appropriate.
index df6917237eea023b6244d499311205213105c38e..2da0249b96342f84aa470464394c9330bb974d51 100644 (file)
@@ -24,6 +24,8 @@ int assign_onionskin_to_cpuworker(connection_t *cpuworker,
 
 uint64_t estimated_usec_for_onionskins(uint32_t n_requests,
                                        uint16_t onionskin_type);
+void cpuworker_log_onionskin_overhead(int severity, int onionskin_type,
+                                      const char *onionskin_type_name);
 
 #endif
 
index abb1e34fcdc075b9edc55b1fb03775e0cde087b5..3745ccb8ce84aabba82025f48cb9aa645fc66c80 100644 (file)
@@ -2202,6 +2202,9 @@ dumpstats(int severity)
         100*(U64_TO_DBL(stats_n_data_bytes_received) /
              U64_TO_DBL(stats_n_data_cells_received*RELAY_PAYLOAD_SIZE)) );
 
+  cpuworker_log_onionskin_overhead(severity, ONION_HANDSHAKE_TYPE_TAP, "TAP");
+  cpuworker_log_onionskin_overhead(severity, ONION_HANDSHAKE_TYPE_NTOR,"ntor");
+
   if (now - time_of_process_start >= 0)
     elapsed = now - time_of_process_start;
   else