During ap_process_request(), ap_process_async_request() is called which at start sets the request start time using: ap_time_process_request(r->connection->sbh, START_PREQUEST); At the end it increases the worker duration with the difference between the time set using START_PREQUEST and STOP_PREQUEST ap_time_process_request(c->sbh, STOP_PREQUEST); Now back to ap_process_request() which also increases the duration, using the the same START_PREQUEST ap_time_process_request(c->sbh, STOP_PREQUEST); thus the time spent inside ap_process_async_request() is doubled(in. The code that sets the duration is this(scoreboard.c): if (status == START_PREQUEST) { ws->start_time = ws->last_used = apr_time_now(); } else if (status == STOP_PREQUEST) { ws->stop_time = ws->last_used = apr_time_now(); if (ap_extended_status) { ws->duration += ws->stop_time - ws->start_time; }