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

Unified 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: Fix windows compilation 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
index 9c5e33a261fef355db3ff3399cc626aa9141ce70..b378e8d7d3671a4f13a8e714e30a02933acea815 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc
@@ -36,6 +36,21 @@ const double kShortIdlePeriodDurationPercentile = 50;
// Amount of idle time left in a frame (as a ratio of the vsync interval) above
// which main thread compositing can be considered fast.
const double kFastCompositingIdleTimeThreshold = .2;
+
+void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
+ UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad",
+ static_cast<int>(load * 100));
+ TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
+ "RendererScheduler.ForegroundRendererLoad", load);
+}
+
+void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) {
+ UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad",
+ static_cast<int>(load * 100));
+ TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
+ "RendererScheduler.BackgroundRendererLoad", load);
+}
+
} // namespace
RendererSchedulerImpl::RendererSchedulerImpl(
@@ -60,7 +75,8 @@ RendererSchedulerImpl::RendererSchedulerImpl(
helper_.ControlTaskRunner()),
main_thread_only_(this,
compositor_task_runner_,
- helper_.scheduler_tqm_delegate().get()),
+ helper_.scheduler_tqm_delegate().get(),
+ helper_.scheduler_tqm_delegate()->NowTicks()),
policy_may_need_update_(&any_thread_lock_),
weak_factory_(this) {
throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler"));
@@ -110,7 +126,8 @@ RendererSchedulerImpl::~RendererSchedulerImpl() {
RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
RendererSchedulerImpl* renderer_scheduler_impl,
const scoped_refptr<TaskQueue>& compositor_task_runner,
- base::TickClock* time_source)
+ base::TickClock* time_source,
+ base::TimeTicks now)
: loading_task_cost_estimator(time_source,
kLoadingTaskEstimationSampleCount,
kLoadingTaskEstimationPercentile),
@@ -123,6 +140,12 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
time_source,
kShortIdlePeriodDurationSampleCount,
kShortIdlePeriodDurationPercentile),
+ background_main_thread_load_tracker(
+ now,
+ base::Bind(&ReportBackgroundRendererTaskLoad)),
+ foreground_main_thread_load_tracker(
+ now,
+ base::Bind(&ReportForegroundRendererTaskLoad)),
current_use_case(UseCase::NONE),
timer_queue_suspend_count(0),
navigation_task_expected_count(0),
@@ -163,6 +186,10 @@ RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly()
RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {}
void RendererSchedulerImpl::Shutdown() {
+ base::TimeTicks now = tick_clock()->NowTicks();
+ MainThreadOnly().background_main_thread_load_tracker.RecordIdle(now);
+ MainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now);
+
throttling_helper_.reset();
helper_.Shutdown();
MainThreadOnly().was_shutdown = true;
@@ -405,6 +432,11 @@ void RendererSchedulerImpl::OnRendererBackgrounded() {
return;
MainThreadOnly().renderer_backgrounded = true;
+
+ base::TimeTicks now = tick_clock()->NowTicks();
+ MainThreadOnly().foreground_main_thread_load_tracker.Pause(now);
+ MainThreadOnly().background_main_thread_load_tracker.Resume(now);
+
if (!MainThreadOnly().timer_queue_suspension_when_backgrounded_enabled)
return;
@@ -426,6 +458,11 @@ void RendererSchedulerImpl::OnRendererForegrounded() {
MainThreadOnly().renderer_backgrounded = false;
MainThreadOnly().renderer_suspended = false;
+
+ base::TimeTicks now = tick_clock()->NowTicks();
+ MainThreadOnly().foreground_main_thread_load_tracker.Resume(now);
+ MainThreadOnly().background_main_thread_load_tracker.Pause(now);
+
suspend_timers_when_backgrounded_closure_.Cancel();
ResumeTimerQueueWhenForegrounded();
}
@@ -1413,6 +1450,13 @@ void RendererSchedulerImpl::ReportTaskTime(base::TimeTicks start_time,
end_time);
MainThreadOnly().long_task_tracker.RecordLongTask(
start_time, end_time - start_time);
+ // We want to measure thread time here, but for efficiency reasons
+ // we stick with wall time.
+ MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime(
+ start_time, end_time);
+ MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime(
+ start_time, end_time);
+ // TODO(altimin): Per-page metrics should also be considered.
UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime",
(end_time - start_time).InMicroseconds(), 1,
1000000, 50);

Powered by Google App Engine
This is Rietveld 408576698