blob: fd718388840a464652850711d4d6d2ab58e8f87c [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/scheduling_metrics/thread_metrics.h"
namespace scheduling_metrics {
namespace {
// Threshold for discarding ultra-long tasks. It is assumed that ultra-long
// tasks are reporting glitches (e.g. system falling asleep on the middle of the
// task).
constexpr base::TimeDelta kLongTaskDiscardingThreshold =
base::TimeDelta::FromSeconds(30);
} // namespace
ThreadMetrics::ThreadMetrics(ThreadType thread_type,
bool has_cpu_timing_for_each_task)
: thread_type_(thread_type),
has_cpu_timing_for_each_task_(has_cpu_timing_for_each_task),
last_known_time_(has_cpu_timing_for_each_task_ ? base::ThreadTicks::Now()
: base::ThreadTicks()),
thread_task_duration_reporter_(
"Scheduler.Experimental.WallTimePerThread"),
thread_task_cpu_duration_reporter_(
"Scheduler.Experimental.CPUTimePerThread"),
tracked_cpu_duration_reporter_(
"Scheduler.Experimental.CPUTimePerThread.Tracked"),
non_tracked_cpu_duration_reporter_(
"Scheduler.Experimental.CPUTimePerThread.Untracked") {}
ThreadMetrics::~ThreadMetrics() {}
bool ThreadMetrics::ShouldDiscardTask(
base::sequence_manager::TaskQueue* queue,
const base::sequence_manager::Task& task,
const base::sequence_manager::TaskQueue::TaskTiming& task_timing) {
// TODO(altimin): Investigate the relationship between thread time and
// wall time for discarded tasks.
return task_timing.wall_duration() > kLongTaskDiscardingThreshold;
}
void ThreadMetrics::RecordTaskMetrics(
base::sequence_manager::TaskQueue* queue,
const base::sequence_manager::Task& task,
const base::sequence_manager::TaskQueue::TaskTiming& task_timing) {
DCHECK(!has_cpu_timing_for_each_task_ || task_timing.has_thread_time());
thread_task_duration_reporter_.RecordTask(thread_type_,
task_timing.wall_duration());
if (!task_timing.has_thread_time())
return;
thread_task_cpu_duration_reporter_.RecordTask(thread_type_,
task_timing.thread_duration());
if (has_cpu_timing_for_each_task_) {
non_tracked_cpu_duration_reporter_.RecordTask(
thread_type_, task_timing.start_thread_time() - last_known_time_);
tracked_cpu_duration_reporter_.RecordTask(thread_type_,
task_timing.thread_duration());
last_known_time_ = task_timing.end_thread_time();
}
}
} // namespace scheduling_metrics