Commit cdbf3677 authored by Rainer Jung's avatar Rainer Jung
Browse files

mod_status: Cumulate CPU time of exited child

processes in the "cu" and "cs" values.
Add CPU time of the parent process to the
"c" and "s" values.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1837595 13f79535-47bb-0310-9956-ffa450edef68
parent d92bd811
Loading
Loading
Loading
Loading
+5 −0
Changes for CHANGES: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
                                                         -*- coding: utf-8 -*-
Changes with Apache 2.5.1

  *) mod_status: Cumulate CPU time of exited child processes in the
     "cu" and "cs" values. Add CPU time of the parent process to the
     "c" and "s" values.
     [Rainer Jung]

  *) mod_status: Add cumulated response duration time in milliseconds.
     [Rainer Jung]

+4 −1
Changes for include/ap_mmn.h: 4 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -591,6 +591,9 @@
 * 20180720.3 (2.5.1-dev)  Add client64 to worker_share
 * 20180720.4 (2.5.1-dev)  Add new duration field to worker_score struct in
 *                         scoreboard.h
 * 20180720.5 (2.5.1-dev)  Add new ap_update_global_status() method and
 *                         times field in the global_score structure in
 *                         scoreboard.h.
 *
 */

@@ -599,7 +602,7 @@
#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20180720
#endif
#define MODULE_MAGIC_NUMBER_MINOR 4                 /* 0...n */
#define MODULE_MAGIC_NUMBER_MINOR 5                 /* 0...n */

/**
 * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
+5 −0
Changes for include/scoreboard.h: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -127,6 +127,9 @@ typedef struct {
                                         * should still be serving requests.
                                         */
    apr_time_t restart_time;
#ifdef HAVE_TIMES
    struct tms times;
#endif
} global_score;

/* stuff which the parent generally writes and the children rarely read */
@@ -193,6 +196,8 @@ AP_DECLARE(int) ap_update_child_status_descr(ap_sb_handle_t *sbh, int status, co

AP_DECLARE(void) ap_time_process_request(ap_sb_handle_t *sbh, int status);

AP_DECLARE(int) ap_update_global_status(void);

AP_DECLARE(worker_score *) ap_get_scoreboard_worker(ap_sb_handle_t *sbh);

/** Return a pointer to the worker_score for a given child, thread pair.
+29 −13
Changes for modules/generators/mod_status.c: 29 added lines, 13 removed lines.
Original line number Diff line number Diff line
@@ -197,6 +197,7 @@ static int status_handler(request_rec *r)
    apr_time_t duration_slot;
    int short_report;
    int no_table_report;
    global_score *global_record;
    worker_score *ws_record;
    process_score *ps_record;
    char *stat_buffer;
@@ -204,6 +205,7 @@ static int status_handler(request_rec *r)
    int *thread_idle_buffer = NULL;
    int *thread_busy_buffer = NULL;
    clock_t tu, ts, tcu, tcs;
    clock_t gu, gs, gcu, gcs;
    ap_generation_t mpm_generation, worker_generation;
#ifdef HAVE_TIMES
    float tick;
@@ -238,6 +240,12 @@ static int status_handler(request_rec *r)
    short_report = 0;
    no_table_report = 0;

    if (!ap_exists_scoreboard_image()) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01237)
                      "Server status unavailable in inetd mode");
        return HTTP_INTERNAL_SERVER_ERROR;
    }

    pid_buffer = apr_palloc(r->pool, server_limit * sizeof(pid_t));
    stat_buffer = apr_palloc(r->pool, server_limit * thread_limit * sizeof(char));
    if (is_async) {
@@ -246,14 +254,17 @@ static int status_handler(request_rec *r)
    }

    nowtime = apr_time_now();
#ifdef HAVE_TIMES
    global_record = ap_get_scoreboard_global();
    gu = global_record->times.tms_utime;
    gs = global_record->times.tms_stime;
    gcu = global_record->times.tms_cutime;
    gcs = global_record->times.tms_cstime;
#else
    gu = gs = gcu = gcs = 0;
#endif
    tu = ts = tcu = tcs = 0;

    if (!ap_exists_scoreboard_image()) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01237)
                      "Server status unavailable in inetd mode");
        return HTTP_INTERNAL_SERVER_ERROR;
    }

    r->allowed = (AP_METHOD_BIT << M_GET);
    if (r->method_number != M_GET)
        return DECLINED;
@@ -463,6 +474,7 @@ static int status_handler(request_rec *r)
    }

    if (ap_extended_status) {
        clock_t cpu = gu + gs + gcu + gcs + tu + ts + tcu + tcs;
        if (short_report) {
            ap_rprintf(r, "Total Accesses: %lu\nTotal kBytes: %"
                       APR_OFF_T_FMT "\nTotal Duration: %"
@@ -472,11 +484,11 @@ static int status_handler(request_rec *r)
#ifdef HAVE_TIMES
            /* Allow for OS/2 not having CPU stats */
            ap_rprintf(r, "CPUUser: %g\nCPUSystem: %g\nCPUChildrenUser: %g\nCPUChildrenSystem: %g\n",
                       tu / tick, ts / tick, tcu / tick, tcs / tick);
                       (gu + tu) / tick, (gs + ts) / tick, (gcu + tcu) / tick, (gcs + tcs) / tick);

            if (ts || tu || tcu || tcs)
            if (cpu)
                ap_rprintf(r, "CPULoad: %g\n",
                           (tu + ts + tcu + tcs) / tick / up_time * 100.);
                           cpu / tick / up_time * 100.);
