Chromium Code Reviews| 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 |