OLD | NEW |
---|---|
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 Loading... | |
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", | |
Sami
2016/08/22 16:35:40
Please consider adding a disabled-by-default trace
altimin
2016/08/22 17:02:23
Done, thanks!
| |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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); | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |