summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Guittot <vincent.guittot@linaro.org>2015-06-08 17:42:57 +0200
committerVincent Guittot <vincent.guittot@linaro.org>2015-06-08 17:42:57 +0200
commita31832b7aec6098e77368ed47c578db25b964b3b (patch)
tree9ce715e4c419116ccf8b25dfe091210bece47017
parentb50dd8f780b569fdaf1b1f7a0dffa5a8c81b3ead (diff)
cpuload: fix thread load parsing
-rwxr-xr-xcpuload.pl85
1 files changed, 50 insertions, 35 deletions
diff --git a/cpuload.pl b/cpuload.pl
index 02bfb79..254b349 100755
--- a/cpuload.pl
+++ b/cpuload.pl
@@ -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);