From b159132ea3c2448348d3db7aa97680de057efd96 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 29 Jun 2020 14:17:59 +0200 Subject: [PATCH] MINOR: activity: add per-thread statistics on FD takeover The FD takeover operation might have certain impacts explaining unexpected activities, so it's important to report such a counter there. We thus count the number of times a thread has stolen an FD from another thread. --- include/haproxy/activity-t.h | 2 +- src/backend.c | 1 + src/cli.c | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/haproxy/activity-t.h b/include/haproxy/activity-t.h index 6fc584465..5301ceed6 100644 --- a/include/haproxy/activity-t.h +++ b/include/haproxy/activity-t.h @@ -52,7 +52,7 @@ struct activity { unsigned int empty_rq; // calls to process_runnable_tasks() with nothing for the thread unsigned int long_rq; // process_runnable_tasks() left with tasks in the run queue unsigned int cpust_total; // sum of half-ms stolen per thread - /* one unused entry left before end of first cache line */ + unsigned int fd_takeover; // number of times this thread stole another one's FD ALWAYS_ALIGN(64); struct freq_ctr cpust_1s; // avg amount of half-ms stolen over last second diff --git a/src/backend.c b/src/backend.c index 51d954bab..70487870c 100644 --- a/src/backend.c +++ b/src/backend.c @@ -1103,6 +1103,7 @@ static struct connection *conn_backend_get(struct server *srv, int is_safe) mt_list_for_each_entry_safe(conn, &mt_list[i], list, elt1, elt2) { if (conn->mux->takeover && conn->mux->takeover(conn) == 0) { MT_LIST_DEL_SAFE(elt1); + _HA_ATOMIC_ADD(&activity[tid].fd_takeover, 1); found = 1; break; } diff --git a/src/cli.c b/src/cli.c index 3438fffe0..c1964df72 100644 --- a/src/cli.c +++ b/src/cli.c @@ -1174,6 +1174,7 @@ static int cli_io_handler_show_activity(struct appctx *appctx) chunk_appendf(&trash, "accq_full:"); SHOW_TOT(thr, activity[thr].accq_full); #ifdef USE_THREAD chunk_appendf(&trash, "accq_ring:"); SHOW_TOT(thr, (accept_queue_rings[thr].tail - accept_queue_rings[thr].head + ACCEPT_QUEUE_SIZE) % ACCEPT_QUEUE_SIZE); + chunk_appendf(&trash, "fd_takeover:"); SHOW_TOT(thr, activity[thr].fd_takeover); #endif #if defined(DEBUG_DEV)