Subversion Repositories havirt

Rev

Rev 39 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 39 Rev 40
Line 71... Line 71...
71
   push @return, "\tin maintenance mode";
71
   push @return, "\tin maintenance mode";
72
 
72
 
73
   return join( "\n", @return ) . "\n";
73
   return join( "\n", @return ) . "\n";
74
}
74
}
75
 
75
 
-
 
76
sub getClusterStats {
-
 
77
   my $return = {};
-
 
78
   foreach my $node (sort keys %{ $main::statusDB->{'node'} } ) {
-
 
79
      $return->{'nodes'}->{$node}->{'node_memory'} = $main::statusDB->{'node'}->{$node}->{'memory'};
-
 
80
      $return->{'nodes'}->{$node}->{'node_vcpu'} = $main::statusDB->{'node'}->{$node}->{'cpu_count'};
-
 
81
      $return->{'nodes'}->{$node}->{'node_maintenance'} = $main::statusDB->{'node'}->{$node}->{'maintenance'};
-
 
82
 
-
 
83
      $return->{'nodes'}->{$node}->{'domain_memory'} = 0;
-
 
84
      $return->{'nodes'}->{$node}->{'domain_vcpu'} = 0;
-
 
85
      $return->{'nodes'}->{$node}->{'domain_count'} = 0;
-
 
86
      foreach my $domain ( keys %{ $main::statusDB->{'nodePopulation'}->{$node}->{'running'} } ) {
-
 
87
         $return->{'nodes'}->{$node}->{'domain_memory'} += $main::statusDB->{'virt'}->{$domain}->{'memory'};
-
 
88
         $return->{'nodes'}->{$node}->{'domain_vcpu'} += $main::statusDB->{'virt'}->{$domain}->{'vcpu'};
-
 
89
         $return->{'nodes'}->{$node}->{'domain_count'}++;
-
 
90
         $return->{'nodes'}->{$node}->{'domains'}->{$domain}->{'memory'} = $main::statusDB->{'virt'}->{$domain}->{'memory'};
-
 
91
         $return->{'nodes'}->{$node}->{'domains'}->{$domain}->{'vcpu'} = $main::statusDB->{'virt'}->{$domain}->{'vcpu'};
-
 
92
      }
-
 
93
      if ( ! $main::statusDB->{'node'}->{$node}->{'maintenance'} ) { # do not include node resources if maintenance set
-
 
94
         $return->{'total_memory'} += $return->{'nodes'}->{$node}->{'node_memory'};
-
 
95
         $return->{'total_vcpu'} += $return->{'nodes'}->{$node}->{'node_vcpu'};
-
 
96
      }
-
 
97
      $return->{'total_count'} += $return->{'nodes'}->{$node}->{'domain_count'};
-
 
98
      $return->{'domain_memory'} += $return->{'nodes'}->{$node}->{'domain_memory'};
-
 
99
      $return->{'domain_vcpu'} += $return->{'nodes'}->{$node}->{'domain_vcpu'};
-
 
100
 
-
 
101
   }
-
 
102
   return $return;
-
 
103
}
-
 
104
 
76
sub status {
105
sub status {
77
   my $return = '';
106
   my $return = '';
78
   &main::readDB();
107
   &main::readDB();
79
   my @header = ('Node','Threads','Memory','Domains','vcpu','mem_used', 'Status' );
108
   my @header = ('Node','Threads','Memory','Domains','vcpu','mem_used', 'Status' );
80
   my @data;
109
   my @data;
Line 209... Line 238...
209
      push @return, "No new entries";
238
      push @return, "No new entries";
210
   }
239
   }
211
   return join( "\n", @return ) . "\n";
240
   return join( "\n", @return ) . "\n";
212
} # updateISCITargets
241
} # updateISCITargets
213
 
242
 
-
 
243
# Creates a balance report to show the user what went on
-
 
244
# $cluster is a hash created by sub getClusterStats, and possibly modified by
-
 
245
# the calling process
-
 
