thread_metrics.cc 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/scheduling_metrics/thread_metrics.h"
  5. namespace scheduling_metrics {
  6. namespace {
  7. // Threshold for discarding ultra-long tasks. It is assumed that ultra-long
  8. // tasks are reporting glitches (e.g. system falling asleep on the middle of the
  9. // task).
  10. constexpr base::TimeDelta kLongTaskDiscardingThreshold = base::Seconds(30);
  11. } // namespace
  12. ThreadMetrics::ThreadMetrics(ThreadType thread_type,
  13. bool has_cpu_timing_for_each_task)
  14. : thread_type_(thread_type),
  15. has_cpu_timing_for_each_task_(has_cpu_timing_for_each_task),
  16. last_known_time_(has_cpu_timing_for_each_task_ ? base::ThreadTicks::Now()
  17. : base::ThreadTicks()),
  18. thread_task_duration_reporter_(
  19. "Scheduler.Experimental.WallTimePerThread"),
  20. thread_task_cpu_duration_reporter_(
  21. "Scheduler.Experimental.CPUTimePerThread"),
  22. tracked_cpu_duration_reporter_(
  23. "Scheduler.Experimental.CPUTimePerThread.Tracked"),
  24. non_tracked_cpu_duration_reporter_(
  25. "Scheduler.Experimental.CPUTimePerThread.Untracked") {}
  26. ThreadMetrics::~ThreadMetrics() {}
  27. bool ThreadMetrics::ShouldDiscardTask(
  28. const base::sequence_manager::Task& task,
  29. const base::sequence_manager::TaskQueue::TaskTiming& task_timing) {
  30. // TODO(altimin): Investigate the relationship between thread time and
  31. // wall time for discarded tasks.
  32. return task_timing.wall_duration() > kLongTaskDiscardingThreshold;
  33. }
  34. void ThreadMetrics::RecordTaskMetrics(
  35. const base::sequence_manager::Task& task,
  36. const base::sequence_manager::TaskQueue::TaskTiming& task_timing) {
  37. DCHECK(!has_cpu_timing_for_each_task_ || task_timing.has_thread_time());
  38. thread_task_duration_reporter_.RecordTask(thread_type_,
  39. task_timing.wall_duration());
  40. if (!task_timing.has_thread_time())
  41. return;
  42. thread_task_cpu_duration_reporter_.RecordTask(thread_type_,
  43. task_timing.thread_duration());
  44. if (has_cpu_timing_for_each_task_) {
  45. non_tracked_cpu_duration_reporter_.RecordTask(
  46. thread_type_, task_timing.start_thread_time() - last_known_time_);
  47. tracked_cpu_duration_reporter_.RecordTask(thread_type_,
  48. task_timing.thread_duration());
  49. last_known_time_ = task_timing.end_thread_time();
  50. }
  51. }
  52. } // namespace scheduling_metrics