httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mathieu CARBONNEAUX" <>
Subject About mod_status and the use of ‘times’ function information to calculated the apache instance cpu load…
Date Thu, 12 Aug 2010 23:59:28 GMT

I’m working on more instrumentation oriented version of mod_status module and i found a
problem on ‘times’ function use...

Actualy each worker update ‘worker_score->times’ struct at each connection.
When the child process die, at the next request of a new child with the same worker position
this value are reinitialised to zero in scoreboard…

This ‘times’ value are the cumulated consumed cpu used time (number of tick used from
the processus start) from start of the processus, to calculate the cpu percent used you must
know the real execution time (processus uptime) of the process who consumed this cpu time…

But… Actualy in the scoreboard you have only the last request time  (apr_time_t worker_score->stop/start)
and the instances uptime (now time– globale_score->restart_time)… not the processus
uptime (now time – child restart time)…

Actualy the cpu load of apache instance is calculated on comulated of all worker/child cpu
tick of the apache instance divide by the apache instante up times…
But this up time that are not the cumulated real execution time (uptime of each worker/child)
of all active worker/child but the up time of the apache instance !!!

With that way of calculating, more the apache instance run are long more this load are completely
Exemple : apache 3h of 70% cpu load for one day apache running ~= 9% of apache instance cpu
load at the end of the day… 

An apache instance are not using CPU a the same load all the time, they depand on the client
request demand ! What is more interesting is to detect when the cpu load is high !
With that way of calulating the load you don’t be able to see this instant load and you
are no be abel to detect this apache instance high cpu load!

-> The first solution i imagine : is to adding a new field (ex : apr_time_t worker_score->restart_time)
on scoreboard ‘worker_score’ structure that are updated at child start, in child_init
(ap_logs_child_init in log.c) phase or in ap_update_child_status_from_indexes (scoreboard.c)
 with status SERVER_STARTING.

-> The seconde solution (more advanced/complex) : is to adding also a new field (ex : apr_time_t
worker_score->last_update_time) that are updated at now time at each ‘times’ is call
in ‘ap_update_child_status_from_indexes’ function. And store now the ‘times’ <delta>
(now ‘times’ – worker_score->times) in a new field worker_score->times_delta.
With that you are abel to musurate more instantaneous apache cpu load… But you add two new
field and one apr_time_now call at each ‘times’ call in ‘ap_update_child_status_from_indexes’

Without one of this solution the call to ‘times’ function in scoreboard are actualy completly

And to have real total cpu load from apache instance start, they need to add a new field (ex
: worker_score->total_times) (like access_count and bytes_served field) in worker_score
that to be updated at worker ending (in ap_update_child_status_from_indexes(scoreboard.c)
at status SERVER_DEAD or SERVER_GRACEFUL ?!) to commulated in, the last ‘times’ value.

Any other sugestion/remark/question ?! 

If your ok with thats modifications, i can do a patch proposal for that.

Best regard,

View raw message