-#! /usr/bin/perl\r
-\r
-# ------------------------------------------------\r
-# Copyright 2014 AT&T Intellectual Property\r
-# Licensed under the Apache License, Version 2.0 (the "License");\r
-# you may not use this file except in compliance with the License.\r
-# You may obtain a copy of the License at\r
-#\r
-# http://www.apache.org/licenses/LICENSE-2.0\r
-#\r
-# Unless required by applicable law or agreed to in writing, software\r
-# distributed under the License is distributed on an "AS IS" BASIS,\r
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-# See the License for the specific language governing permissions and\r
-# limitations under the License.\r
-# -------------------------------------------\r
-\r
-use English;\r
-\r
-$interval = 10;\r
-$to_tty = 0;\r
-if(scalar(@ARGV)>0){\r
- if(int($ARGV[0])>0){\r
- $interval = int($ARGV[0]);\r
- }else{\r
- if($ARGV[0] eq '-'){\r
- $to_tty = 1;\r
- }else{\r
- print STDERR "Argument 1 ($ARGV[0]) ignored.\n";\r
- } \r
- }\r
-}\r
-if(scalar(@ARGV)>1){\r
- if(int($ARGV[1])>0){\r
- $interval = int($ARGV[1]);\r
- }else{\r
- if($ARGV[1] eq '-'){\r
- $to_tty = 1;\r
- }else{\r
- print STDERR "Argument 2 ($ARGV[1]) ignored.\n";\r
- } \r
- }\r
-}\r
-if(scalar(@ARGV)>2){\r
- print STDERR "Only 2 arguments accepted, additional args ignored.\n";\r
-}\r
-\r
-open O, ">resource_log.csv" or die "Can't open resource_log.csv\n";\r
-\r
-\r
-\r
-# get the page size\r
-open I,"getconf PAGESIZE |";\r
-$line=<I>;\r
-chomp($line);\r
-$pagesize = int($line);\r
-close(I);\r
-\r
-\r
-$effective_uid = $REAL_USER_ID;\r
-$ps_cmd = "ps -U $effective_uid |";\r
-\r
-%hfta_pid=();\r
-\r
-open P,$ps_cmd;\r
-while($line=<P>){\r
- chomp($line);\r
- $line =~ s/^\s+//;\r
- @flds = split /\s+/,$line;\r
- if($flds[3] =~ /rts/){\r
- push @rts_pids,int($flds[0]);\r
- }\r
- if($flds[3] =~ /hfta_(\d+)/){\r
- $hfta_pid{$1} = int($flds[0]);\r
- }\r
-}\r
-\r
-$rts_pids = sort {$a<=>$b} @rts_pids;\r
-\r
-$now=time();\r
-print O "START monitoring at time $now\n";\r
-print O "ts,proc,pid,utime,stime,vm_size,rss,pagesize\n";\r
-if(to_tty){\r
- print "START monitoring at time $now\n";\r
- print "ts,proc,pid,utime,stime,vm_size,rss,pagesize\n";\r
-}\r
-#print "RTS PIDs:\n";\r
-#foreach $p (@rts_pids){\r
-# print "$p ";\r
-#}\r
-#print "\nHFTA PIDs:\n";\r
-# foreach $h (sort {$a<=>$b} keys(%hfta_pid)){\r
-# print "($h,",$hfta_pid{$h},") ";\r
-#}\r
-#print "\n";\r
-\r
-while(1){\r
- $now=time();\r
- foreach $p (@rts_pids){\r
- get_proc_stats($p);\r
- print O "$now,rts,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";\r
- if(to_tty){\r
- print "$now,rts,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";\r
- }\r
- }\r
- foreach $h (sort {$a<=>$b} keys(%hfta_pid)){\r
- $p=$hfta_pid{$h};\r
- get_proc_stats($p);\r
- print O "$now,hfta_$h,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";\r
- if(to_tty){\r
- print "$now,hfta_$h,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";\r
- }\r
- }\r
-\r
- sleep($interval);\r
-}\r
-\r
-\r
-\r
-sub get_proc_stats{\r
-my $pid = shift;\r
-my $line;\r
-my @flds;\r
-my $pos;\r
-\r
-\r
-open I_PROC_STATS,"/proc/$pid/stat";\r
-\r
-$line=<I_PROC_STATS>;\r
-close I_PROC_STATS;\r
-\r
-#print "getstats($pid): $line\n";\r
-\r
-chomp($line);\r
-@flds = split / +/,$line;\r
-\r
-$pos=0;\r
-$pid = $flds[$pos]; $pos++;\r
-$fname = $flds[$pos]; $pos++;\r
-$state = $flds[$pos]; $pos++;\r
-$pppid = $flds[$pos]; $pos++;\r
-$pgrp = $flds[$pos]; $pos++;\r
-$session = $flds[$pos]; $pos++;\r
-$tty_n = $flds[$pos]; $pos++;\r
-$tpgid = $flds[$pos]; $pos++;\r
-$flags = $flds[$pos]; $pos++;\r
-$minor_faults = $flds[$pos]; $pos++;\r
-$child_minor_faults = $flds[$pos]; $pos++;\r
-$major_faults = $flds[$pos0]; $pos++;\r
-$child_major_faults = $flds[$pos0]; $pos++;\r
-$user_time = $flds[$pos]; $pos++;\r
-$sys_time = $flds[$pos]; $pos++;\r
-$child_user_time = $flds[$pos]; $pos++;\r
-$child_sys_time = $flds[$pos]; $pos++;\r
-$priority = $flds[$pos]; $pos++;\r
-$nice = $flds[$pos]; $pos++;\r
-$num_threads = $flds[$pos]; $pos++;\r
-$interval_timer_realvalue = $flds[$pos]; $pos++;\r
-$start_time = $flds[$pos]; $pos++;\r
-$vm_size = $flds[$pos]; $pos++;\r
-$resident_set_size = $flds[$pos]; $pos++;\r
-$rss_limit = $flds[$pos]; $pos++;\r
-$startcode = $flds[$pos]; $pos++;\r
-$endcode = $flds[$pos]; $pos++;\r
-$startstack = $flds[$pos]; $pos++;\r
-$curr_kernel_stack_ptr = $flds[$pos]; $pos++;\r
-$curr_instruction_ptr = $flds[$pos]; $pos++;\r
-$signal = $flds[$pos]; $pos++;\r
-$sigblocked = $flds[$pos]; $pos++;\r
-$sigignore = $flds[$pos]; $pos++;\r
-$wchan = $flds[$pos]; $pos++;\r
-$nswap = $flds[$pos]; $pos++;\r
-$exit_signal = $flds[$pos]; $pos++;\r
-$processor = $flds[$pos]; $pos++;\r
-$rt_priority = $flds[$pos]; $pos++;\r
-$policy = $flds[$pos]; $pos++;\r
-$aggr_block_io_delays = $flds[$pos]; $pos++;\r
-$guest_time = $flds[$pos]; $pos++;\r
-$cguest_time = $flds[$pos]; $pos++;\r
-}\r
+#! /usr/bin/perl
+
+# ------------------------------------------------
+# Copyright 2014 AT&T Intellectual Property
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -------------------------------------------
+
+use English;
+
+$interval = 10;
+$to_tty = 0;
+if(scalar(@ARGV)>0){
+ if(int($ARGV[0])>0){
+ $interval = int($ARGV[0]);
+ }else{
+ if($ARGV[0] eq '-'){
+ $to_tty = 1;
+ }else{
+ print STDERR "Argument 1 ($ARGV[0]) ignored.\n";
+ }
+ }
+}
+if(scalar(@ARGV)>1){
+ if(int($ARGV[1])>0){
+ $interval = int($ARGV[1]);
+ }else{
+ if($ARGV[1] eq '-'){
+ $to_tty = 1;
+ }else{
+ print STDERR "Argument 2 ($ARGV[1]) ignored.\n";
+ }
+ }
+}
+if(scalar(@ARGV)>2){
+ print STDERR "Only 2 arguments accepted, additional args ignored.\n";
+}
+
+open O, ">resource_log.csv" or die "Can't open resource_log.csv\n";
+
+
+
+# get the page size
+open I,"getconf PAGESIZE |";
+$line=<I>;
+chomp($line);
+$pagesize = int($line);
+close(I);
+
+
+$effective_uid = $REAL_USER_ID;
+$ps_cmd = "ps -U $effective_uid |";
+
+%hfta_pid=();
+
+open P,$ps_cmd;
+while($line=<P>){
+ chomp($line);
+ $line =~ s/^\s+//;
+ @flds = split /\s+/,$line;
+ if($flds[3] =~ /rts/){
+ push @rts_pids,int($flds[0]);
+ }
+ if($flds[3] =~ /hfta_(\d+)/){
+ $hfta_pid{$1} = int($flds[0]);
+ }
+}
+
+$rts_pids = sort {$a<=>$b} @rts_pids;
+
+$now=time();
+print O "START monitoring at time $now\n";
+print O "ts,proc,pid,utime,stime,vm_size,rss,pagesize\n";
+if(to_tty){
+ print "START monitoring at time $now\n";
+ print "ts,proc,pid,utime,stime,vm_size,rss,pagesize\n";
+}
+#print "RTS PIDs:\n";
+#foreach $p (@rts_pids){
+# print "$p ";
+#}
+#print "\nHFTA PIDs:\n";
+# foreach $h (sort {$a<=>$b} keys(%hfta_pid)){
+# print "($h,",$hfta_pid{$h},") ";
+#}
+#print "\n";
+
+while(1){
+ $now=time();
+ foreach $p (@rts_pids){
+ get_proc_stats($p);
+ print O "$now,rts,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";
+ if(to_tty){
+ print "$now,rts,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";
+ }
+ }
+ foreach $h (sort {$a<=>$b} keys(%hfta_pid)){
+ $p=$hfta_pid{$h};
+ get_proc_stats($p);
+ print O "$now,hfta_$h,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";
+ if(to_tty){
+ print "$now,hfta_$h,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";
+ }
+ }
+
+ sleep($interval);
+}
+
+
+
+sub get_proc_stats{
+my $pid = shift;
+my $line;
+my @flds;
+my $pos;
+
+
+open I_PROC_STATS,"/proc/$pid/stat";
+
+$line=<I_PROC_STATS>;
+close I_PROC_STATS;
+
+#print "getstats($pid): $line\n";
+
+chomp($line);
+@flds = split / +/,$line;
+
+$pos=0;
+$pid = $flds[$pos]; $pos++;
+$fname = $flds[$pos]; $pos++;
+$state = $flds[$pos]; $pos++;
+$pppid = $flds[$pos]; $pos++;
+$pgrp = $flds[$pos]; $pos++;
+$session = $flds[$pos]; $pos++;
+$tty_n = $flds[$pos]; $pos++;
+$tpgid = $flds[$pos]; $pos++;
+$flags = $flds[$pos]; $pos++;
+$minor_faults = $flds[$pos]; $pos++;
+$child_minor_faults = $flds[$pos]; $pos++;
+$major_faults = $flds[$pos0]; $pos++;
+$child_major_faults = $flds[$pos0]; $pos++;
+$user_time = $flds[$pos]; $pos++;
+$sys_time = $flds[$pos]; $pos++;
+$child_user_time = $flds[$pos]; $pos++;
+$child_sys_time = $flds[$pos]; $pos++;
+$priority = $flds[$pos]; $pos++;
+$nice = $flds[$pos]; $pos++;
+$num_threads = $flds[$pos]; $pos++;
+$interval_timer_realvalue = $flds[$pos]; $pos++;
+$start_time = $flds[$pos]; $pos++;
+$vm_size = $flds[$pos]; $pos++;
+$resident_set_size = $flds[$pos]; $pos++;
+$rss_limit = $flds[$pos]; $pos++;
+$startcode = $flds[$pos]; $pos++;
+$endcode = $flds[$pos]; $pos++;
+$startstack = $flds[$pos]; $pos++;
+$curr_kernel_stack_ptr = $flds[$pos]; $pos++;
+$curr_instruction_ptr = $flds[$pos]; $pos++;
+$signal = $flds[$pos]; $pos++;
+$sigblocked = $flds[$pos]; $pos++;
+$sigignore = $flds[$pos]; $pos++;
+$wchan = $flds[$pos]; $pos++;
+$nswap = $flds[$pos]; $pos++;
+$exit_signal = $flds[$pos]; $pos++;
+$processor = $flds[$pos]; $pos++;
+$rt_priority = $flds[$pos]; $pos++;
+$policy = $flds[$pos]; $pos++;
+$aggr_block_io_delays = $flds[$pos]; $pos++;
+$guest_time = $flds[$pos]; $pos++;
+$cguest_time = $flds[$pos]; $pos++;
+}