From 73e12f496ff4811452e349d67dc95769633aee03 Mon Sep 17 00:00:00 2001 From: Sylvester Damgaard Date: Fri, 27 Jun 2025 13:42:04 +0200 Subject: [PATCH] fpm: calculate accurate process counts from states during status generation Replace unreliable scoreboard counters with counts calculated from actual process states. Since status endpoint already locks and reads all processes, this adds zero performance overhead while ensuring 100% accurate metrics. Resolves monitoring discrepancies where active processes were incorrectly reported as significantly lower than actual non-idle processes under load. Fixes #18956 --- sapi/fpm/fpm/fpm_status.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/sapi/fpm/fpm/fpm_status.c b/sapi/fpm/fpm/fpm_status.c index f698753cf4c65..4729a1e1e2205 100644 --- a/sapi/fpm/fpm/fpm_status.c +++ b/sapi/fpm/fpm/fpm_status.c @@ -65,15 +65,25 @@ int fpm_status_export_to_zval(zval *status) struct fpm_scoreboard_proc_s procs[scoreboard.nprocs]; struct fpm_scoreboard_proc_s *proc_p; + int calculated_active = 0, calculated_idle = 0; for(i=0; iused) { + if (proc_p->request_stage == FPM_REQUEST_ACCEPTING) { + calculated_idle++; + } else { + calculated_active++; + } + } + + fpm_scoreboard_proc_release(proc_p); + } fpm_scoreboard_release(scoreboard_p); now_epoch = time(NULL); @@ -88,9 +98,9 @@ int fpm_status_export_to_zval(zval *status) add_assoc_long(status, "listen-queue", scoreboard.lq); add_assoc_long(status, "max-listen-queue", scoreboard.lq_max); add_assoc_long(status, "listen-queue-len", scoreboard.lq_len); - add_assoc_long(status, "idle-processes", scoreboard.idle); - add_assoc_long(status, "active-processes", scoreboard.active); - add_assoc_long(status, "total-processes", scoreboard.idle + scoreboard.active); + add_assoc_long(status, "idle-processes", calculated_idle); + add_assoc_long(status, "active-processes", calculated_active); + add_assoc_long(status, "total-processes", calculated_idle + calculated_active); add_assoc_long(status, "max-active-processes", scoreboard.active_max); add_assoc_long(status, "max-children-reached", scoreboard.max_children_reached); add_assoc_long(status, "slow-requests", scoreboard.slow_rq);