#endif

            ap_rprintf(r, "Uptime: %ld\n", (long) (up_time));
@@ -502,15 +514,18 @@ static int status_handler(request_rec *r)
#ifdef HAVE_TIMES
            /* Allow for OS/2 not having CPU stats */
            ap_rprintf(r, "<dt>CPU Usage: u%g s%g cu%g cs%g",
                       tu / tick, ts / tick, tcu / tick, tcs / tick);
                       (gu + tu) / tick, (gs + ts) / tick, (gcu + tcu) / tick, (gcs + tcs) / tick);

            if (ts || tu || tcu || tcs)
            if (cpu)
                ap_rprintf(r, " - %.3g%% CPU load</dt>\n",
                           (tu + ts + tcu + tcs) / tick / up_time * 100.);
                           cpu / tick / up_time * 100.);
            else
                ap_rputs("</dt>\n", r);
#endif

            ap_rputs("<dt>", r);
            if (up_time > 0) {
                ap_rprintf(r, "<dt>%.3g requests/sec - ",
                ap_rprintf(r, "%.3g requests/sec - ",
                           (float) count / (float) up_time);

                format_byte_out(r, (unsigned long)(KBYTE * (float) kbcount
@@ -519,6 +534,7 @@ static int status_handler(request_rec *r)
            }

            if (count > 0) {
                if (up_time > 0)
                    ap_rputs(" - ", r);
                format_byte_out(r, (unsigned long)(KBYTE * (float) kbcount
                                                   / (float) count));
+3 −0
Changes for server/mpm_common.c: 3 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -211,6 +211,8 @@ AP_DECLARE(void) ap_wait_or_timeout(apr_exit_why_e *status, int *exitcode,
    }

    rv = apr_proc_wait_all_procs(ret, exitcode, status, APR_NOWAIT, p);
    ap_update_global_status();

    if (APR_STATUS_IS_EINTR(rv)) {
        ret->pid = -1;
        return;
@@ -534,6 +536,7 @@ void ap_core_child_status(server_rec *s, pid_t pid,
        ++cur->active;
        break;
    case MPM_CHILD_EXITED:
        ap_update_global_status();
        status_msg = "exited";
        if (cur == APR_RING_SENTINEL(geninfo, mpm_gen_info_t, link)) {
            ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, APLOGNO(00546)
Loading