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);
};
[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 */
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;
#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
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;
}
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;
__ha_barrier_store();
}
LIST_DELETE(&s->list);
+ _HA_ATOMIC_DEC(&th_ctx->stream_cnt);
sc_destroy(s->scb);
sc_destroy(s->scf);