From: Willy Tarreau Date: Mon, 20 May 2019 18:52:20 +0000 (+0200) Subject: MINOR: debug: report each thread's cpu usage in "show thread" X-Git-Tag: v2.0-dev4~42 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c8800af3b595e229e1a55aef5a7953ce16cc67f;p=thirdparty%2Fhaproxy.git MINOR: debug: report each thread's cpu usage in "show thread" Now we can report each thread's CPU time, both at wake up (poll) and retrieved while dumping (now), then the difference, which directly indicates how long the thread has been running uninterrupted. A very high value for the diff could indicate a deadlock, especially if it happens between two threads. Note that it may occasionally happen that a wrong value is displayed since nothing guarantees that the date is read atomically. --- diff --git a/src/debug.c b/src/debug.c index ecb55f5907..ba668781e9 100644 --- a/src/debug.c +++ b/src/debug.c @@ -38,6 +38,8 @@ void ha_thread_dump(struct buffer *buf, int thr, int calling_tid) { unsigned long thr_bit = 1UL << thr; + unsigned long long p = thread_info[thr].prev_cpu_time; + unsigned long long n = now_cpu_time_thread(&thread_info[thr]); chunk_appendf(buf, "%c Thread %-2u: act=%d glob=%d wq=%d rq=%d tl=%d tlsz=%d rqsz=%d\n" @@ -61,6 +63,7 @@ void ha_thread_dump(struct buffer *buf, int thr, int calling_tid) #endif chunk_appendf(buf, "\n"); + chunk_appendf(buf, " cpu_ns: poll=%llu now=%llu diff=%llu\n", p, n, n-p); /* this is the end of what we can dump from outside the thread */