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

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

Issue 2859723004: [Blink-Scheduler] Distinguish between normal and foreground-only renderers for monitoring load. (Closed)
Patch Set: --- Created 3 years, 7 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 26ec5d2df11d607f9cb0cb94771beb4af7dae6ba..f13e861e79e0f44b5756fc9dc15d1c12873cba1d 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
@@ -64,8 +64,8 @@ void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
int load_percentage = static_cast<int>(load * 100);
DCHECK_LE(load_percentage, 100);
- UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad",
- load_percentage);
+ UMA_HISTOGRAM_PERCENTAGE(
+ "RendererScheduler.ForegroundRendererMainThreadLoad2", load_percentage);
TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
"RendererScheduler.ForegroundRendererLoad", load_percentage);
}
@@ -83,10 +83,26 @@ void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) {
"RendererScheduler.BackgroundRendererLoad", load_percentage);
}
+void ReportForegroundOnlyRendererTaskLoad(base::TimeTicks time, double load) {
+ if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled())
+ return;
+
+ int load_percentage = static_cast<int>(load * 100);
+ DCHECK_LE(load_percentage, 100);
+
+ UMA_HISTOGRAM_PERCENTAGE(
+ "RendererScheduler.ForegroundOnlyRendererMainThreadLoad",
+ load_percentage);
+ TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
+ "RendererScheduler.ForegroundOnlyRendererLoad",
+ load_percentage);
+}
+
} // namespace
RendererSchedulerImpl::RendererSchedulerImpl(
- scoped_refptr<SchedulerTqmDelegate> main_task_runner)
+ scoped_refptr<SchedulerTqmDelegate> main_task_runner,
+ RendererType type)
: helper_(main_task_runner),
idle_helper_(&helper_,
this,
@@ -107,10 +123,12 @@ RendererSchedulerImpl::RendererSchedulerImpl(
helper_.ControlTaskQueue()),
seqlock_queueing_time_estimator_(
QueueingTimeEstimator(this, kQueueingTimeWindowDuration, 20)),
+ type_(type),
main_thread_only_(this,
compositor_task_queue_,
helper_.scheduler_tqm_delegate().get(),
- helper_.scheduler_tqm_delegate()->NowTicks()),
+ helper_.scheduler_tqm_delegate()->NowTicks(),
+ type),
policy_may_need_update_(&any_thread_lock_),
weak_factory_(this) {
task_queue_throttler_.reset(new TaskQueueThrottler(this));
@@ -175,7 +193,8 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
RendererSchedulerImpl* renderer_scheduler_impl,
const scoped_refptr<TaskQueue>& compositor_task_runner,
base::TickClock* time_source,
- base::TimeTicks now)
+ base::TimeTicks now,
+ RendererType type)
: loading_task_cost_estimator(time_source,
kLoadingTaskEstimationSampleCount,
kLoadingTaskEstimationPercentile),
@@ -186,16 +205,6 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
time_source,
kShortIdlePeriodDurationSampleCount,
kShortIdlePeriodDurationPercentile),
- background_main_thread_load_tracker(
- now,
- base::Bind(&ReportBackgroundRendererTaskLoad),
- kThreadLoadTrackerReportingInterval,
- kThreadLoadTrackerWaitingPeriodBeforeReporting),
- foreground_main_thread_load_tracker(
- now,
- base::Bind(&ReportForegroundRendererTaskLoad),
- kThreadLoadTrackerReportingInterval,
- kThreadLoadTrackerWaitingPeriodBeforeReporting),
current_use_case(UseCase::NONE),
timer_queue_suspend_count(0),
navigation_task_expected_count(0),
@@ -225,7 +234,24 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
static_cast<int>(TaskQueue::QueueType::COUNT),
static_cast<int>(TaskQueue::QueueType::COUNT) + 1,
base::HistogramBase::kUmaTargetedHistogramFlag)) {
- foreground_main_thread_load_tracker.Resume(now);
+ if (type == RendererType::kForegroundAndBackground) {
+ background_main_thread_load_tracker = base::MakeUnique<ThreadLoadTracker>(
+ now, base::Bind(&ReportBackgroundRendererTaskLoad),
+ kThreadLoadTrackerReportingInterval,
+ kThreadLoadTrackerWaitingPeriodBeforeReporting);
+ foreground_main_thread_load_tracker = base::MakeUnique<ThreadLoadTracker>(
+ now, base::Bind(&ReportForegroundRendererTaskLoad),
+ kThreadLoadTrackerReportingInterval,
+ kThreadLoadTrackerWaitingPeriodBeforeReporting);
+ foreground_main_thread_load_tracker->Resume(now);
+ } else {
+ foreground_only_main_thread_load_tracker =
+ base::MakeUnique<ThreadLoadTracker>(
+ now, base::Bind(&ReportForegroundOnlyRendererTaskLoad),
+ kThreadLoadTrackerReportingInterval,
+ kThreadLoadTrackerWaitingPeriodBeforeReporting);
+ foreground_only_main_thread_load_tracker->Resume(now);
+ }
}
RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {}
@@ -250,8 +276,13 @@ RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {}
void RendererSchedulerImpl::Shutdown() {
base::TimeTicks now = tick_clock()->NowTicks();
- GetMainThreadOnly().background_main_thread_load_tracker.RecordIdle(now);
- GetMainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now);
+ if (type_ == RendererType::kForegroundAndBackground) {
+ GetMainThreadOnly().background_main_thread_load_tracker->RecordIdle(now);
+ GetMainThreadOnly().foreground_main_thread_load_tracker->RecordIdle(now);
+ } else {
+ GetMainThreadOnly().foreground_only_main_thread_load_tracker->RecordIdle(
+ now);
+ }
task_queue_throttler_.reset();
helper_.Shutdown();
@@ -550,6 +581,8 @@ void RendererSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler(
void RendererSchedulerImpl::OnRendererBackgrounded() {
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
"RendererSchedulerImpl::OnRendererBackgrounded");
+ DCHECK_EQ(RendererType::kForegroundAndBackground, type_);
+
helper_.CheckOnValidThread();
if (helper_.IsShutdown() || GetMainThreadOnly().renderer_backgrounded)
return;
@@ -559,8 +592,8 @@ void RendererSchedulerImpl::OnRendererBackgrounded() {
UpdatePolicy();
base::TimeTicks now = tick_clock()->NowTicks();
- GetMainThreadOnly().foreground_main_thread_load_tracker.Pause(now);
- GetMainThreadOnly().background_main_thread_load_tracker.Resume(now);
+ GetMainThreadOnly().foreground_main_thread_load_tracker->Pause(now);
+ GetMainThreadOnly().background_main_thread_load_tracker->Resume(now);
if (!GetMainThreadOnly().timer_queue_suspension_when_backgrounded_enabled)
return;
@@ -581,14 +614,17 @@ void RendererSchedulerImpl::OnRendererForegrounded() {
if (helper_.IsShutdown() || !GetMainThreadOnly().renderer_backgrounded)
return;
+ // A foreground-only renderer would not have been backgrounded.
+ DCHECK_EQ(RendererType::kForegroundAndBackground, type_);
+
GetMainThreadOnly().renderer_backgrounded = false;
GetMainThreadOnly().renderer_suspended = false;
UpdatePolicy();
base::TimeTicks now = tick_clock()->NowTicks();
- GetMainThreadOnly().foreground_main_thread_load_tracker.Resume(now);
- GetMainThreadOnly().background_main_thread_load_tracker.Pause(now);
+ GetMainThreadOnly().foreground_main_thread_load_tracker->Resume(now);
+ GetMainThreadOnly().background_main_thread_load_tracker->Pause(now);
suspend_timers_when_backgrounded_closure_.Cancel();
ResumeTimerQueueWhenForegroundedOrResumed();
@@ -1836,10 +1872,16 @@ void RendererSchedulerImpl::DidProcessTask(TaskQueue* task_queue,
// We want to measure thread time here, but for efficiency reasons
// we stick with wall time.
- GetMainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime(
- start_time_ticks, end_time_ticks);
- GetMainThreadOnly().background_main_thread_load_tracker.RecordTaskTime(
- start_time_ticks, end_time_ticks);
+ if (type_ == RendererType::kForegroundAndBackground) {
+ GetMainThreadOnly().foreground_main_thread_load_tracker->RecordTaskTime(
+ start_time_ticks, end_time_ticks);
+ GetMainThreadOnly().background_main_thread_load_tracker->RecordTaskTime(
+ start_time_ticks, end_time_ticks);
+ } else {
+ GetMainThreadOnly()
+ .foreground_only_main_thread_load_tracker->RecordTaskTime(
+ start_time_ticks, end_time_ticks);
+ }
// TODO(altimin): Per-page metrics should also be considered.
RecordTaskMetrics(task_queue->GetQueueType(),

Powered by Google App Engine
This is Rietveld 408576698