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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc

Issue 2755953003: [scheduler] Add RendererScheduler.TaskDurationPerQueueType. (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/renderer/renderer_scheduler_impl.h" 5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/stack_trace.h" 8 #include "base/debug/stack_trace.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
11 #include "base/metrics/histogram.h"
11 #include "base/metrics/histogram_macros.h" 12 #include "base/metrics/histogram_macros.h"
12 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
13 #include "base/threading/thread_task_runner_handle.h" 14 #include "base/threading/thread_task_runner_handle.h"
14 #include "base/trace_event/trace_event.h" 15 #include "base/trace_event/trace_event.h"
15 #include "base/trace_event/trace_event_argument.h" 16 #include "base/trace_event/trace_event_argument.h"
16 #include "cc/output/begin_frame_args.h" 17 #include "cc/output/begin_frame_args.h"
17 #include "platform/RuntimeEnabledFeatures.h" 18 #include "platform/RuntimeEnabledFeatures.h"
18 #include "platform/scheduler/base/real_time_domain.h" 19 #include "platform/scheduler/base/real_time_domain.h"
19 #include "platform/scheduler/base/task_queue_impl.h" 20 #include "platform/scheduler/base/task_queue_impl.h"
20 #include "platform/scheduler/base/task_queue_selector.h" 21 #include "platform/scheduler/base/task_queue_selector.h"
(...skipping 21 matching lines...) Expand all
42 // Amount of idle time left in a frame (as a ratio of the vsync interval) above 43 // Amount of idle time left in a frame (as a ratio of the vsync interval) above
43 // which main thread compositing can be considered fast. 44 // which main thread compositing can be considered fast.
44 const double kFastCompositingIdleTimeThreshold = .2; 45 const double kFastCompositingIdleTimeThreshold = .2;
45 constexpr base::TimeDelta kThreadLoadTrackerReportingInterval = 46 constexpr base::TimeDelta kThreadLoadTrackerReportingInterval =
46 base::TimeDelta::FromMinutes(1); 47 base::TimeDelta::FromMinutes(1);
47 constexpr base::TimeDelta kThreadLoadTrackerWaitingPeriodBeforeReporting = 48 constexpr base::TimeDelta kThreadLoadTrackerWaitingPeriodBeforeReporting =
48 base::TimeDelta::FromMinutes(2); 49 base::TimeDelta::FromMinutes(2);
49 // We do not throttle anything while audio is played and shortly after that. 50 // We do not throttle anything while audio is played and shortly after that.
50 constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed = 51 constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed =
51 base::TimeDelta::FromSeconds(5); 52 base::TimeDelta::FromSeconds(5);
53 // Maximal bound on task duration for reporting.
54 constexpr base::TimeDelta kMaxTaskDurationForReporting =
55 base::TimeDelta::FromMinutes(1);
52 56
53 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { 57 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
54 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled()) 58 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled())
55 return; 59 return;
56 60
57 int load_percentage = static_cast<int>(load * 100); 61 int load_percentage = static_cast<int>(load * 100);
58 // TODO(altimin): Revert back to DCHECK. 62 // TODO(altimin): Revert back to DCHECK.
59 CHECK_LE(load_percentage, 100); 63 CHECK_LE(load_percentage, 100);
60 64
61 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", 65 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad",
(...skipping 1709 matching lines...) Expand 10 before | Expand all | Expand 10 after
1771 1775
1772 task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks, 1776 task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks,
1773 end_time_ticks); 1777 end_time_ticks);
1774 1778
1775 // We want to measure thread time here, but for efficiency reasons 1779 // We want to measure thread time here, but for efficiency reasons
1776 // we stick with wall time. 1780 // we stick with wall time.
1777 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( 1781 MainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime(
1778 start_time_ticks, end_time_ticks); 1782 start_time_ticks, end_time_ticks);
1779 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( 1783 MainThreadOnly().background_main_thread_load_tracker.RecordTaskTime(
1780 start_time_ticks, end_time_ticks); 1784 start_time_ticks, end_time_ticks);
1785
1781 // TODO(altimin): Per-page metrics should also be considered. 1786 // TODO(altimin): Per-page metrics should also be considered.
1782 UMA_HISTOGRAM_CUSTOM_COUNTS( 1787 RecordTaskMetrics(task_queue->GetQueueType(),
1783 "RendererScheduler.TaskTime", 1788 end_time_ticks - start_time_ticks);
1784 (end_time_ticks - start_time_ticks).InMicroseconds(), 1, 1000000, 50); 1789 }
1790
1791 void RendererSchedulerImpl::RecordTaskMetrics(TaskQueue::QueueType queue_type,
1792 base::TimeDelta duration) {
1793 duration = std::min(duration, kMaxTaskDurationForReporting);
1794
1795 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime",
1796 duration.InMicroseconds(), 1, 1000000, 50);
Ilya Sherman 2017/03/16 21:23:43 Optional nit: The constant 1000000 would be easier
altimin 2017/03/16 23:44:23 Done.
1797
1785 UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType", 1798 UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType",
1786 static_cast<int>(task_queue->GetQueueType()), 1799 static_cast<int>(queue_type),
1787 static_cast<int>(TaskQueue::QueueType::COUNT)); 1800 static_cast<int>(TaskQueue::QueueType::COUNT));
1801
1802 // Report only whole milliseconds to avoid overflow.
1803 base::TimeDelta& total_duration =
1804 MainThreadOnly()
1805 .task_duration_per_queue_type[static_cast<int>(queue_type)];
1806 total_duration += duration;
1807 int64_t milliseconds = total_duration.InMilliseconds();
1808 if (milliseconds > 0) {
1809 total_duration -= base::TimeDelta::FromMilliseconds(milliseconds);
1810 base::Histogram::FactoryGet("RendererScheduler.TaskDurationPerQueueType", 0,
Ilya Sherman 2017/03/16 21:23:43 The min value should be 1, not 0.
altimin 2017/03/16 23:44:22 Done.
1811 static_cast<int>(TaskQueue::QueueType::COUNT),
1812 static_cast<int>(TaskQueue::QueueType::COUNT),
Ilya Sherman 2017/03/16 21:23:43 This should be COUNT+1 -- the final bucket should
altimin 2017/03/16 23:44:23 Done. To be clear — if my samples are in range [0.
Ilya Sherman 2017/03/16 23:58:45 Correct. Yeah, it's a fairly confusing API, sorry
1813 base::HistogramBase::kUmaTargetedHistogramFlag)
1814 ->AddCount(static_cast<int>(queue_type),
1815 static_cast<int>(milliseconds));
Ilya Sherman 2017/03/16 21:23:43 It looks like histograms aggregate values in 32-bi
altimin 2017/03/16 23:44:22 By design we're expecting number of samples to be
Ilya Sherman 2017/03/16 23:58:45 Metrics are not reset on each upload -- we simply
altimin 2017/03/17 00:24:00 That's insightful, thanks. Any chance we could sta
Ilya Sherman 2017/03/17 20:27:36 I think we'd need to measure whether there are any
altimin 2017/03/17 23:49:53 I took a quick look at this — it seems that absenc
Ilya Sherman 2017/03/18 01:09:59 Hmm, I guess it depends on how much of a maintenan
1816 }
1788 } 1817 }
1789 1818
1790 void RendererSchedulerImpl::AddTaskTimeObserver( 1819 void RendererSchedulerImpl::AddTaskTimeObserver(
1791 TaskTimeObserver* task_time_observer) { 1820 TaskTimeObserver* task_time_observer) {
1792 helper_.AddTaskTimeObserver(task_time_observer); 1821 helper_.AddTaskTimeObserver(task_time_observer);
1793 } 1822 }
1794 1823
1795 void RendererSchedulerImpl::RemoveTaskTimeObserver( 1824 void RendererSchedulerImpl::RemoveTaskTimeObserver(
1796 TaskTimeObserver* task_time_observer) { 1825 TaskTimeObserver* task_time_observer) {
1797 helper_.RemoveTaskTimeObserver(task_time_observer); 1826 helper_.RemoveTaskTimeObserver(task_time_observer);
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 case TimeDomainType::VIRTUAL: 1944 case TimeDomainType::VIRTUAL:
1916 return "virtual"; 1945 return "virtual";
1917 default: 1946 default:
1918 NOTREACHED(); 1947 NOTREACHED();
1919 return nullptr; 1948 return nullptr;
1920 } 1949 }
1921 } 1950 }
1922 1951
1923 } // namespace scheduler 1952 } // namespace scheduler
1924 } // namespace blink 1953 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698