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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/child/worker_scheduler_impl.cc

Issue 2749383003: WorkerThread CPU Load UMA (Closed)
Patch Set: . Created 3 years, 9 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/child/worker_scheduler_impl.h" 5 #include "platform/scheduler/child/worker_scheduler_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/metrics/histogram_macros.h"
8 #include "base/trace_event/trace_event.h" 9 #include "base/trace_event/trace_event.h"
9 #include "base/trace_event/trace_event_argument.h" 10 #include "base/trace_event/trace_event_argument.h"
11 #include "platform/scheduler/base/time_converter.h"
12 #include "platform/scheduler/child/scheduler_tqm_delegate.h"
10 #include "public/platform/scheduler/base/task_queue.h" 13 #include "public/platform/scheduler/base/task_queue.h"
11 #include "platform/scheduler/child/scheduler_tqm_delegate.h"
12 14
13 namespace blink { 15 namespace blink {
14 namespace scheduler { 16 namespace scheduler {
15 17
18 namespace {
19 // Workers could be short-lived, set a shorter interval than
20 // the renderer thread.
21 constexpr base::TimeDelta kThreadLoadTrackerReportingInterval =
22 base::TimeDelta::FromSeconds(30);
23 constexpr base::TimeDelta kThreadLoadTrackerWaitingPeriodBeforeReporting =
24 base::TimeDelta::FromSeconds(30);
altimin 2017/03/22 22:25:24 I wonder if we should use lower windows for these
kinuko 2017/03/23 05:42:32 Matt, Hiroki- any thoughts here? Shorter time mak
falken 2017/03/23 06:48:05 At first I was worried that a 1 second reporting i
kinuko 2017/03/23 07:00:20 Looking into the code it looks we can correctly lo
kinuko 2017/04/03 13:01:20 Ok, from the UMA looks like about 85% of workers l
25
26 void ReportWorkerTaskLoad(base::TimeTicks time, double load) {
27 int load_percentage = static_cast<int>(load * 100);
28 DCHECK_LE(load_percentage, 100);
29 // TODO(kinuko): Maybe we also want to separately log when the associated
30 // tab is in foreground and when not.
31 UMA_HISTOGRAM_PERCENTAGE("WorkerScheduler.WorkerThreadLoad", load_percentage);
32 }
33
34 } // namespace
35
16 WorkerSchedulerImpl::WorkerSchedulerImpl( 36 WorkerSchedulerImpl::WorkerSchedulerImpl(
17 scoped_refptr<SchedulerTqmDelegate> main_task_runner) 37 scoped_refptr<SchedulerTqmDelegate> main_task_runner)
18 : helper_(main_task_runner, 38 : helper_(main_task_runner,
19 "worker.scheduler", 39 "worker.scheduler",
20 TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), 40 TRACE_DISABLED_BY_DEFAULT("worker.scheduler"),
21 TRACE_DISABLED_BY_DEFAULT("worker.scheduler.debug")), 41 TRACE_DISABLED_BY_DEFAULT("worker.scheduler.debug")),
22 idle_helper_(&helper_, 42 idle_helper_(&helper_,
23 this, 43 this,
24 "worker.scheduler", 44 "worker.scheduler",
25 TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), 45 TRACE_DISABLED_BY_DEFAULT("worker.scheduler"),
26 "WorkerSchedulerIdlePeriod", 46 "WorkerSchedulerIdlePeriod",
27 base::TimeDelta::FromMilliseconds(300)), 47 base::TimeDelta::FromMilliseconds(300)),
28 idle_canceled_delayed_task_sweeper_("worker.scheduler", 48 idle_canceled_delayed_task_sweeper_("worker.scheduler",
29 &helper_, 49 &helper_,
30 idle_helper_.IdleTaskRunner()) { 50 idle_helper_.IdleTaskRunner()),
51 load_tracker_(helper_.scheduler_tqm_delegate()->NowTicks(),
52 base::Bind(&ReportWorkerTaskLoad),
53 kThreadLoadTrackerReportingInterval,
54 kThreadLoadTrackerWaitingPeriodBeforeReporting) {
31 initialized_ = false; 55 initialized_ = false;
56 load_tracker_.Resume(helper_.scheduler_tqm_delegate()->NowTicks());
57 helper_.AddTaskTimeObserver(this);
32 TRACE_EVENT_OBJECT_CREATED_WITH_ID( 58 TRACE_EVENT_OBJECT_CREATED_WITH_ID(
33 TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), "WorkerScheduler", this); 59 TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), "WorkerScheduler", this);
34 } 60 }
35 61
36 WorkerSchedulerImpl::~WorkerSchedulerImpl() { 62 WorkerSchedulerImpl::~WorkerSchedulerImpl() {
37 TRACE_EVENT_OBJECT_DELETED_WITH_ID( 63 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
38 TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), "WorkerScheduler", this); 64 TRACE_DISABLED_BY_DEFAULT("worker.scheduler"), "WorkerScheduler", this);
65 helper_.RemoveTaskTimeObserver(this);
39 } 66 }
40 67
41 void WorkerSchedulerImpl::Init() { 68 void WorkerSchedulerImpl::Init() {
42 initialized_ = true; 69 initialized_ = true;
43 idle_helper_.EnableLongIdlePeriod(); 70 idle_helper_.EnableLongIdlePeriod();
44 } 71 }
45 72
46 scoped_refptr<TaskQueue> WorkerSchedulerImpl::DefaultTaskRunner() { 73 scoped_refptr<TaskQueue> WorkerSchedulerImpl::DefaultTaskRunner() {
47 DCHECK(initialized_); 74 DCHECK(initialized_);
48 return helper_.DefaultTaskRunner(); 75 return helper_.DefaultTaskRunner();
(...skipping 21 matching lines...) Expand all
70 helper_.AddTaskObserver(task_observer); 97 helper_.AddTaskObserver(task_observer);
71 } 98 }
72 99
73 void WorkerSchedulerImpl::RemoveTaskObserver( 100 void WorkerSchedulerImpl::RemoveTaskObserver(
74 base::MessageLoop::TaskObserver* task_observer) { 101 base::MessageLoop::TaskObserver* task_observer) {
75 DCHECK(initialized_); 102 DCHECK(initialized_);
76 helper_.RemoveTaskObserver(task_observer); 103 helper_.RemoveTaskObserver(task_observer);
77 } 104 }
78 105
79 void WorkerSchedulerImpl::Shutdown() { 106 void WorkerSchedulerImpl::Shutdown() {
107 load_tracker_.RecordIdle(helper_.scheduler_tqm_delegate()->NowTicks());
80 DCHECK(initialized_); 108 DCHECK(initialized_);
81 helper_.Shutdown(); 109 helper_.Shutdown();
82 } 110 }
83 111
84 SchedulerHelper* WorkerSchedulerImpl::GetSchedulerHelperForTesting() { 112 SchedulerHelper* WorkerSchedulerImpl::GetSchedulerHelperForTesting() {
85 return &helper_; 113 return &helper_;
86 } 114 }
87 115
88 bool WorkerSchedulerImpl::CanEnterLongIdlePeriod(base::TimeTicks, 116 bool WorkerSchedulerImpl::CanEnterLongIdlePeriod(base::TimeTicks,
89 base::TimeDelta*) { 117 base::TimeDelta*) {
90 return true; 118 return true;
91 } 119 }
92 120
93 base::TimeTicks WorkerSchedulerImpl::CurrentIdleTaskDeadlineForTesting() const { 121 base::TimeTicks WorkerSchedulerImpl::CurrentIdleTaskDeadlineForTesting() const {
94 return idle_helper_.CurrentIdleTaskDeadline(); 122 return idle_helper_.CurrentIdleTaskDeadline();
95 } 123 }
96 124
125 void WorkerSchedulerImpl::willProcessTask(TaskQueue* task_queue,
126 double start_time) {}
127
128 void WorkerSchedulerImpl::didProcessTask(TaskQueue* task_queue,
129 double start_time,
130 double end_time) {
131 base::TimeTicks start_time_ticks =
132 MonotonicTimeInSecondsToTimeTicks(start_time);
133 base::TimeTicks end_time_ticks = MonotonicTimeInSecondsToTimeTicks(end_time);
kinuko 2017/03/22 09:41:10 I tried to make the code consistent here (i.e. usi
134
135 load_tracker_.RecordTaskTime(start_time_ticks, end_time_ticks);
136 }
137
97 } // namespace scheduler 138 } // namespace scheduler
98 } // namespace blink 139 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698