Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc

Issue 2265873004: [scheduler] Monitor renderer load level. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes according to comments Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" 5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/stack_trace.h" 8 #include "base/debug/stack_trace.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 18 matching lines...) Expand all
29 // the cost of loading tasks. 29 // the cost of loading tasks.
30 const int kLoadingTaskEstimationSampleCount = 1000; 30 const int kLoadingTaskEstimationSampleCount = 1000;
31 const double kLoadingTaskEstimationPercentile = 99; 31 const double kLoadingTaskEstimationPercentile = 99;
32 const int kTimerTaskEstimationSampleCount = 1000; 32 const int kTimerTaskEstimationSampleCount = 1000;
33 const double kTimerTaskEstimationPercentile = 99; 33 const double kTimerTaskEstimationPercentile = 99;
34 const int kShortIdlePeriodDurationSampleCount = 10; 34 const int kShortIdlePeriodDurationSampleCount = 10;
35 const double kShortIdlePeriodDurationPercentile = 50; 35 const double kShortIdlePeriodDurationPercentile = 50;
36 // Amount of idle time left in a frame (as a ratio of the vsync interval) above 36 // Amount of idle time left in a frame (as a ratio of the vsync interval) above
37 // which main thread compositing can be considered fast. 37 // which main thread compositing can be considered fast.
38 const double kFastCompositingIdleTimeThreshold = .2; 38 const double kFastCompositingIdleTimeThreshold = .2;
39
40 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
41 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererLoad",
42 static_cast<int>(load * 100));
43 }
44
45 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) {
46 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererLoad",
47 static_cast<int>(load * 100));
48 }
49
39 } // namespace 50 } // namespace
40 51
41 RendererSchedulerImpl::RendererSchedulerImpl( 52 RendererSchedulerImpl::RendererSchedulerImpl(
42 scoped_refptr<SchedulerTqmDelegate> main_task_runner) 53 scoped_refptr<SchedulerTqmDelegate> main_task_runner)
43 : helper_(main_task_runner, 54 : helper_(main_task_runner,
44 "renderer.scheduler", 55 "renderer.scheduler",
45 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 56 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
46 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), 57 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")),
47 idle_helper_(&helper_, 58 idle_helper_(&helper_,
48 this, 59 this,
49 "renderer.scheduler", 60 "renderer.scheduler",
50 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 61 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
51 "RendererSchedulerIdlePeriod", 62 "RendererSchedulerIdlePeriod",
52 base::TimeDelta()), 63 base::TimeDelta()),
53 render_widget_scheduler_signals_(this), 64 render_widget_scheduler_signals_(this),
54 control_task_runner_(helper_.ControlTaskRunner()), 65 control_task_runner_(helper_.ControlTaskRunner()),
55 compositor_task_runner_(helper_.NewTaskQueue( 66 compositor_task_runner_(helper_.NewTaskQueue(
56 TaskQueue::Spec("compositor_tq").SetShouldMonitorQuiescence(true))), 67 TaskQueue::Spec("compositor_tq").SetShouldMonitorQuiescence(true))),
57 delayed_update_policy_runner_( 68 delayed_update_policy_runner_(
58 base::Bind(&RendererSchedulerImpl::UpdatePolicy, 69 base::Bind(&RendererSchedulerImpl::UpdatePolicy,
59 base::Unretained(this)), 70 base::Unretained(this)),
60 helper_.ControlTaskRunner()), 71 helper_.ControlTaskRunner()),
61 main_thread_only_(this, 72 main_thread_only_(this,
62 compositor_task_runner_, 73 compositor_task_runner_,
63 helper_.scheduler_tqm_delegate().get()), 74 helper_.scheduler_tqm_delegate().get(),
75 helper_.scheduler_tqm_delegate()->NowTicks()),
64 policy_may_need_update_(&any_thread_lock_), 76 policy_may_need_update_(&any_thread_lock_),
65 weak_factory_(this) { 77 weak_factory_(this) {
66 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler")); 78 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler"));
67 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, 79 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy,
68 weak_factory_.GetWeakPtr()); 80 weak_factory_.GetWeakPtr());
69 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( 81 end_renderer_hidden_idle_period_closure_.Reset(base::Bind(
70 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); 82 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr()));
71 83
72 suspend_timers_when_backgrounded_closure_.Reset( 84 suspend_timers_when_backgrounded_closure_.Reset(
73 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, 85 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded,
(...skipping 29 matching lines...) Expand all
103 115
104 // Ensure the renderer scheduler was shut down explicitly, because otherwise 116 // Ensure the renderer scheduler was shut down explicitly, because otherwise
105 // we could end up having stale pointers to the Blink heap which has been 117 // we could end up having stale pointers to the Blink heap which has been
106 // terminated by this point. 118 // terminated by this point.
107 DCHECK(MainThreadOnly().was_shutdown); 119 DCHECK(MainThreadOnly().was_shutdown);
108 } 120 }
109 121
110 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( 122 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
111 RendererSchedulerImpl* renderer_scheduler_impl, 123 RendererSchedulerImpl* renderer_scheduler_impl,
112 const scoped_refptr<TaskQueue>& compositor_task_runner, 124 const scoped_refptr<TaskQueue>& compositor_task_runner,
113 base::TickClock* time_source) 125 base::TickClock* time_source,
126 base::TimeTicks now)
114 : loading_task_cost_estimator(time_source, 127 : loading_task_cost_estimator(time_source,
115 kLoadingTaskEstimationSampleCount, 128 kLoadingTaskEstimationSampleCount,
116 kLoadingTaskEstimationPercentile), 129 kLoadingTaskEstimationPercentile),
117 timer_task_cost_estimator(time_source, 130 timer_task_cost_estimator(time_source,
118 kTimerTaskEstimationSampleCount, 131 kTimerTaskEstimationSampleCount,
119 kTimerTaskEstimationPercentile), 132 kTimerTaskEstimationPercentile),
120 queueing_time_estimator(renderer_scheduler_impl, 133 queueing_time_estimator(renderer_scheduler_impl,
121 base::TimeDelta::FromSeconds(1)), 134 base::TimeDelta::FromSeconds(1)),
122 idle_time_estimator(compositor_task_runner, 135 idle_time_estimator(compositor_task_runner,
123 time_source, 136 time_source,
124 kShortIdlePeriodDurationSampleCount, 137 kShortIdlePeriodDurationSampleCount,
125 kShortIdlePeriodDurationPercentile), 138 kShortIdlePeriodDurationPercentile),
139 background_main_thread_load_tracker(
140 now,
141 base::Bind(&ReportBackgroundRendererTaskLoad)),
142 foreground_main_thread_load_tracker(
143 now,
144 base::Bind(&ReportForegroundRendererTaskLoad)),
126 current_use_case(UseCase::NONE), 145 current_use_case(UseCase::NONE),
127 timer_queue_suspend_count(0), 146 timer_queue_suspend_count(0),
128 navigation_task_expected_count(0), 147 navigation_task_expected_count(0),
129 expensive_task_policy(ExpensiveTaskPolicy::RUN), 148 expensive_task_policy(ExpensiveTaskPolicy::RUN),
130 renderer_hidden(false), 149 renderer_hidden(false),
131 renderer_backgrounded(false), 150 renderer_backgrounded(false),
132 renderer_suspended(false), 151 renderer_suspended(false),
133 timer_queue_suspension_when_backgrounded_enabled(false), 152 timer_queue_suspension_when_backgrounded_enabled(false),
134 timer_queue_suspended_when_backgrounded(false), 153 timer_queue_suspended_when_backgrounded(false),
135 was_shutdown(false), 154 was_shutdown(false),
(...skipping 20 matching lines...) Expand all
156 have_seen_touchstart(false) {} 175 have_seen_touchstart(false) {}
157 176
158 RendererSchedulerImpl::AnyThread::~AnyThread() {} 177 RendererSchedulerImpl::AnyThread::~AnyThread() {}
159 178
160 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() 179 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly()
161 : last_input_type(blink::WebInputEvent::Undefined) {} 180 : last_input_type(blink::WebInputEvent::Undefined) {}
162 181
163 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} 182 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {}
164 183
165 void RendererSchedulerImpl::Shutdown() { 184 void RendererSchedulerImpl::Shutdown() {
185 base::TimeTicks now = tick_clock()->NowTicks();
186 MainThreadOnly().background_main_thread_load_tracker.RecordIdle(now);
187 MainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now);
188
166 throttling_helper_.reset(); 189 throttling_helper_.reset();
167 helper_.Shutdown(); 190 helper_.Shutdown();
168 MainThreadOnly().was_shutdown = true; 191 MainThreadOnly().was_shutdown = true;
169 MainThreadOnly().rail_mode_observer = nullptr; 192 MainThreadOnly().rail_mode_observer = nullptr;
170 } 193 }
171 194
172 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() { 195 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() {
173 return base::MakeUnique<WebThreadImplForRendererScheduler>(this); 196 return base::MakeUnique<WebThreadImplForRendererScheduler>(this);
174 } 197 }
175 198
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 } 421 }
399 422
400 void RendererSchedulerImpl::OnRendererBackgrounded() { 423 void RendererSchedulerImpl::OnRendererBackgrounded() {
401 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 424 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
402 "RendererSchedulerImpl::OnRendererBackgrounded"); 425 "RendererSchedulerImpl::OnRendererBackgrounded");
403 helper_.CheckOnValidThread(); 426 helper_.CheckOnValidThread();
404 if (helper_.IsShutdown() || MainThreadOnly().renderer_backgrounded) 427 if (helper_.IsShutdown() || MainThreadOnly().renderer_backgrounded)
405 return; 428 return;
406 429
407 MainThreadOnly().renderer_backgrounded = true; 430 MainThreadOnly().renderer_backgrounded = true;
431
432 base::TimeTicks now = tick_clock()->NowTicks();
433 MainThreadOnly().foreground_main_thread_load_tracker.Pause(now);
434 MainThreadOnly().background_main_thread_load_tracker.Resume(now);
435
408 if (!MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled) 436 if (!MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled)
409 return; 437 return;
410 438
411 suspend_timers_when_backgrounded_closure_.Cancel(); 439 suspend_timers_when_backgrounded_closure_.Cancel();
412 base::TimeDelta suspend_timers_when_backgrounded_delay = 440 base::TimeDelta suspend_timers_when_backgrounded_delay =
413 base::TimeDelta::FromMilliseconds( 441 base::TimeDelta::FromMilliseconds(
414 kSuspendTimersWhenBackgroundedDelayMillis); 442 kSuspendTimersWhenBackgroundedDelayMillis);
415 control_task_runner_->PostDelayedTask( 443 control_task_runner_->PostDelayedTask(
416 FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(), 444 FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(),
417 suspend_timers_when_backgrounded_delay); 445 suspend_timers_when_backgrounded_delay);
418 } 446 }
419 447
420 void RendererSchedulerImpl::OnRendererForegrounded() { 448 void RendererSchedulerImpl::OnRendererForegrounded() {
421 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 449 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
422 "RendererSchedulerImpl::OnRendererForegrounded"); 450 "RendererSchedulerImpl::OnRendererForegrounded");
423 helper_.CheckOnValidThread(); 451 helper_.CheckOnValidThread();
424 if (helper_.IsShutdown() || !MainThreadOnly().renderer_backgrounded) 452 if (helper_.IsShutdown() || !MainThreadOnly().renderer_backgrounded)
425 return; 453 return;
426 454
427 MainThreadOnly().renderer_backgrounded = false; 455 MainThreadOnly().renderer_backgrounded = false;
428 MainThreadOnly().renderer_suspended = false; 456 MainThreadOnly().renderer_suspended = false;
457
458 base::TimeTicks now = tick_clock()->NowTicks();
459 MainThreadOnly().foreground_main_thread_load_tracker.Resume(now);
460 MainThreadOnly().background_main_thread_load_tracker.Pause(now);
alex clarke (OOO till 29th) 2016/08/22 16:13:13 I wonder if you also want to add something in WebV
altimin 2016/08/22 17:02:22 As discussed offline, no due to renderer hosting a
461
429 suspend_timers_when_backgrounded_closure_.Cancel(); 462 suspend_timers_when_backgrounded_closure_.Cancel();
430 ResumeTimerQueueWhenForegrounded(); 463 ResumeTimerQueueWhenForegrounded();
431 } 464 }
432 465
433 void RendererSchedulerImpl::SuspendRenderer() { 466 void RendererSchedulerImpl::SuspendRenderer() {
434 helper_.CheckOnValidThread(); 467 helper_.CheckOnValidThread();
435 DCHECK(MainThreadOnly().renderer_backgrounded); 468 DCHECK(MainThreadOnly().renderer_backgrounded);
436 if (helper_.IsShutdown()) 469 if (helper_.IsShutdown())
437 return; 470 return;
438 suspend_timers_when_backgrounded_closure_.Cancel(); 471 suspend_timers_when_backgrounded_closure_.Cancel();
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 " and https://crbug.com/574343#c40 for more information."); 1439 " and https://crbug.com/574343#c40 for more information.");
1407 } 1440 }
1408 } 1441 }
1409 1442
1410 void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time, 1443 void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time,
1411 base::TimeTicks end_time) { 1444 base::TimeTicks end_time) {
1412 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(start_time, 1445 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(start_time,
1413 end_time); 1446 end_time);
1414 MainThreadOnly().long_task_tracker.RecordLongTask( 1447 MainThreadOnly().long_task_tracker.RecordLongTask(
1415 start_time, end_time - start_time); 1448 start_time, end_time - start_time);
1449 // We want to measure thread time here, but for efficiency reasons
1450 // we stick with wall time.
1451 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime(
1452 start_time, end_time);
1453 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime(
1454 start_time, end_time);
1416 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", 1455 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime",
1417 (end_time - start_time).InMicroseconds(), 1, 1456 (end_time - start_time).InMicroseconds(), 1,
1418 1000000, 50); 1457 1000000, 50);
1419 } 1458 }
1420 1459
1421 LongTaskTracker::LongTaskTiming RendererSchedulerImpl::GetLongTaskTiming() { 1460 LongTaskTracker::LongTaskTiming RendererSchedulerImpl::GetLongTaskTiming() {
1422 return MainThreadOnly().long_task_tracker.GetLongTaskTiming(); 1461 return MainThreadOnly().long_task_tracker.GetLongTaskTiming();
1423 } 1462 }
1424 1463
1425 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( 1464 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 case v8::PERFORMANCE_LOAD: 1527 case v8::PERFORMANCE_LOAD:
1489 return "load"; 1528 return "load";
1490 default: 1529 default:
1491 NOTREACHED(); 1530 NOTREACHED();
1492 return nullptr; 1531 return nullptr;
1493 } 1532 }
1494 } 1533 }
1495 1534
1496 } // namespace scheduler 1535 } // namespace scheduler
1497 } // namespace blink 1536 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698