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/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 Loading... | |
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 |
OLD | NEW |