]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: Convert RUSAGE_SELF to RUSAGE_THREAD where we can 3596/head
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 9 Jan 2019 17:18:21 +0000 (12:18 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 10 Jan 2019 13:45:59 +0000 (08:45 -0500)
When using getrusage, we have multiple choices about what
to call for data gathering about this particular thread of execution.

RUSAGE_SELF -> This means gather all cpu run time for all pthreads associated
with this process.

RUSAGE_THREAD -> This means gather all cpu run time for this particular
pthread.

Clearly with data gathering for slow thread as well as `show thread cpu`
it would be preferable to gather only data about the current running
pthread.  This probably was the original behavior of using RUSAGE_SELF
when we didn't have multiple pthreads.  So it didn't matter so much.

Prior to this change, 10 iterations of 1 million routes install/remove
from zebra would give us this cpu time for the dataplane pthread:

Showing statistics for pthread Zebra dplane thread
--------------------------------------------------
                      CPU (user+system): Real (wall-clock):
Active   Runtime(ms)   Invoked Avg uSec Max uSecs Avg uSec Max uSecs  Type  Thread
    0     280902.149    326541      860   2609982      550   2468910    E  dplane_thread_loop

After this change we are seeing this:

Showing statistics for pthread Zebra dplane thread
--------------------------------------------------
                      CPU (user+system): Real (wall-clock):
Active   Runtime(ms)   Invoked Avg uSec Max uSecs Avg uSec Max uSecs  Type  Thread
    0      58045.560    334944      173    277226      539   2502268    E  dplane_thread_loop

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
lib/thread.c

index 44c9e2b2f1689d93af58cadd431e4b123fb2709b..867ca2dc6040c43955aec479d0c7476e92790a47 100644 (file)
@@ -1572,8 +1572,13 @@ void thread_set_yield_time(struct thread *thread, unsigned long yield_time)
 
 void thread_getrusage(RUSAGE_T *r)
 {
+#if defined RUSAGE_THREAD
+#define FRR_RUSAGE RUSAGE_THREAD
+#else
+#define FRR_RUSAGE RUSAGE_SELF
+#endif
        monotime(&r->real);
-       getrusage(RUSAGE_SELF, &(r->cpu));
+       getrusage(FRR_RUSAGE, &(r->cpu));
 }
 
 /*