diff options
author | Vincent Guittot <vincent.guittot@linaro.org> | 2015-06-08 17:42:57 +0200 |
---|---|---|
committer | Vincent Guittot <vincent.guittot@linaro.org> | 2015-06-08 17:42:57 +0200 |
commit | a31832b7aec6098e77368ed47c578db25b964b3b (patch) | |
tree | 9ce715e4c419116ccf8b25dfe091210bece47017 | |
parent | b50dd8f780b569fdaf1b1f7a0dffa5a8c81b3ead (diff) |
cpuload: fix thread load parsing
-rwxr-xr-x | cpuload.pl | 85 |
1 files changed, 50 insertions, 35 deletions
@@ -71,25 +71,25 @@ if (defined $options{h}) { exit; } -my $start_idle = 0; -my $end_idle = 0; -my $idle = 0; +my $start_thread = 0; +my $end_thread = 0; +my $runtime = 0; if ($PID != 0) { $filter1 = '-'.$PID; $filter2 = ':'.$PID; } -sub enter_idle +sub enter_thread() { - $start_idle = $date; + $start_thread = $date; } -sub exit_idle() +sub exit_thread() { - $end_idle = $date; - $idle = $end_idle - $start_idle + $idle; - $start_idle = $end_idle + $end_thread = $date; + $runtime = $end_thread - $start_thread + $runtime; + $start_thread = $end_thread } sub parse_one_cpu @@ -99,15 +99,14 @@ sub parse_one_cpu my $backward = 0; - $start_idle = 0; - $end_idle = 0; - $idle = 0; - $idle_win = 0; + $runtime = 0; + $run_win = 0; my $line = `head -n 1 $TMP`; my @arr = split(/ /, $line); my $beg = $arr[1]; - $start_idle = $beg; + $start_thread = $beg; + $end_thread = $beg; $date = $beg; $start_win = $beg; @@ -148,62 +147,78 @@ sub parse_one_cpu $cmd = $arr[2]; $arg = $arr[3]; -# print "$line : $date ; $cmd ; $arg ;\n"; + # print "$line : $date ; $cmd ; $arg ;\n"; switch ($cmd) { - case (/.*_exit/) { enter_idle } - case (/.*_entry/) { exit_idle } - case ("sched_switch") { + case (/_start/) { enter_thread } + case (/_end/) { + if ($end_thread > $start_thread) { + exit_thread; + } + + } + case (/.*_exit/) { enter_thread } + case (/.*_entry/) { exit_thread } + case ("sched_switch") { switch ($line) { - case (/<idle>/) { enter_idle } - case (/.*==> .*$PID.*/) { enter_idle } - case (/.*==> next_comm=.*$PID.*/) { enter_idle } - else { exit_idle } + case (/<idle>/) { enter_thread } + case (/.*==> .*$PID.*/) { enter_thread } + case (/.*==> next_comm=.*$PID.*/) { enter_thread } + else { exit_thread } } } case ("cpu_idle") { switch ($line) { - case (/state=4294967295/) { exit_idle } - else { enter_idle } + case (/state=4294967295/) { exit_thread } + else { enter_thread } } } case ("==>") { switch ($line) { - case (/<idle>/) { enter_idle } - else { exit_idle } + case (/<idle>/) { enter_thread } + else { exit_thread } } } else { printf "previous case not true %s \n", $line } } -# printf "%.6f : %s", $idle, $line; + #printf "%.6f : %s", $runtime, $line; my $total = $date - $beg; if ($total) { - $load = 100 * (1 - $idle / $total); + $load = 100 * $runtime / $total; + if ($PID == 0) { + $load = 100 - $load; + } } $cur_line = $cur_line + 1; if ($DISP == 0) { printf "CPU%d : load %.1f\% : analysed %.1f\%\r", $CPU, $load, 100*$cur_line/$nb_line; } elsif (($date - $start_win) > $WIN) { - $load_win = 100 * (1 - ($idle - $idle_win) / ($date - $start_win)); + $load_win = 100 * (($runtime - $run_win) / ($date - $start_win)); + if ($PID == 0) { + $load_win = 100 - $load_win; + } if ($GRAPH) { printf "%.0f %.0f\n", ($start_win - $beg)*1000, $load_win; } else { printf "CPU%d : load win %.1f\% : analysed %.1f\%\r", $CPU, $load_win, 100*$cur_line/$nb_line; } - $idle_win = $idle; + $run_win = $runtime; $start_win = $date; } } my $total = $end - $beg; $total = $total * 1000; - $idle = $idle * 1000; + $runtime = $runtime * 1000; if ($GRAPH == 0) { if ($total != 0) { - printf "CPU%d : idle %.3f ms / total %.3f ms\n",$CPU, $idle, $total; - my $load = 100 * (1 - $idle / $total); + printf "CPU%d : idle %.3f ms / total %.3f ms\n",$CPU, $runtime, $total; + my $load = 100 * ($runtime / $total); + if ($PID == 0) { + $load = 100 - $load; + } printf "CPU%d : load %.1f\%\n", $CPU, $load ; } else { print "CPU$CPU : no trace\n"; @@ -237,12 +252,12 @@ foreach (@ARGV) else { $CMD = "trace-cmd report -i $FILE 2> /dev/null | grep -e '$filter1' -e '$filter2' | grep -e 'switch' -e 'irq.*_entry' -e 'irq.*_exit' | awk 'BEGIN{FIELDWIDTHS=\"23 5 14 22 100\"}{print \$2, \$3, \$4, \$5}' | sed 's/ */ /g' | sed -e 's/^ //' | sed 's/://g' > $DATA;"} } - print "$CMD\n"; +# print "$CMD\n"; system($CMD); for ($i = 0; $i < $NR; $i = $i + 1) { my $TMP = "cpuload-$rand-cpu$i.txt"; - $CMD = "head -n 1 $DATA | awk '{ print \$1, \$2, \"_exit\"}' > $TMP; grep -e '\\[00$i\\]' $DATA >> $TMP; tail -n 1 $DATA | awk '{ print \$1, \$2, \"_entry\"}' >> $TMP; "; + $CMD = "head -n 1 $DATA | awk '{ print \$1, \$2, \"_start\"}' > $TMP; grep -e '\\[00$i\\]' $DATA >> $TMP; tail -n 1 $DATA | awk '{ print \$1, \$2, \"_end\"}' >> $TMP; "; # print "$CMD\n"; system($CMD); |