From: Christopher Faulet Date: Wed, 25 Sep 2024 07:59:11 +0000 (+0200) Subject: MINOR: stream/stats: Expose the current number of streams in stats X-Git-Tag: v3.1-dev9~25 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=18ee22ff766bd7399947af3be2b512ac5827b3c8;p=thirdparty%2Fhaproxy.git MINOR: stream/stats: Expose the current number of streams in stats A shared counter is added in the thread context to track the current number of streams. This number is then reported in stats. It will be a useful information to diagnose some bugs. --- diff --git a/include/haproxy/stats-t.h b/include/haproxy/stats-t.h index d4d01e9700..bd45214515 100644 --- a/include/haproxy/stats-t.h +++ b/include/haproxy/stats-t.h @@ -334,6 +334,7 @@ enum stat_idx_info { ST_I_INF_MAXCONN_REACHED, ST_I_INF_BOOTTIME_MS, ST_I_INF_NICED_TASKS, + ST_I_INF_CURR_STRM, /* must always be the last one */ ST_I_INF_MAX diff --git a/include/haproxy/tinfo-t.h b/include/haproxy/tinfo-t.h index 9aae92a40a..4c6d39fab3 100644 --- a/include/haproxy/tinfo-t.h +++ b/include/haproxy/tinfo-t.h @@ -180,7 +180,9 @@ struct thread_ctx { unsigned long long out_bytes; /* total #of bytes emitted */ unsigned long long spliced_out_bytes; /* total #of bytes emitted though a kernel pipe */ struct buffer *thread_dump_buffer; /* NULL out of dump, valid during a dump, 0x01 once done */ - // around 64 bytes here for shared variables + unsigned int stream_cnt; /* Number of streams attached to this thread */ + + // around 52 bytes here for shared variables ALWAYS_ALIGN(128); }; diff --git a/src/stats.c b/src/stats.c index 5db9c26319..346f11e291 100644 --- a/src/stats.c +++ b/src/stats.c @@ -168,6 +168,7 @@ const struct name_desc stat_cols_info[ST_I_INF_MAX] = { [ST_I_INF_MAXCONN_REACHED] = { .name = "MaxconnReached", .desc = "Number of times an accepted connection resulted in Maxconn being reached" }, [ST_I_INF_BOOTTIME_MS] = { .name = "BootTime_ms", .desc = "How long ago it took to parse and process the config before being ready (milliseconds)" }, [ST_I_INF_NICED_TASKS] = { .name = "Niced_tasks", .desc = "Total number of active tasks+tasklets in the current worker process (Run_queue) that are niced" }, + [ST_I_INF_CURR_STRM] = { .name = "CurrStreams", .desc = "Current number of streams on this worker process" }, }; /* one line of info */ @@ -691,7 +692,7 @@ static int stats_dump_typed_info_fields(struct buffer *out, int stats_fill_info(struct field *line, int len, uint flags) { struct buffer *out = get_trash_chunk(); - uint64_t glob_out_bytes, glob_spl_bytes, glob_out_b32; + uint64_t glob_out_bytes, glob_spl_bytes, glob_out_b32, glob_curr_strms; uint up_sec, up_usec; ullong up; ulong boot; @@ -707,11 +708,12 @@ int stats_fill_info(struct field *line, int len, uint flags) #endif /* sum certain per-thread totals (mostly byte counts) */ - glob_out_bytes = glob_spl_bytes = glob_out_b32 = 0; + glob_out_bytes = glob_spl_bytes = glob_out_b32 = glob_curr_strms = 0; for (thr = 0; thr < global.nbthread; thr++) { glob_out_bytes += HA_ATOMIC_LOAD(&ha_thread_ctx[thr].out_bytes); glob_spl_bytes += HA_ATOMIC_LOAD(&ha_thread_ctx[thr].spliced_out_bytes); glob_out_b32 += read_freq_ctr(&ha_thread_ctx[thr].out_32bps); + glob_curr_strms+= HA_ATOMIC_LOAD(&ha_thread_ctx[thr].stream_cnt); } glob_out_b32 *= 32; // values are 32-byte units @@ -817,6 +819,7 @@ int stats_fill_info(struct field *line, int len, uint flags) line[ST_I_INF_MAXCONN_REACHED] = mkf_u32(FN_COUNTER, HA_ATOMIC_LOAD(&maxconn_reached)); line[ST_I_INF_BOOTTIME_MS] = mkf_u32(FN_DURATION, boot); line[ST_I_INF_NICED_TASKS] = mkf_u32(0, total_niced_running_tasks()); + line[ST_I_INF_CURR_STRM] = mkf_u64(0, glob_curr_strms); return 1; } diff --git a/src/stream.c b/src/stream.c index e151b2c956..7f494dde4e 100644 --- a/src/stream.c +++ b/src/stream.c @@ -546,6 +546,7 @@ struct stream *stream_new(struct session *sess, struct stconn *sc, struct buffer s->tunnel_timeout = TICK_ETERNITY; LIST_APPEND(&th_ctx->streams, &s->list); + _HA_ATOMIC_INC(&th_ctx->stream_cnt); if (flt_stream_init(s) < 0 || flt_stream_start(s) < 0) goto out_fail_accept; @@ -716,6 +717,7 @@ void stream_free(struct stream *s) __ha_barrier_store(); } LIST_DELETE(&s->list); + _HA_ATOMIC_DEC(&th_ctx->stream_cnt); sc_destroy(s->scb); sc_destroy(s->scf);