Added quantiling UDAFs
[com/gs-lite.git] / bin / monitor_gs.pl
1 #! /usr/bin/perl\r
2 \r
3 # ------------------------------------------------\r
4 #   Copyright 2014 AT&T Intellectual Property\r
5 #   Licensed under the Apache License, Version 2.0 (the "License");\r
6 #   you may not use this file except in compliance with the License.\r
7 #   You may obtain a copy of the License at\r
8 #\r
9 #     http://www.apache.org/licenses/LICENSE-2.0\r
10 #\r
11 #   Unless required by applicable law or agreed to in writing, software\r
12 #   distributed under the License is distributed on an "AS IS" BASIS,\r
13 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14 #   See the License for the specific language governing permissions and\r
15 #   limitations under the License.\r
16 # -------------------------------------------\r
17 \r
18 use English;\r
19 \r
20 $interval = 10;\r
21 $to_tty = 0;\r
22 if(scalar(@ARGV)>0){\r
23         if(int($ARGV[0])>0){\r
24                 $interval = int($ARGV[0]);\r
25         }else{\r
26                 if($ARGV[0] eq '-'){\r
27                         $to_tty = 1;\r
28                 }else{\r
29                         print STDERR "Argument 1 ($ARGV[0]) ignored.\n";\r
30                 }       \r
31         }\r
32 }\r
33 if(scalar(@ARGV)>1){\r
34         if(int($ARGV[1])>0){\r
35                 $interval = int($ARGV[1]);\r
36         }else{\r
37                 if($ARGV[1] eq '-'){\r
38                         $to_tty = 1;\r
39                 }else{\r
40                         print STDERR "Argument 2 ($ARGV[1]) ignored.\n";\r
41                 }       \r
42         }\r
43 }\r
44 if(scalar(@ARGV)>2){\r
45         print STDERR "Only 2 arguments accepted, additional args ignored.\n";\r
46 }\r
47 \r
48 open O, ">resource_log.csv" or die "Can't open resource_log.csv\n";\r
49 \r
50 \r
51 \r
52 # get the page size\r
53 open I,"getconf PAGESIZE |";\r
54 $line=<I>;\r
55 chomp($line);\r
56 $pagesize = int($line);\r
57 close(I);\r
58 \r
59 \r
60 $effective_uid = $REAL_USER_ID;\r
61 $ps_cmd = "ps -U $effective_uid |";\r
62 \r
63 %hfta_pid=();\r
64 \r
65 open P,$ps_cmd;\r
66 while($line=<P>){\r
67         chomp($line);\r
68         $line =~ s/^\s+//;\r
69         @flds = split /\s+/,$line;\r
70         if($flds[3] =~ /rts/){\r
71                 push @rts_pids,int($flds[0]);\r
72         }\r
73         if($flds[3] =~ /hfta_(\d+)/){\r
74                 $hfta_pid{$1} = int($flds[0]);\r
75         }\r
76 }\r
77 \r
78 $rts_pids = sort {$a<=>$b} @rts_pids;\r
79 \r
80 $now=time();\r
81 print O "START monitoring at time $now\n";\r
82 print O "ts,proc,pid,utime,stime,vm_size,rss,pagesize\n";\r
83 if(to_tty){\r
84         print "START monitoring at time $now\n";\r
85         print "ts,proc,pid,utime,stime,vm_size,rss,pagesize\n";\r
86 }\r
87 #print "RTS PIDs:\n";\r
88 #foreach $p (@rts_pids){\r
89 #       print "$p ";\r
90 #}\r
91 #print "\nHFTA PIDs:\n";\r
92 #  foreach $h (sort {$a<=>$b} keys(%hfta_pid)){\r
93 #       print "($h,",$hfta_pid{$h},") ";\r
94 #}\r
95 #print "\n";\r
96 \r
97 while(1){\r
98         $now=time();\r
99         foreach $p (@rts_pids){\r
100                 get_proc_stats($p);\r
101                 print O "$now,rts,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";\r
102                 if(to_tty){\r
103                         print "$now,rts,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";\r
104                 }\r
105         }\r
106         foreach $h (sort {$a<=>$b} keys(%hfta_pid)){\r
107                 $p=$hfta_pid{$h};\r
108                 get_proc_stats($p);\r
109                 print O "$now,hfta_$h,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";\r
110                 if(to_tty){\r
111                         print "$now,hfta_$h,$p,$user_time,$sys_time,$vm_size,$resident_set_size,$pagesize\n";\r
112                 }\r
113         }\r
114 \r
115         sleep($interval);\r
116 }\r
117 \r
118 \r
119 \r
120 sub get_proc_stats{\r
121 my $pid = shift;\r
122 my $line;\r
123 my @flds;\r
124 my $pos;\r
125 \r
126 \r
127 open I_PROC_STATS,"/proc/$pid/stat";\r
128 \r
129 $line=<I_PROC_STATS>;\r
130 close I_PROC_STATS;\r
131 \r
132 #print "getstats($pid): $line\n";\r
133 \r
134 chomp($line);\r
135 @flds = split / +/,$line;\r
136 \r
137 $pos=0;\r
138 $pid = $flds[$pos]; $pos++;\r
139 $fname = $flds[$pos]; $pos++;\r
140 $state = $flds[$pos]; $pos++;\r
141 $pppid = $flds[$pos]; $pos++;\r
142 $pgrp = $flds[$pos]; $pos++;\r
143 $session = $flds[$pos]; $pos++;\r
144 $tty_n = $flds[$pos]; $pos++;\r
145 $tpgid = $flds[$pos]; $pos++;\r
146 $flags = $flds[$pos]; $pos++;\r
147 $minor_faults = $flds[$pos]; $pos++;\r
148 $child_minor_faults = $flds[$pos]; $pos++;\r
149 $major_faults = $flds[$pos0]; $pos++;\r
150 $child_major_faults = $flds[$pos0]; $pos++;\r
151 $user_time = $flds[$pos]; $pos++;\r
152 $sys_time = $flds[$pos]; $pos++;\r
153 $child_user_time = $flds[$pos]; $pos++;\r
154 $child_sys_time = $flds[$pos]; $pos++;\r
155 $priority = $flds[$pos]; $pos++;\r
156 $nice = $flds[$pos]; $pos++;\r
157 $num_threads = $flds[$pos]; $pos++;\r
158 $interval_timer_realvalue = $flds[$pos]; $pos++;\r
159 $start_time = $flds[$pos]; $pos++;\r
160 $vm_size = $flds[$pos]; $pos++;\r
161 $resident_set_size = $flds[$pos]; $pos++;\r
162 $rss_limit = $flds[$pos]; $pos++;\r
163 $startcode = $flds[$pos]; $pos++;\r
164 $endcode = $flds[$pos]; $pos++;\r
165 $startstack = $flds[$pos]; $pos++;\r
166 $curr_kernel_stack_ptr = $flds[$pos]; $pos++;\r
167 $curr_instruction_ptr = $flds[$pos]; $pos++;\r
168 $signal = $flds[$pos]; $pos++;\r
169 $sigblocked = $flds[$pos]; $pos++;\r
170 $sigignore = $flds[$pos]; $pos++;\r
171 $wchan = $flds[$pos]; $pos++;\r
172 $nswap = $flds[$pos]; $pos++;\r
173 $exit_signal = $flds[$pos]; $pos++;\r
174 $processor = $flds[$pos]; $pos++;\r
175 $rt_priority = $flds[$pos]; $pos++;\r
176 $policy = $flds[$pos]; $pos++;\r
177 $aggr_block_io_delays = $flds[$pos]; $pos++;\r
178 $guest_time = $flds[$pos]; $pos++;\r
179 $cguest_time = $flds[$pos]; $pos++;\r
180 }\r