Skip to content

Commit 73e12f4

Browse files
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
1 parent 6233dc6 commit 73e12f4

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

sapi/fpm/fpm/fpm_status.c

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,25 @@ int fpm_status_export_to_zval(zval *status)
6565
struct fpm_scoreboard_proc_s procs[scoreboard.nprocs];
6666

6767
struct fpm_scoreboard_proc_s *proc_p;
68+
int calculated_active = 0, calculated_idle = 0;
6869
for(i=0; i<scoreboard.nprocs; i++) {
69-
proc_p = fpm_scoreboard_proc_acquire(scoreboard_p, i, 1);
70-
if (!proc_p){
71-
procs[i].used=-1;
72-
continue;
73-
}
74-
procs[i] = *proc_p;
75-
fpm_scoreboard_proc_release(proc_p);
76-
}
70+
proc_p = fpm_scoreboard_proc_acquire(scoreboard_p, i, 1);
71+
if (!proc_p){
72+
procs[i].used=-1;
73+
continue;
74+
}
75+
procs[i] = *proc_p;
76+
77+
if (proc_p->used) {
78+
if (proc_p->request_stage == FPM_REQUEST_ACCEPTING) {
79+
calculated_idle++;
80+
} else {
81+
calculated_active++;
82+
}
83+
}
84+
85+
fpm_scoreboard_proc_release(proc_p);
86+
}
7787
fpm_scoreboard_release(scoreboard_p);
7888

7989
now_epoch = time(NULL);
@@ -88,9 +98,9 @@ int fpm_status_export_to_zval(zval *status)
8898
add_assoc_long(status, "listen-queue", scoreboard.lq);
8999
add_assoc_long(status, "max-listen-queue", scoreboard.lq_max);
90100
add_assoc_long(status, "listen-queue-len", scoreboard.lq_len);
91-
add_assoc_long(status, "idle-processes", scoreboard.idle);
92-
add_assoc_long(status, "active-processes", scoreboard.active);
93-
add_assoc_long(status, "total-processes", scoreboard.idle + scoreboard.active);
101+
add_assoc_long(status, "idle-processes", calculated_idle);
102+
add_assoc_long(status, "active-processes", calculated_active);
103+
add_assoc_long(status, "total-processes", calculated_idle + calculated_active);
94104
add_assoc_long(status, "max-active-processes", scoreboard.active_max);
95105
add_assoc_long(status, "max-children-reached", scoreboard.max_children_reached);
96106
add_assoc_long(status, "slow-requests", scoreboard.slow_rq);

0 commit comments

Comments
 (0)