lkml.org 
[lkml]   [2018]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH] ftrace: fix stddev calculation in function profiler (again)
From
Date
On 03/26/2018 06:51 PM, Steven Rostedt wrote:
> On Sat, 24 Mar 2018 17:26:38 +0100
> Matthias Schiffer <mschiffer@universe-factory.net> wrote:
>
>> @@ -905,8 +898,20 @@ static void profile_graph_return(struct ftrace_graph_ret *trace)
>>
>> rec = ftrace_find_profiled_func(stat, trace->func);
>> if (rec) {
>> + unsigned long long avg, delta1, delta2;
>> +
>> rec->time += calltime;
>> - rec->time_squared += calltime * calltime;
>> +
>> + /* Apply Welford's method */
>> + delta1 = calltime - rec->avg;
>> +
>> + avg = rec->time;
>> + do_div(avg, rec->counter);
>
> Can you find a way not to do a divide in every function call?

I think the current method based on the sum of squares is the best we can
do without a divide for each sample. The completely bogus result

nf_conntrack_proto_fini 50 373.523 us 7.470 us 3234315951 us

I mentioned in my commit message was caused by the second MIPS-specific
issue I mentioned in my last mail, so while this method may lead to
inaccurate results [1], and it is certainly not Welford's method, it might
be good enough in practice, and you can disregard my patch.

Matthias


[1]
http://jonisalonen.com/2013/deriving-welfords-method-for-computing-variance/


>
> -- Steve
>
>> + rec->avg = avg;
>> +
>> + delta2 = calltime - rec->avg;
>> +
>> + rec->stddev += delta1 * delta2;
>> }
>>
>> out:
>


[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2018-03-27 16:52    [W:0.082 / U:5.956 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site