Reviewers: Hannes Payer,
Message:
PTAL. This make scavenge speed more stable and fixes regression in Octane
where
low survival rate causes high scavenge speed, which breaks computation of
mutator utilization for new space.
Description:
Add option to compute average scavenge speed w.r.t survived objects.
Use it in detection of low young generation allocation rate.
BUG=501314
LOG=NO
Please review this at https://codereview.chromium.org/1186903005/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+20, -7 lines):
M src/heap/gc-tracer.h
M src/heap/gc-tracer.cc
M src/heap/heap.h
M src/heap/heap.cc
Index: src/heap/gc-tracer.cc
diff --git a/src/heap/gc-tracer.cc b/src/heap/gc-tracer.cc
index
13f35a935161ac3b17d88f8c6c37127be5049ebc..033c0bbc6774f2e780ee942ed0524627b04507fd
100644
--- a/src/heap/gc-tracer.cc
+++ b/src/heap/gc-tracer.cc
@@ -184,6 +184,7 @@ void GCTracer::Stop(GarbageCollector collector) {
current_.end_object_size = heap_->SizeOfObjects();
current_.end_memory_size = heap_->isolate()->memory_allocator()->Size();
current_.end_holes_size = CountTotalHolesSize(heap_);
+ current_.survived_new_space_object_size =
heap_->SurvivedNewSpaceObjectSize();
AddAllocation(current_.end_time);
@@ -566,12 +567,14 @@ intptr_t
GCTracer::IncrementalMarkingSpeedInBytesPerMillisecond() const {
}
-intptr_t GCTracer::ScavengeSpeedInBytesPerMillisecond() const {
+intptr_t GCTracer::ScavengeSpeedInBytesPerMillisecond(
+ ScavengeSpeedMode mode) const {
intptr_t bytes = 0;
double durations = 0.0;
EventBuffer::const_iterator iter = scavenger_events_.begin();
while (iter != scavenger_events_.end()) {
- bytes += iter->new_space_object_size;
+ bytes += mode == kForAllObjects ? iter->new_space_object_size
+ : iter->survived_new_space_object_size;
durations += iter->end_time - iter->start_time;
++iter;
}
Index: src/heap/gc-tracer.h
diff --git a/src/heap/gc-tracer.h b/src/heap/gc-tracer.h
index
9a7b28d4fb5624481b1b283c9d5332715d18f323..468fc9c0be7c4c298e2eb6a03580ff6be66f6505
100644
--- a/src/heap/gc-tracer.h
+++ b/src/heap/gc-tracer.h
@@ -85,6 +85,9 @@ class RingBuffer {
};
+enum ScavengeSpeedMode { kForAllObjects, kForSurvivedObjects };
+
+
// GCTracer collects and prints ONE line after each garbage collector
// invocation IFF --trace_gc is used.
// TODO(ernstm): Unit tests.
@@ -227,6 +230,8 @@ class GCTracer {
// Size of new space objects in constructor.
intptr_t new_space_object_size;
+ // Size of survived new space objects in desctructor.
+ intptr_t survived_new_space_object_size;
// Number of incremental marking steps since creation of tracer.
// (value at start of event)
@@ -371,7 +376,8 @@ class GCTracer {
// Compute the average scavenge speed in bytes/millisecond.
// Returns 0 if no events have been recorded.
- intptr_t ScavengeSpeedInBytesPerMillisecond() const;
+ intptr_t ScavengeSpeedInBytesPerMillisecond(
+ ScavengeSpeedMode mode = kForAllObjects) const;
// Compute the average mark-sweep speed in bytes/millisecond.
// Returns 0 if no events have been recorded.
Index: src/heap/heap.cc
diff --git a/src/heap/heap.cc b/src/heap/heap.cc
index
53b819174ffd804a5232fdacc6f0bfbd9e5f6bd0..29e9ac7e3d688eed08e72027a1bd8d5a834ebbec
100644
--- a/src/heap/heap.cc
+++ b/src/heap/heap.cc
@@ -4682,11 +4682,11 @@ void Heap::MakeHeapIterable() {
bool Heap::HasLowYoungGenerationAllocationRate() {
- const double high_mutator_utilization = 0.995;
+ const double high_mutator_utilization = 0.99;
double mutator_speed = static_cast<double>(
tracer()->NewSpaceAllocationThroughputInBytesPerMillisecond());
- double gc_speed =
- static_cast<double>(tracer()->ScavengeSpeedInBytesPerMillisecond());
+ double gc_speed = static_cast<double>(
+ tracer()->ScavengeSpeedInBytesPerMillisecond(kForSurvivedObjects));
if (mutator_speed == 0 || gc_speed == 0) return false;
double mutator_utilization = gc_speed / (mutator_speed + gc_speed);
return mutator_utilization > high_mutator_utilization;
@@ -4694,7 +4694,7 @@ bool Heap::HasLowYoungGenerationAllocationRate() {
bool Heap::HasLowOldGenerationAllocationRate() {
- const double high_mutator_utilization = 0.995;
+ const double high_mutator_utilization = 0.99;
double mutator_speed = static_cast<double>(
tracer()->OldGenerationAllocationThroughputInBytesPerMillisecond());
double gc_speed = static_cast<double>(
Index: src/heap/heap.h
diff --git a/src/heap/heap.h b/src/heap/heap.h
index
dd6a571eaf3ad77216e2c710c3a1a904f4b24f80..db57591984d341f0c893b603deb2e760a63b9c73
100644
--- a/src/heap/heap.h
+++ b/src/heap/heap.h
@@ -1277,6 +1277,10 @@ class Heap {
semi_space_copied_object_size_ += object_size;
}
+ inline intptr_t SurvivedNewSpaceObjectSize() {
+ return promoted_objects_size_ + semi_space_copied_object_size_;
+ }
+
inline void IncrementNodesDiedInNewSpace() { nodes_died_in_new_space_++;
}
inline void IncrementNodesCopiedInNewSpace() {
nodes_copied_in_new_space_++; }
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.