Changeset 29582
- Timestamp:
- Oct 27, 2010, 12:10:49 PM (16 years ago)
- File:
-
- 1 edited
-
trunk/tools/czartool/CzarDb.pm (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/tools/czartool/CzarDb.pm
r29437 r29582 267 267 ########################################################################### 268 268 # 269 # Analysis this stage between these times 270 # 271 ########################################################################### 272 sub runAnalysis { 273 my ($self, 274 $label, 275 $stage, 276 $fromTime, 277 $toTime, 278 $_started, 279 $_finished, 280 $_stuck, 281 $_processed, 282 $_pending, 283 $_faults, 284 $_totalTime) = @_; 285 286 my $query = $self->{_db}->prepare(<<SQL); 287 SELECT 288 timestamp, pending, faults, processed 289 FROM $stage 290 WHERE label LIKE '$label' 291 AND timestamp >= '$fromTime' AND timestamp <= '$toTime' 292 ORDER BY timestamp; 293 SQL 294 295 $query->execute; 296 297 my $lastProcessed = -1; 298 my $lastPending = -1; 299 my $lastFaults = -1; 300 my $lastTimestamp = undef; 301 my ($linearProcessed, $linearPending, $linearFaults); 302 my ($derivProcessed, $derivPending, $derivFaults); 303 my $started = undef; 304 my $finished = undef; 305 306 my $notProcessing = undef; 307 my $howLongNotProcessing = undef; 308 my $notProcessingLongerThanInterval = 0; 309 310 my $stuck = undef; 311 my $howLongStuck = undef; 312 my $stuckLongerThanInterval = 0; 313 314 my $stuffToDo = undef; 315 my $interval = "00:20:00"; 316 317 $linearProcessed = 0; 318 while (my @row = $query->fetchrow_array()) { 319 my ($thisTimestamp, $thisPending, $thisFaults, $thisProcessed) = @row; 320 321 # get linear values 322 if($lastProcessed != -1 && $thisProcessed > $lastProcessed) { 323 324 $linearProcessed = $linearProcessed + ($thisProcessed - $lastProcessed); 325 } 326 $linearPending = $thisPending; 327 $linearFaults = $thisFaults; 328 329 # get first derivative values 330 if (defined $lastTimestamp) { 331 332 my $timeDiff = $self->diffTimesInSecs($thisTimestamp, $lastTimestamp); 333 334 if ($thisProcessed >= $lastProcessed){ 335 $derivProcessed = abs($thisProcessed - $lastProcessed)/$timeDiff; 336 } 337 else {$derivProcessed = 0;} 338 $derivPending = abs($thisPending - $lastPending)/$timeDiff; 339 $derivFaults = abs($thisFaults - $lastFaults)/$timeDiff; 340 } 341 else { 342 343 $derivProcessed = 0; 344 $derivPending = 0; 345 $derivFaults = 0; 346 } 347 348 # analysis 349 if (defined $lastTimestamp) { 350 351 # anything to do? 352 $stuffToDo = $linearPending - $linearFaults; 353 354 # we are not processing 355 if ($derivProcessed < 0.001 ) { 356 357 if (!defined $notProcessing) {$notProcessing = $lastTimestamp;} 358 if ($stuffToDo && !defined $stuck) {$stuck = $lastTimestamp;} 359 } 360 361 # we are processing 362 else { 363 if (defined $notProcessing) { 364 365 if ($stuckLongerThanInterval) { 366 367 # print "* $stage procesing was stuck for $howLongStuck, from $stuck until $lastTimestamp\n"; 368 } 369 if ($notProcessingLongerThanInterval) { 370 371 # print " * $stage not procesing for $howLongNotProcessing, from $notProcessing until $thisTimestamp\n"; 372 } 373 $notProcessing = undef; 374 $stuck = undef; 375 } 376 if (!defined $started) { 377 $started = $lastTimestamp; 378 $finished = undef; 379 # print "* $stage processing started at $started\n"; 380 } 381 } 382 383 # how long stuck? 384 if (defined $stuck) { 385 386 $howLongStuck = $self->diffTimes($lastTimestamp, $stuck); 387 $stuckLongerThanInterval = $self->isBefore($interval, $howLongStuck) 388 } 389 else { 390 391 $howLongStuck = 0; 392 $stuckLongerThanInterval = 0; 393 } 394 395 # how long not processing? 396 if (defined $notProcessing) { 397 398 $howLongNotProcessing = $self->diffTimes($lastTimestamp, $notProcessing); 399 $notProcessingLongerThanInterval = $self->isBefore($interval, $howLongNotProcessing); 400 } 401 else { 402 403 $howLongNotProcessing = 0; 404 $notProcessingLongerThanInterval = 0; 405 } 406 407 if ($stuffToDo) {$finished = undef;} 408 elsif (!defined $finished && $started && $notProcessingLongerThanInterval) { 409 410 $finished = $notProcessing; 411 } 412 } 413 414 $lastProcessed = $thisProcessed; 415 $lastPending = $thisPending; 416 $lastFaults = $thisFaults; 417 $lastTimestamp = $thisTimestamp; 418 } 419 420 ${$_processed} = $linearProcessed; 421 ${$_pending} = $stuffToDo; 422 ${$_faults} = $lastFaults; 423 424 if (defined $finished) { 425 ${$_finished} = $finished; 426 ${$_totalTime} = $self->diffTimes($finished, $started); 427 } 428 429 elsif(defined $started) { 430 431 ${$_finished} = undef; 432 } 433 434 if (!defined $started){ 435 436 ${$_started} = undef; 437 } 438 else { 439 440 ${$_started} = $started; 441 } 442 if ($stuck && $stuckLongerThanInterval && !defined $finished) { 443 444 ${$_stuck} = $stuck; 445 } 446 else { 447 448 ${$_stuck} = undef; 449 } 450 451 return 1; 452 } 453 ########################################################################### 454 # 269 455 # Gets time series data and stores it to temp file 270 456 # … … 282 468 283 469 if (!$query->execute) {return 0;} 284 my $minProcessed = scalar $query->fetchrow_array(); # TODO remove470 my $minProcessed = scalar $query->fetchrow_array(); 285 471 if (!defined $minProcessed) {return 0;} 286 472 … … 305 491 my $lastFaults = -1; 306 492 my $lastTimestamp = undef; 307 my $processed = 0; 308 my $runningProcessed = 0; 309 my $pending = 0; 310 my $faults = 0; 493 my ($linearProcessed, $linearPending, $linearFaults); 494 my ($logProcessed, $logPending, $logFaults); 495 my ($derivProcessed, $derivPending, $derivFaults); 311 496 my $timestamp = undef; 497 498 $linearProcessed = 0; 312 499 while (my @row = $query->fetchrow_array()) { 313 500 my ($thisTimestamp, $thisPending, $thisFaults, $thisProcessed) = @row; 314 501 315 if ($showCleanup ) { 502 # get linear values 503 if ($showCleanup) { 316 504 317 $ runningProcessed = $thisProcessed - $minProcessed;505 $linearProcessed = $thisProcessed - $minProcessed; 318 506 } 319 507 elsif($lastProcessed != -1 && $thisProcessed > $lastProcessed) { 320 508 321 $ runningProcessed = $runningProcessed + ($thisProcessed - $lastProcessed);509 $linearProcessed = $linearProcessed + ($thisProcessed - $lastProcessed); 322 510 } 323 324 325 if ($firstDeriv) { 326 327 if (defined $lastTimestamp) {328 329 my $timeDiff = $self->diffTimesInSecs($thisTimestamp, $lastTimestamp);511 $linearPending = $thisPending; 512 $linearFaults = $thisFaults; 513 514 # get first derivative values 515 if (defined $lastTimestamp) { 516 517 my $timeDiff = $self->diffTimesInSecs($thisTimestamp, $lastTimestamp); 330 518 331 if ($thisProcessed > $lastProcessed){ 332 $processed = abs($thisProcessed - $lastProcessed)/$timeDiff; 333 #print "$processed = ($thisProcessed - $lastProcessed)/$timeDiff\n"; 334 } 335 else {$processed = 0;} 336 #$pending = abs($thisPending - $lastPending)/$timeDiff; 337 #$faults = abs($thisFaults - $lastFaults)/$timeDiff; 519 if ($thisProcessed >= $lastProcessed){ 520 $derivProcessed = abs($thisProcessed - $lastProcessed)/$timeDiff; 338 521 } 339 else { 340 $processed = 0; 341 $pending = 0; 342 $faults = 0; 343 } 344 } 345 elsif ($isLog) { 346 347 $processed = ($runningProcessed < 0) ? 0 : $runningProcessed; 348 $pending = ($thisPending < 0) ? 0 : $thisPending; 349 $faults = ($thisFaults < 0) ? 0 : $thisFaults; 350 351 $processed = log($runningProcessed + 1)/log(10); 352 $pending = log($thisPending + 1)/log(10); 353 $faults = log($faults + 1)/log(10); 522 else {$derivProcessed = 0;} 523 $derivPending = 0; 524 $derivFaults = 0; 525 # $derivPending = abs($thisPending - $lastPending)/$timeDiff; 526 # $derivFaults = abs($thisFaults - $lastFaults)/$timeDiff; 354 527 } 355 528 else { 356 529 357 $ processed = $runningProcessed;358 $ pending = $thisPending;359 $ faults = $thisFaults;530 $derivProcessed = 0; 531 $derivPending = 0; 532 $derivFaults = 0; 360 533 } 361 534 535 # get log values 536 $logProcessed = ($linearProcessed < 0) ? 0 : $linearProcessed; 537 $logPending = ($linearPending < 0) ? 0 : $linearPending; 538 $logFaults = ($linearFaults < 0) ? 0 : $linearFaults; 539 $logProcessed = log($logProcessed + 1)/log(10); 540 $logPending = log($logPending + 1)/log(10); 541 $logFaults = log($logFaults + 1)/log(10); 542 543 # print to data file 362 544 $timestamp = $self->getFormattedDate($thisTimestamp); 363 364 print GNUDAT "$timestamp $pending $faults $processed\n"; 545 if ($firstDeriv) {print GNUDAT "$timestamp $derivPending $derivFaults $derivProcessed\n";} 546 elsif($isLog) {print GNUDAT "$timestamp $logPending $logFaults $logProcessed\n";} 547 else {print GNUDAT "$timestamp $linearPending $linearFaults $linearProcessed\n";} 365 548 366 549 $lastProcessed = $thisProcessed; … … 608 791 ########################################################################### 609 792 # 610 # When did this stage finish?611 #612 ###########################################################################613 sub getFinishTime {614 my ($self, $label, $stage, $begin, $end) = @_;615 616 my $query = $self->{_db}->prepare(<<SQL);617 SELECT618 timestamp, pending, faults619 FROM $stage620 WHERE label LIKE '$label'621 AND timestamp >= '$begin'622 AND timestamp <= '$end'623 SQL624 $query->execute;625 626 my $array = $query->fetchall_arrayref();627 628 my $row;629 my $thisPending = -1;630 my $lastPending = -1;631 my $thisFaults = -1;632 my $lastFaults = -1;633 my $timestamp;634 my $started = undef;635 my $finished = undef;636 my $thisLeft = 0;637 my $lastLeft = 0;638 my $finishTimeout = "01:00:00";639 my $numRows = @{$array};640 print "$numRows rows\n";641 my $n = 0;642 foreach $row ( @{$array} ){643 644 ($timestamp, $thisPending, $thisFaults) = @{$row};645 646 # print "$timestamp, $thisPending, $thisFaults\n";647 648 $thisLeft = $thisPending - $thisFaults;649 $lastLeft = $lastPending - $lastFaults;650 651 652 if ($n == 0 && $thisLeft > 0) {653 654 print "Starting this time period with stuff pending ($thisLeft)\n";655 $started = $timestamp;656 }657 658 if (!defined $started && $lastLeft == 0 && $thisLeft > 0) {659 660 $started = $timestamp;661 print "STARTED at $started\n";662 }663 664 if ($started && !defined $finished && $thisLeft == 0) {665 666 $finished = $timestamp;667 print "setting FINISHED to $finished\n";668 }669 670 if (defined $finished) {671 672 if ($thisLeft != 0) {673 674 $finished = undef;675 676 print "NEW pending at $timestamp\n";677 678 }679 elsif ($thisLeft == 0) {680 681 my $howLongFinished = $self->diffTimes($timestamp, $finished);682 683 print "$howLongFinished = $timestamp, $finished\n";684 685 if ($self->isIntervalGreaterThan($howLongFinished, $finishTimeout)) {686 687 print "0 pending for $howLongFinished. We're done \n";688 last;689 }690 691 }692 693 }694 695 696 $lastPending = $thisPending;697 $lastFaults = $thisFaults;698 $n++;699 if ($n == $numRows) {700 701 if ($thisLeft == 0) {702 703 print "exceeded interval before reaching finished timeout\n";704 }705 else {706 print "Reached end of interval and not finished yet. $thisLeft left\n";707 }708 }709 }710 711 if ($finished) {712 713 my $timeTaken = $self->diffTimes($finished, $started);714 print "FINISHED at $finished with $thisFaults remaining faults, time taken = $timeTaken\n";715 }716 717 }718 719 ###########################################################################720 #721 # Figures out if a stage has plateaued722 #723 ###########################################################################724 sub hasPlateaued {725 my ($self, $label, $stage, $end, $interval) = @_;726 727 my $query = $self->{_db}->prepare(<<SQL);728 SELECT729 timestamp, pending, faults730 FROM $stage731 WHERE label LIKE '$label'732 AND timestamp >= '$end - INTERVAL $interval'733 AND timestamp <= '$end'734 ORDER BY timestamp DESC;735 SQL736 $query->execute;737 738 my $array = $query->fetchall_arrayref();739 740 my $thisPending = -1;741 my $lastPending = -1;742 my $thisFaults = -1;743 my $lastFaults = -1;744 my $timestamp;745 my $thisLeft = 0;746 my $lastLeft = 0;747 my $row;748 my $numRows = @{$array};749 my $n = 0;750 foreach $row ( @{$array} ){751 752 ($timestamp, $thisPending, $thisFaults) = @{$row};753 754 $thisLeft = $thisPending - $thisFaults;755 $lastLeft = $lastPending - $lastFaults;756 757 print "$timestamp $thisPending\n";758 759 if ($n>0) {760 761 #if () {}762 763 }764 765 $lastPending = $thisPending;766 $lastFaults = $thisFaults;767 $n++;768 }769 }770 771 ###########################################################################772 #773 793 # Gets count of processed stuff in a given time period 774 794 # … … 972 992 ########################################################################### 973 993 # 994 # Returns if a particular server has been stopped for a certain interval 995 # 996 ########################################################################### 997 sub isServerStopped { 998 my ($self, $server, $interval, $since) = @_; 999 1000 return $self->getServerStatus($server, $interval, $since, "running"); 1001 } 1002 1003 ########################################################################### 1004 # 974 1005 # Returns if a particular server has been down for a certain interval 975 1006 # 976 1007 ########################################################################### 977 1008 sub isServerDown { 978 my ($self, $server, $interval) = @_; 1009 my ($self, $server, $interval, $since) = @_; 1010 1011 return $self->getServerStatus($server, $interval, $since, "alive"); 1012 } 1013 1014 ########################################################################### 1015 # 1016 # Returns if a particular server has been down for a certain interval 1017 # 1018 ########################################################################### 1019 sub getServerStatus { 1020 my ($self, $server, $interval, $since, $mode) = @_; 979 1021 980 1022 my $query = $self->{_db}->prepare(<<SQL); 981 1023 SELECT COUNT(*) 982 1024 FROM servers 983 WHERE server = "$server"1025 WHERE server = '$server' 984 1026 AND timestamp > now() - INTERVAL $interval 985 1027 SQL … … 993 1035 SELECT COUNT(*) 994 1036 FROM servers 995 WHERE server = "$server"1037 WHERE server = '$server' 996 1038 AND timestamp > now() - INTERVAL $interval 997 AND ! running1039 AND !$mode 998 1040 SQL 999 1041 … … 1001 1043 my $numNotRunning = scalar $query->fetchrow_array(); 1002 1044 1003 if ($numOfReadings == $numNotRunning) {return 1;} 1004 1005 return 0; 1045 if ($numOfReadings != $numNotRunning) {return 0;} 1046 1047 $query = $self->{_db}->prepare(<<SQL); 1048 SELECT 1049 timestamp 1050 FROM servers 1051 WHERE server = '$server' 1052 AND $mode 1053 ORDER BY timestamp DESC 1054 LIMIT 1 1055 1056 SQL 1057 $query->execute; 1058 ${$since} = scalar $query->fetchrow_array(); 1059 1060 return 1; 1006 1061 } 1007 1062
Note:
See TracChangeset
for help on using the changeset viewer.
