8225046: Shenandoah metrics logs refactoring

Reviewed-by: rkennke
This commit is contained in:
Aleksey Shipilev 2019-06-03 14:50:59 +02:00
parent 98b1d8c798
commit d25350462e
3 changed files with 30 additions and 29 deletions

View File

@ -1604,9 +1604,8 @@ void ShenandoahHeap::op_full(GCCause::Cause cause) {
}
metrics.snap_after();
metrics.print();
if (metrics.is_good_progress("Full GC")) {
if (metrics.is_good_progress()) {
_progress_last_gc.set();
} else {
// Nothing to do. Tell the allocation path that we have failed to make
@ -1739,11 +1738,10 @@ void ShenandoahHeap::op_degenerated(ShenandoahDegenPoint point) {
}
metrics.snap_after();
metrics.print();
// Check for futility and fail. There is no reason to do several back-to-back Degenerated cycles,
// because that probably means the heap is overloaded and/or fragmented.
if (!metrics.is_good_progress("Degenerated GC")) {
if (!metrics.is_good_progress()) {
_progress_last_gc.unset();
cancel_gc(GCCause::_shenandoah_upgrade_to_full_gc);
op_degenerated_futile();

View File

@ -127,48 +127,52 @@ void ShenandoahMetricsSnapshot::snap_after() {
_ef_after = ShenandoahMetrics::external_fragmentation();
}
void ShenandoahMetricsSnapshot::print() {
log_info(gc, ergo)("Used: before: " SIZE_FORMAT "M, after: " SIZE_FORMAT "M", _used_before/M, _used_after/M);
log_info(gc, ergo)("Internal frag: before: %.1f%%, after: %.1f%%", _if_before * 100, _if_after * 100);
log_info(gc, ergo)("External frag: before: %.1f%%, after: %.1f%%", _ef_before * 100, _ef_after * 100);
}
bool ShenandoahMetricsSnapshot::is_good_progress(const char *label) {
// Under the critical threshold? Declare failure.
bool ShenandoahMetricsSnapshot::is_good_progress() {
// Under the critical threshold?
size_t free_actual = _heap->free_set()->available();
size_t free_expected = _heap->max_capacity() / 100 * ShenandoahCriticalFreeThreshold;
if (free_actual < free_expected) {
log_info(gc, ergo)("Not enough free space (" SIZE_FORMAT "M, need " SIZE_FORMAT "M) after %s",
free_actual / M, free_expected / M, label);
bool prog_free = free_actual >= free_expected;
log_info(gc, ergo)("%s progress for free space: " SIZE_FORMAT "%s, need " SIZE_FORMAT "%s",
prog_free ? "Good" : "Bad",
byte_size_in_proper_unit(free_actual), proper_unit_for_byte_size(free_actual),
byte_size_in_proper_unit(free_expected), proper_unit_for_byte_size(free_expected));
if (!prog_free) {
return false;
}
// Freed up enough? Good! Declare victory.
// Freed up enough?
size_t progress_actual = (_used_before > _used_after) ? _used_before - _used_after : 0;
size_t progress_expected = ShenandoahHeapRegion::region_size_bytes();
if (progress_actual >= progress_expected) {
bool prog_used = progress_actual >= progress_expected;
log_info(gc, ergo)("%s progress for used space: " SIZE_FORMAT "%s, need " SIZE_FORMAT "%s",
prog_used ? "Good" : "Bad",
byte_size_in_proper_unit(progress_actual), proper_unit_for_byte_size(progress_actual),
byte_size_in_proper_unit(progress_expected), proper_unit_for_byte_size(progress_expected));
if (prog_used) {
return true;
}
log_info(gc,ergo)("Not enough progress (" SIZE_FORMAT "M, need " SIZE_FORMAT "M) after %s",
progress_actual / M, progress_expected / M, label);
// Internal fragmentation is down? Good! Declare victory.
// Internal fragmentation is down?
double if_actual = _if_before - _if_after;
double if_expected = 0.01; // 1% should be enough
if (if_actual > if_expected) {
bool prog_if = if_actual >= if_expected;
log_info(gc, ergo)("%s progress for internal fragmentation: %.1f%%, need %.1f%%",
prog_if ? "Good" : "Bad",
if_actual * 100, if_expected * 100);
if (prog_if) {
return true;
}
log_info(gc,ergo)("Not enough internal fragmentation improvement (%.1f%%, need %.1f%%) after %s",
if_actual * 100, if_expected * 100, label);
// External fragmentation is down? Good! Declare victory.
// External fragmentation is down?
double ef_actual = _ef_before - _ef_after;
double ef_expected = 0.01; // 1% should be enough
if (ef_actual > ef_expected) {
bool prog_ef = ef_actual >= ef_expected;
log_info(gc, ergo)("%s progress for external fragmentation: %.1f%%, need %.1f%%",
prog_ef ? "Good" : "Bad",
ef_actual * 100, ef_expected * 100);
if (prog_ef) {
return true;
}
log_info(gc,ergo)("Not enough external fragmentation improvement (%.1f%%, need %.1f%%) after %s",
if_actual * 100, if_expected * 100, label);
// Nothing good had happened.
return false;

View File

@ -47,9 +47,8 @@ public:
void snap_before();
void snap_after();
void print();
bool is_good_progress(const char *label);
bool is_good_progress();
};
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHMETRICS_HPP