Re: [PATCH] ftrace: fix stddev calculation in function profiler (again)

From: Matthias Schiffer
Date: Tue Mar 27 2018 - 10:51:57 EST


On 03/26/2018 06:51 PM, Steven Rostedt wrote:
> On Sat, 24 Mar 2018 17:26:38 +0100
> Matthias Schiffer <mschiffer@xxxxxxxxxxxxxxxxxxxx> 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:
>


Attachment: signature.asc
Description: OpenPGP digital signature