Only call cull_wedged_cpuworkers once every 60 seconds.

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.
This commit is contained in:
Nick Mathewson 2011-11-19 18:29:42 -05:00
parent 5a02406ae0
commit 8e388bc39c
2 changed files with 16 additions and 2 deletions

4
changes/bug4518 Normal file
View File

@ -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.

View 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) {