diff --git a/sapi/fpm/fpm/fpm_php_trace.c b/sapi/fpm/fpm/fpm_php_trace.c index b1535b26e3ef8..fca79e4bf70e8 100644 --- a/sapi/fpm/fpm/fpm_php_trace.c +++ b/sapi/fpm/fpm/fpm_php_trace.c @@ -189,7 +189,7 @@ static int fpm_php_trace_dump(struct fpm_child_s *child, FILE *slowlog) /* {{{ * void fpm_php_trace(struct fpm_child_s *child) /* {{{ */ { - fpm_scoreboard_update(0, 0, 0, 0, 0, 0, 1, FPM_SCOREBOARD_ACTION_INC, child->wp->scoreboard); + fpm_scoreboard_update(0, 0, 0, 0, 0, 0, 1, 0, FPM_SCOREBOARD_ACTION_INC, child->wp->scoreboard); FILE *slowlog; zlog(ZLOG_NOTICE, "about to trace %d", (int) child->pid); diff --git a/sapi/fpm/fpm/fpm_process_ctl.c b/sapi/fpm/fpm/fpm_process_ctl.c index 7a55d98b046fc..4abffdf093d01 100644 --- a/sapi/fpm/fpm/fpm_process_ctl.c +++ b/sapi/fpm/fpm/fpm_process_ctl.c @@ -373,7 +373,7 @@ static void fpm_pctl_perform_idle_server_maintenance(struct timeval *now) /* {{{ } } - fpm_scoreboard_update_commit(idle, active, cur_lq, -1, -1, -1, 0, FPM_SCOREBOARD_ACTION_SET, wp->scoreboard); + fpm_scoreboard_update_commit(idle, active, cur_lq, -1, -1, -1, 0, 0, FPM_SCOREBOARD_ACTION_SET, wp->scoreboard); /* this is specific to PM_STYLE_ONDEMAND */ if (wp->config->pm == PM_STYLE_ONDEMAND) { @@ -406,7 +406,7 @@ static void fpm_pctl_perform_idle_server_maintenance(struct timeval *now) /* {{{ if (idle < wp->config->pm_min_spare_servers) { if (wp->running_children >= wp->config->pm_max_children) { if (!wp->warn_max_children && !wp->shared) { - fpm_scoreboard_update(0, 0, 0, 0, 0, 1, 0, FPM_SCOREBOARD_ACTION_INC, wp->scoreboard); + fpm_scoreboard_update(0, 0, 0, 0, 0, 1, 0, 0, FPM_SCOREBOARD_ACTION_INC, wp->scoreboard); zlog(ZLOG_WARNING, "[pool %s] server reached pm.max_children setting (%d), consider raising it", wp->config->name, wp->config->pm_max_children); wp->warn_max_children = 1; } @@ -425,7 +425,7 @@ static void fpm_pctl_perform_idle_server_maintenance(struct timeval *now) /* {{{ children_to_fork = MIN(children_to_fork, wp->config->pm_max_children - wp->running_children); if (children_to_fork <= 0) { if (!wp->warn_max_children && !wp->shared) { - fpm_scoreboard_update(0, 0, 0, 0, 0, 1, 0, FPM_SCOREBOARD_ACTION_INC, wp->scoreboard); + fpm_scoreboard_update(0, 0, 0, 0, 0, 1, 0, 0, FPM_SCOREBOARD_ACTION_INC, wp->scoreboard); zlog(ZLOG_WARNING, "[pool %s] server reached pm.max_children setting (%d), consider raising it", wp->config->name, wp->config->pm_max_children); wp->warn_max_children = 1; } @@ -529,7 +529,7 @@ void fpm_pctl_on_socket_accept(struct fpm_event_s *ev, short which, void *arg) / if (wp->running_children >= wp->config->pm_max_children) { if (!wp->warn_max_children && !wp->shared) { - fpm_scoreboard_update(0, 0, 0, 0, 0, 1, 0, FPM_SCOREBOARD_ACTION_INC, wp->scoreboard); + fpm_scoreboard_update(0, 0, 0, 0, 0, 1, 0, 0, FPM_SCOREBOARD_ACTION_INC, wp->scoreboard); zlog(ZLOG_WARNING, "[pool %s] server reached max_children setting (%d), consider raising it", wp->config->name, wp->config->pm_max_children); wp->warn_max_children = 1; } diff --git a/sapi/fpm/fpm/fpm_request.c b/sapi/fpm/fpm/fpm_request.c index 0eb75884d367a..92c6fa8f2cca9 100644 --- a/sapi/fpm/fpm/fpm_request.c +++ b/sapi/fpm/fpm/fpm_request.c @@ -54,7 +54,7 @@ void fpm_request_accepting(void) fpm_scoreboard_proc_release(proc); /* idle++, active-- */ - fpm_scoreboard_update_commit(1, -1, 0, 0, 0, 0, 0, FPM_SCOREBOARD_ACTION_INC, NULL); + fpm_scoreboard_update_commit(1, -1, 0, 0, 0, 0, 0, 0, FPM_SCOREBOARD_ACTION_INC, NULL); } void fpm_request_reading_headers(void) @@ -98,7 +98,7 @@ void fpm_request_reading_headers(void) fpm_scoreboard_proc_release(proc); /* idle--, active++, request++ */ - fpm_scoreboard_update_commit(-1, 1, 0, 0, 1, 0, 0, FPM_SCOREBOARD_ACTION_INC, NULL); + fpm_scoreboard_update_commit(-1, 1, 0, 0, 1, 0, 0, 0, FPM_SCOREBOARD_ACTION_INC, NULL); } void fpm_request_info(void) @@ -199,6 +199,9 @@ void fpm_request_end(void) #endif proc->memory = memory; fpm_scoreboard_proc_release(proc); + + /* memory_peak */ + fpm_scoreboard_update_commit(0, 0, 0, 0, 0, 0, 0, proc->memory, FPM_SCOREBOARD_ACTION_SET, NULL); } void fpm_request_finished(void) diff --git a/sapi/fpm/fpm/fpm_scoreboard.c b/sapi/fpm/fpm/fpm_scoreboard.c index 32f8e9ab161d8..4306d814dc07d 100644 --- a/sapi/fpm/fpm/fpm_scoreboard.c +++ b/sapi/fpm/fpm/fpm_scoreboard.c @@ -99,7 +99,7 @@ void fpm_scoreboard_update_begin(struct fpm_scoreboard_s *scoreboard) /* {{{ */ void fpm_scoreboard_update_commit( int idle, int active, int lq, int lq_len, int requests, int max_children_reached, - int slow_rq, int action, struct fpm_scoreboard_s *scoreboard) /* {{{ */ + int slow_rq, size_t memory_peak, int action, struct fpm_scoreboard_s *scoreboard) /* {{{ */ { scoreboard = fpm_scoreboard_get_for_update(scoreboard); if (!scoreboard) { @@ -169,6 +169,9 @@ void fpm_scoreboard_update_commit( if (scoreboard->active > scoreboard->active_max) { scoreboard->active_max = scoreboard->active; } + if (scoreboard->memory_peak < memory_peak) { + scoreboard->memory_peak = memory_peak; + } fpm_unlock(scoreboard->lock); } @@ -177,11 +180,11 @@ void fpm_scoreboard_update_commit( void fpm_scoreboard_update( int idle, int active, int lq, int lq_len, int requests, int max_children_reached, - int slow_rq, int action, struct fpm_scoreboard_s *scoreboard) /* {{{ */ + int slow_rq, size_t memory_peak, int action, struct fpm_scoreboard_s *scoreboard) /* {{{ */ { fpm_scoreboard_update_begin(scoreboard); fpm_scoreboard_update_commit( - idle, active, lq, lq_len, requests, max_children_reached, slow_rq, action, scoreboard); + idle, active, lq, lq_len, requests, max_children_reached, slow_rq, memory_peak, action, scoreboard); } /* }}} */ diff --git a/sapi/fpm/fpm/fpm_scoreboard.h b/sapi/fpm/fpm/fpm_scoreboard.h index 5aeb5555133a7..4ccd8cfb4e23f 100644 --- a/sapi/fpm/fpm/fpm_scoreboard.h +++ b/sapi/fpm/fpm/fpm_scoreboard.h @@ -66,6 +66,7 @@ struct fpm_scoreboard_s { unsigned int nprocs; int free_proc; unsigned long int slow_rq; + size_t memory_peak; struct fpm_scoreboard_s *shared; struct fpm_scoreboard_proc_s procs[] ZEND_ELEMENT_COUNT(nprocs); }; @@ -74,8 +75,8 @@ int fpm_scoreboard_init_main(void); int fpm_scoreboard_init_child(struct fpm_worker_pool_s *wp); void fpm_scoreboard_update_begin(struct fpm_scoreboard_s *scoreboard); -void fpm_scoreboard_update_commit(int idle, int active, int lq, int lq_len, int requests, int max_children_reached, int slow_rq, int action, struct fpm_scoreboard_s *scoreboard); -void fpm_scoreboard_update(int idle, int active, int lq, int lq_len, int requests, int max_children_reached, int slow_rq, int action, struct fpm_scoreboard_s *scoreboard); +void fpm_scoreboard_update_commit(int idle, int active, int lq, int lq_len, int requests, int max_children_reached, int slow_rq, size_t memory_max, int action, struct fpm_scoreboard_s *scoreboard); +void fpm_scoreboard_update(int idle, int active, int lq, int lq_len, int requests, int max_children_reached, int slow_rq, size_t memory_max, int action, struct fpm_scoreboard_s *scoreboard); struct fpm_scoreboard_s *fpm_scoreboard_get(void); struct fpm_scoreboard_proc_s *fpm_scoreboard_proc_get(struct fpm_scoreboard_s *scoreboard, int child_index); diff --git a/sapi/fpm/fpm/fpm_sockets.c b/sapi/fpm/fpm/fpm_sockets.c index adff05983b130..9c5afa1ae9b92 100644 --- a/sapi/fpm/fpm/fpm_sockets.c +++ b/sapi/fpm/fpm/fpm_sockets.c @@ -513,7 +513,7 @@ int fpm_sockets_init_main(void) } if (wp->listen_address_domain == FPM_AF_INET && fpm_socket_get_listening_queue(wp->listening_socket, NULL, &lq_len) >= 0) { - fpm_scoreboard_update(-1, -1, -1, (int)lq_len, -1, -1, 0, FPM_SCOREBOARD_ACTION_SET, wp->scoreboard); + fpm_scoreboard_update(-1, -1, -1, (int)lq_len, -1, -1, 0, 0, FPM_SCOREBOARD_ACTION_SET, wp->scoreboard); } } diff --git a/sapi/fpm/fpm/fpm_status.c b/sapi/fpm/fpm/fpm_status.c index e9b6ce2d95cdb..cbf8644d99cab 100644 --- a/sapi/fpm/fpm/fpm_status.c +++ b/sapi/fpm/fpm/fpm_status.c @@ -94,6 +94,7 @@ int fpm_status_export_to_zval(zval *status) 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); + add_assoc_long(status, "memory-peak", scoreboard.memory_peak); array_init(&fpm_proc_stats); for(i=0; imax active processes%d\n" "max children reached%u\n" "slow requests%lu\n" + "memory peak%zu\n" "\n"; if (!full) { @@ -309,7 +311,8 @@ int fpm_status_handle_request(void) /* {{{ */ "%d\n" "%d\n" "%u\n" - "%lu\n"; + "%lu\n" + "%zu\n"; if (!full) { short_post = ""; @@ -357,7 +360,8 @@ int fpm_status_handle_request(void) /* {{{ */ "\"total processes\":%d," "\"max active processes\":%d," "\"max children reached\":%u," - "\"slow requests\":%lu"; + "\"slow requests\":%lu," + "\"memory peak\":%zu"; if (!full) { short_post = "}"; @@ -426,6 +430,9 @@ int fpm_status_handle_request(void) /* {{{ */ "# HELP phpfpm_slow_requests The number of requests that exceeded your 'request_slowlog_timeout' value.\n" "# TYPE phpfpm_slow_requests counter\n" "phpfpm_slow_requests %lu\n" + "# HELP phpfpm_memory_peak The memory usage peak since FPM has started.\n" + "# TYPE phpfpm_memory_peak gauge\n" + "phpfpm_memory_peak %zu\n" "# EOF\n"; has_start_time = 0; @@ -457,7 +464,8 @@ int fpm_status_handle_request(void) /* {{{ */ "total processes: %d\n" "max active processes: %d\n" "max children reached: %u\n" - "slow requests: %lu\n"; + "slow requests: %lu\n" + "memory peak: %zu\n"; if (full) { full_syntax = @@ -496,7 +504,8 @@ int fpm_status_handle_request(void) /* {{{ */ scoreboard_p->idle + scoreboard_p->active, scoreboard_p->active_max, scoreboard_p->max_children_reached, - scoreboard_p->slow_rq); + scoreboard_p->slow_rq, + scoreboard_p->memory_peak); } else { spprintf(&buffer, 0, short_syntax, scoreboard_p->pool, @@ -511,7 +520,8 @@ int fpm_status_handle_request(void) /* {{{ */ scoreboard_p->idle + scoreboard_p->active, scoreboard_p->active_max, scoreboard_p->max_children_reached, - scoreboard_p->slow_rq); + scoreboard_p->slow_rq, + scoreboard_p->memory_peak); } PUTS(buffer); diff --git a/sapi/fpm/tests/fpm_get_status_basic.phpt b/sapi/fpm/tests/fpm_get_status_basic.phpt index d72a1f4d70aca..e566bedd7b29d 100644 --- a/sapi/fpm/tests/fpm_get_status_basic.phpt +++ b/sapi/fpm/tests/fpm_get_status_basic.phpt @@ -39,7 +39,7 @@ $tester->close(); Done --EXPECTF-- Test Start -array(15) { +array(16) { ["pool"]=> string(10) "unconfined" ["process-manager"]=> @@ -68,6 +68,8 @@ array(15) { int(0) ["slow-requests"]=> int(0) + ["memory-peak"]=> + int(0) ["procs"]=> array(1) { [0]=> diff --git a/sapi/fpm/tests/status.inc b/sapi/fpm/tests/status.inc index dc07de563adbc..76ef7fd55e118 100644 --- a/sapi/fpm/tests/status.inc +++ b/sapi/fpm/tests/status.inc @@ -35,6 +35,7 @@ class Status 'max active processes' => '\d+', 'max children reached' => '\d+', 'slow requests' => '\d+', + 'memory peak' => '\d+', ]; /** @@ -266,6 +267,9 @@ class Status "# HELP phpfpm_slow_requests The number of requests that exceeded your 'request_slowlog_timeout' value\.\n" . "# TYPE phpfpm_slow_requests counter\n" . "phpfpm_slow_requests " . $fields['slow requests'] . "\n" . + "# HELP phpfpm_memory_peak The memory usage peak since FPM has started\.\n" . + "# TYPE phpfpm_memory_peak gauge\n" . + "phpfpm_memory_peak " . $fields['memory peak'] . "\n" . "# EOF)\n"; if (!preg_match($pattern, $body)) {