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

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: Created 4 years, 4 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,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 kLoadingTaskEstimationPercentile), 127 kLoadingTaskEstimationPercentile),
117 timer_task_cost_estimator(time_source, 128 timer_task_cost_estimator(time_source,
118 kTimerTaskEstimationSampleCount, 129 kTimerTaskEstimationSampleCount,
119 kTimerTaskEstimationPercentile), 130 kTimerTaskEstimationPercentile),
120 queueing_time_estimator(renderer_scheduler_impl, 131 queueing_time_estimator(renderer_scheduler_impl,
121 base::TimeDelta::FromSeconds(1)), 132 base::TimeDelta::FromSeconds(1)),
122 idle_time_estimator(compositor_task_runner, 133 idle_time_estimator(compositor_task_runner,
123 time_source, 134 time_source,
124 kShortIdlePeriodDurationSampleCount, 135 kShortIdlePeriodDurationSampleCount,
125 kShortIdlePeriodDurationPercentile), 136 kShortIdlePeriodDurationPercentile),
137 background_renderer_load_tracker(
138 time_source->NowTicks(),
Sami 2016/08/22 14:33:16 It'd be nice to pass in the same starting time to
altimin 2016/08/22 15:36:24 Done.
139 base::Bind(&ReportBackgroundRendererTaskLoad)),
140 foreground_renderer_load_tracker(
141 time_source->NowTicks(),
142 base::Bind(&ReportForegroundRendererTaskLoad)),
126 current_use_case(UseCase::NONE), 143 current_use_case(UseCase::NONE),
127 timer_queue_suspend_count(0), 144 timer_queue_suspend_count(0),
128 navigation_task_expected_count(0), 145 navigation_task_expected_count(0),
129 expensive_task_policy(ExpensiveTaskPolicy::RUN), 146 expensive_task_policy(ExpensiveTaskPolicy::RUN),
130 renderer_hidden(false), 147 renderer_hidden(false),
131 renderer_backgrounded(false), 148 renderer_backgrounded(false),
132 renderer_suspended(false), 149 renderer_suspended(false),
133 timer_queue_suspension_when_backgrounded_enabled(false), 150 timer_queue_suspension_when_backgrounded_enabled(false),
134 timer_queue_suspended_when_backgrounded(false), 151 timer_queue_suspended_when_backgrounded(false),
135 was_shutdown(false), 152 was_shutdown(false),
(...skipping 20 matching lines...) Expand all
156 have_seen_touchstart(false) {} 173 have_seen_touchstart(false) {}
157 174
158 RendererSchedulerImpl::AnyThread::~AnyThread() {} 175 RendererSchedulerImpl::AnyThread::~AnyThread() {}
159 176
160 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() 177 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly()
161 : last_input_type(blink::WebInputEvent::Undefined) {} 178 : last_input_type(blink::WebInputEvent::Undefined) {}
162 179
163 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} 180 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {}
164 181
165 void RendererSchedulerImpl::Shutdown() { 182 void RendererSchedulerImpl::Shutdown() {
183 base::TimeTicks now = tick_clock()->NowTicks();
184 MainThreadOnly().background_renderer_load_tracker.RecordIdle(now);
185 MainThreadOnly().foreground_renderer_load_tracker.RecordIdle(now);
186
166 throttling_helper_.reset(); 187 throttling_helper_.reset();
167 helper_.Shutdown(); 188 helper_.Shutdown();
168 MainThreadOnly().was_shutdown = true; 189 MainThreadOnly().was_shutdown = true;
169 MainThreadOnly().rail_mode_observer = nullptr; 190 MainThreadOnly().rail_mode_observer = nullptr;
170 } 191 }
171 192
172 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() { 193 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() {
173 return base::MakeUnique<WebThreadImplForRendererScheduler>(this); 194 return base::MakeUnique<WebThreadImplForRendererScheduler>(this);
174 } 195 }
175 196
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 } 419 }
399 420
400 void RendererSchedulerImpl::OnRendererBackgrounded() { 421 void RendererSchedulerImpl::OnRendererBackgrounded() {
401 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 422 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
402 "RendererSchedulerImpl::OnRendererBackgrounded"); 423 "RendererSchedulerImpl::OnRendererBackgrounded");
403 helper_.CheckOnValidThread(); 424 helper_.CheckOnValidThread();
404 if (helper_.IsShutdown() || MainThreadOnly().renderer_backgrounded) 425 if (helper_.IsShutdown() || MainThreadOnly().renderer_backgrounded)
405 return; 426 return;
406 427
407 MainThreadOnly().renderer_backgrounded = true; 428 MainThreadOnly().renderer_backgrounded = true;
429
430 base::TimeTicks now = tick_clock()->NowTicks();
431 MainThreadOnly().foreground_renderer_load_tracker.Pause(now);
432 MainThreadOnly().background_renderer_load_tracker.Resume(now);
433
408 if (!MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled) 434 if (!MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled)
409 return; 435 return;
410 436
411 suspend_timers_when_backgrounded_closure_.Cancel(); 437 suspend_timers_when_backgrounded_closure_.Cancel();
412 base::TimeDelta suspend_timers_when_backgrounded_delay = 438 base::TimeDelta suspend_timers_when_backgrounded_delay =
413 base::TimeDelta::FromMilliseconds( 439 base::TimeDelta::FromMilliseconds(
414 kSuspendTimersWhenBackgroundedDelayMillis); 440 kSuspendTimersWhenBackgroundedDelayMillis);
415 control_task_runner_->PostDelayedTask( 441 control_task_runner_->PostDelayedTask(
416 FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(), 442 FROM_HERE, suspend_timers_when_backgrounded_closure_.callback(),
417 suspend_timers_when_backgrounded_delay); 443 suspend_timers_when_backgrounded_delay);
418 } 444 }
419 445
420 void RendererSchedulerImpl::OnRendererForegrounded() { 446 void RendererSchedulerImpl::OnRendererForegrounded() {
421 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 447 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
422 "RendererSchedulerImpl::OnRendererForegrounded"); 448 "RendererSchedulerImpl::OnRendererForegrounded");
423 helper_.CheckOnValidThread(); 449 helper_.CheckOnValidThread();
424 if (helper_.IsShutdown() || !MainThreadOnly().renderer_backgrounded) 450 if (helper_.IsShutdown() || !MainThreadOnly().renderer_backgrounded)
425 return; 451 return;
426 452
427 MainThreadOnly().renderer_backgrounded = false; 453 MainThreadOnly().renderer_backgrounded = false;
428 MainThreadOnly().renderer_suspended = false; 454 MainThreadOnly().renderer_suspended = false;
455
456 base::TimeTicks now = tick_clock()->NowTicks();
457 MainThreadOnly().foreground_renderer_load_tracker.Resume(now);
458 MainThreadOnly().background_renderer_load_tracker.Pause(now);
459
429 suspend_timers_when_backgrounded_closure_.Cancel(); 460 suspend_timers_when_backgrounded_closure_.Cancel();
430 ResumeTimerQueueWhenForegrounded(); 461 ResumeTimerQueueWhenForegrounded();
431 } 462 }
432 463
433 void RendererSchedulerImpl::SuspendRenderer() { 464 void RendererSchedulerImpl::SuspendRenderer() {
434 helper_.CheckOnValidThread(); 465 helper_.CheckOnValidThread();
435 DCHECK(MainThreadOnly().renderer_backgrounded); 466 DCHECK(MainThreadOnly().renderer_backgrounded);
436 if (helper_.IsShutdown()) 467 if (helper_.IsShutdown())
437 return; 468 return;
438 suspend_timers_when_backgrounded_closure_.Cancel(); 469 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."); 1437 " and https://crbug.com/574343#c40 for more information.");
1407 } 1438 }
1408 } 1439 }
1409 1440
1410 void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time, 1441 void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time,
1411 base::TimeTicks end_time) { 1442 base::TimeTicks end_time) {
1412 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(start_time, 1443 MainThreadOnly().queueing_time_estimator.OnToplevelTaskCompleted(start_time,
1413 end_time); 1444 end_time);
1414 MainThreadOnly().long_task_tracker.RecordLongTask( 1445 MainThreadOnly().long_task_tracker.RecordLongTask(
1415 start_time, end_time - start_time); 1446 start_time, end_time - start_time);
1447 MainThreadOnly().foreground_renderer_load_tracker.RecordTaskTime(start_time,
Sami 2016/08/22 14:33:16 Could we only do this for the one active one?
altimin 2016/08/22 15:36:24 Started to bail out early from ThreadLoadTracker::
1448 end_time);
1449 MainThreadOnly().background_renderer_load_tracker.RecordTaskTime(start_time,
1450 end_time);
Sami 2016/08/22 14:33:16 Maybe add a comment saying we'd really want to use
altimin 2016/08/22 15:36:24 Done.
1416 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", 1451 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime",
1417 (end_time - start_time).InMicroseconds(), 1, 1452 (end_time - start_time).InMicroseconds(), 1,
1418 1000000, 50); 1453 1000000, 50);
1419 } 1454 }
1420 1455
1421 LongTaskTracker::LongTaskTiming RendererSchedulerImpl::GetLongTaskTiming() { 1456 LongTaskTracker::LongTaskTiming RendererSchedulerImpl::GetLongTaskTiming() {
1422 return MainThreadOnly().long_task_tracker.GetLongTaskTiming(); 1457 return MainThreadOnly().long_task_tracker.GetLongTaskTiming();
1423 } 1458 }
1424 1459
1425 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( 1460 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated(
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1488 case v8::PERFORMANCE_LOAD: 1523 case v8::PERFORMANCE_LOAD:
1489 return "load"; 1524 return "load";
1490 default: 1525 default:
1491 NOTREACHED(); 1526 NOTREACHED();
1492 return nullptr; 1527 return nullptr;
1493 } 1528 }
1494 } 1529 }
1495 1530
1496 } // namespace scheduler 1531 } // namespace scheduler
1497 } // namespace blink 1532 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698