246
sub showBalanceReport {
-
 
247
   my $cluster = shift;
-
 
248
   my $variance = 0;
-
 
249
   my $count = 0;
-
 
250
   my @header = ('Node','Threads','Memory(G)','Domains','vcpu_alloc','mem_alloc(G)', 'vcpu%', 'mem%', 'Status', 'StdDev' );
-
 
251
   my @data;
-
 
252
   foreach my $node ( sort keys %{ $cluster->{'nodes'} } ) {
-
 
253
      # get standard deviation
-
 
254
      my $stddev = $cluster->{'nodes'}->{$node}->{'node_maintenance'} ? 0 : 
-
 
255
                   (
-
 
256
                      ( $cluster->{'nodes'}->{$node}->{'domain_memory'} / $cluster->{'nodes'}->{$node}->{'node_memory'} * 100 ) - 
-
 
257
                      ( $cluster->{'domain_memory'} / $cluster->{'total_memory'} * 100 )
-
 
258
                   ) ** 2;
-
 
259
                   
-
 
260
      push @data, [
-
 
261
         $node, 
-
 
262
         $cluster->{'nodes'}->{$node}->{'node_vcpu'},
-
 
263
         sprintf( '%d', $cluster->{'nodes'}->{$node}->{'node_memory'}/1024/1024 ),
-
 
264
         $cluster->{'nodes'}->{$node}->{'domain_count'},
-
 
265
         $cluster->{'nodes'}->{$node}->{'domain_vcpu'},
-
 
266
         $cluster->{'nodes'}->{$node}->{'domain_memory'}/1024/1024,
-
 
267
         sprintf( '%2.0f%%', $cluster->{'nodes'}->{$node}->{'domain_vcpu'} / $cluster->{'nodes'}->{$node}->{'node_vcpu'} * 100 ),
-
 
268
         sprintf( '%2.0f%%', $cluster->{'nodes'}->{$node}->{'domain_memory'} / $cluster->{'nodes'}->{$node}->{'node_memory'} * 100 ),
-
 
269
         $cluster->{'nodes'}->{$node}->{'node_maintenance'} ? 'Maintenance' : '',
-
 
270
         sprintf( "%d", $stddev )
-
 
271
      ];
-
 
272
      $variance += $stddev;
-
 
273
      $count++;
-
 
274
   }
-
 
275
   push @data, [
-
 
276
         'All', 
-
 
277
         $cluster->{'total_vcpu'},
-
 
278
         sprintf( '%d', $cluster->{'total_memory'}/1024/1024 ),
-
 
279
         $cluster->{'total_count'},
-
 
280
         $cluster->{'domain_vcpu'},
-
 
281
         $cluster->{'domain_memory'}/1024/1024,
-
 
282
         sprintf( '%2.0f%%', $cluster->{'domain_vcpu'} / $cluster->{'total_vcpu'} * 100 ),
-
 
283
         sprintf( '%2.0f%%', $cluster->{'domain_memory'} / $cluster->{'total_memory'} * 100 ),
-
 
284
         ''
-
 
285
      ];
-
 
286
   return &main::report( \@header, \@data ),sprintf( "%d", $variance / $count );
-
 
287
}
-
 
288
 
-
 
289
# attempt to balance the domains on the active (maintenance = false) nodes
-
 
290
# basically, we take what is currently working, and calculate the variance
-
 
291
# of it (see https://en.wikipedia.org/wiki/Standard_deviation). If that is
-
 
292
# over about a 10, we move things around, if possible, then check our variance
-
 
293
# again.
214
sub balance {
294
sub balance {
-
 
295
   &main::readDB();
-
 
296
   # get the current cluster status
-
 
297
   my $cluster = &getClusterStats();
-
 
298
   # for development, turn on verbose
-
 
299
   $main::config->{'flags'}->{'verbose'} = 1;
-
 
300
   # show user what it looks like at first
-
 
301
   if ( $main::config->{'flags'}->{'verbose'} ) {
-
 
302
      print "Starting Status\n\n";
-
 
303
      my ($report, $variance) =  &showBalanceReport( $cluster) ;
-
 
304
      print $report;
-
 
305
      print "Variance is $variance\n";
-
 
306
   }
-
 
307
   
-
 
308
   die;
-
 
309
   #die Dumper( $cluster ) . "\n";
215
   return "This function not implemented yet\n";
310
   return "This function not implemented yet\n";
216
}
311
}
-
 
312