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.

Reply via email to