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

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

Issue 2866613002: EQT: Change Expected Queuing Time from per-second to sliding window (Closed)
Patch Set: uma report per window duration; sliding window include the starting points Created 3 years, 7 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"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 // 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
44 // which main thread compositing can be considered fast. 44 // which main thread compositing can be considered fast.
45 const double kFastCompositingIdleTimeThreshold = .2; 45 const double kFastCompositingIdleTimeThreshold = .2;
46 constexpr base::TimeDelta kThreadLoadTrackerReportingInterval = 46 constexpr base::TimeDelta kThreadLoadTrackerReportingInterval =
47 base::TimeDelta::FromMinutes(1); 47 base::TimeDelta::FromMinutes(1);
48 constexpr base::TimeDelta kThreadLoadTrackerWaitingPeriodBeforeReporting = 48 constexpr base::TimeDelta kThreadLoadTrackerWaitingPeriodBeforeReporting =
49 base::TimeDelta::FromMinutes(2); 49 base::TimeDelta::FromMinutes(2);
50 // 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.
51 constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed = 51 constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed =
52 base::TimeDelta::FromSeconds(5); 52 base::TimeDelta::FromSeconds(5);
53 constexpr base::TimeDelta kQueueingTimeWindowDuration =
54 base::TimeDelta::FromSeconds(1);
53 55
54 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { 56 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
55 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled()) 57 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled())
56 return; 58 return;
57 59
58 int load_percentage = static_cast<int>(load * 100); 60 int load_percentage = static_cast<int>(load * 100);
59 DCHECK_LE(load_percentage, 100); 61 DCHECK_LE(load_percentage, 100);
60 62
61 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", 63 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad",
62 load_percentage); 64 load_percentage);
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 compositor_task_queue_( 101 compositor_task_queue_(
100 helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR) 102 helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR)
101 .SetShouldMonitorQuiescence(true))), 103 .SetShouldMonitorQuiescence(true))),
102 compositor_task_queue_enabled_voter_( 104 compositor_task_queue_enabled_voter_(
103 compositor_task_queue_->CreateQueueEnabledVoter()), 105 compositor_task_queue_->CreateQueueEnabledVoter()),
104 delayed_update_policy_runner_( 106 delayed_update_policy_runner_(
105 base::Bind(&RendererSchedulerImpl::UpdatePolicy, 107 base::Bind(&RendererSchedulerImpl::UpdatePolicy,
106 base::Unretained(this)), 108 base::Unretained(this)),
107 helper_.ControlTaskQueue()), 109 helper_.ControlTaskQueue()),
108 seqlock_queueing_time_estimator_( 110 seqlock_queueing_time_estimator_(
109 QueueingTimeEstimator(this, base::TimeDelta::FromSeconds(1))), 111 QueueingTimeEstimator(this, kQueueingTimeWindowDuration, 20)),
110 main_thread_only_(this, 112 main_thread_only_(this,
111 compositor_task_queue_, 113 compositor_task_queue_,
112 helper_.scheduler_tqm_delegate().get(), 114 helper_.scheduler_tqm_delegate().get(),
113 helper_.scheduler_tqm_delegate()->NowTicks()), 115 helper_.scheduler_tqm_delegate()->NowTicks()),
114 policy_may_need_update_(&any_thread_lock_), 116 policy_may_need_update_(&any_thread_lock_),
115 weak_factory_(this) { 117 weak_factory_(this) {
116 task_queue_throttler_.reset(new TaskQueueThrottler(this)); 118 task_queue_throttler_.reset(new TaskQueueThrottler(this));
117 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, 119 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy,
118 weak_factory_.GetWeakPtr()); 120 weak_factory_.GetWeakPtr());
119 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( 121 end_renderer_hidden_idle_period_closure_.Reset(base::Bind(
(...skipping 1543 matching lines...) Expand 10 before | Expand all | Expand 10 after
1663 void RendererSchedulerImpl::SetRAILModeObserver(RAILModeObserver* observer) { 1665 void RendererSchedulerImpl::SetRAILModeObserver(RAILModeObserver* observer) {
1664 GetMainThreadOnly().rail_mode_observer = observer; 1666 GetMainThreadOnly().rail_mode_observer = observer;
1665 } 1667 }
1666 1668
1667 bool RendererSchedulerImpl::MainThreadSeemsUnresponsive( 1669 bool RendererSchedulerImpl::MainThreadSeemsUnresponsive(
1668 base::TimeDelta main_thread_responsiveness_threshold) { 1670 base::TimeDelta main_thread_responsiveness_threshold) {
1669 base::TimeTicks now = tick_clock()->NowTicks(); 1671 base::TimeTicks now = tick_clock()->NowTicks();
1670 base::TimeDelta estimated_queueing_time; 1672 base::TimeDelta estimated_queueing_time;
1671 1673
1672 bool can_read = false; 1674 bool can_read = false;
1673 QueueingTimeEstimator::State queueing_time_estimator_state;
1674 1675
1675 base::subtle::Atomic32 version; 1676 base::subtle::Atomic32 version;
1676 seqlock_queueing_time_estimator_.seqlock.TryRead(&can_read, &version); 1677 seqlock_queueing_time_estimator_.seqlock.TryRead(&can_read, &version);
1677 1678
1678 // If we fail to determine if the main thread is busy, assume whether or not 1679 // If we fail to determine if the main thread is busy, assume whether or not
1679 // it's busy hasn't change since the last time we asked. 1680 // it's busy hasn't change since the last time we asked.
1680 if (!can_read) 1681 if (!can_read)
1681 return GetCompositorThreadOnly().main_thread_seems_unresponsive; 1682 return GetCompositorThreadOnly().main_thread_seems_unresponsive;
1682 1683
1683 queueing_time_estimator_state = 1684 QueueingTimeEstimator::State queueing_time_estimator_state =
1684 seqlock_queueing_time_estimator_.data.GetState(); 1685 seqlock_queueing_time_estimator_.data.GetState();
1685 1686
1686 // If we fail to determine if the main thread is busy, assume whether or not 1687 // If we fail to determine if the main thread is busy, assume whether or not
1687 // it's busy hasn't change since the last time we asked. 1688 // it's busy hasn't change since the last time we asked.
1688 if (seqlock_queueing_time_estimator_.seqlock.ReadRetry(version)) 1689 if (seqlock_queueing_time_estimator_.seqlock.ReadRetry(version))
1689 return GetCompositorThreadOnly().main_thread_seems_unresponsive; 1690 return GetCompositorThreadOnly().main_thread_seems_unresponsive;
1690 1691
1691 QueueingTimeEstimator queueing_time_estimator(queueing_time_estimator_state); 1692 QueueingTimeEstimator queueing_time_estimator(queueing_time_estimator_state);
1692 1693
1693 estimated_queueing_time = 1694 estimated_queueing_time =
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1824 TaskTimeObserver* task_time_observer) { 1825 TaskTimeObserver* task_time_observer) {
1825 helper_.AddTaskTimeObserver(task_time_observer); 1826 helper_.AddTaskTimeObserver(task_time_observer);
1826 } 1827 }
1827 1828
1828 void RendererSchedulerImpl::RemoveTaskTimeObserver( 1829 void RendererSchedulerImpl::RemoveTaskTimeObserver(
1829 TaskTimeObserver* task_time_observer) { 1830 TaskTimeObserver* task_time_observer) {
1830 helper_.RemoveTaskTimeObserver(task_time_observer); 1831 helper_.RemoveTaskTimeObserver(task_time_observer);
1831 } 1832 }
1832 1833
1833 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( 1834 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated(
1834 base::TimeDelta queueing_time) { 1835 base::TimeDelta queueing_time,
1836 base::TimeTicks window_start_time) {
1837 // RendererScheduler reports the queueing time once per window's duration.
1838 // |stepEQT|stepEQT|stepEQT|stepEQT|stepEQT|stepEQT|
1839 // Report: |-------window EQT------|
1840 // Discard: |-------window EQT------|
1841 // Discard: |-------window EQT------|
1842 // Report: |-------window EQT------|
1843 if (window_start_time - this->uma_last_report_window_start_time_ <
tdresser 2017/05/11 13:52:45 this->uma_last_report_window_start_time_ -> uma_la
Liquan (Max) Gu 2017/05/11 15:14:13 Right.
1844 kQueueingTimeWindowDuration) {
1845 return;
1846 }
1835 UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration", 1847 UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration",
1836 queueing_time); 1848 queueing_time);
1837 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 1849 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
1838 "estimated_queueing_time_for_window", 1850 "estimated_queueing_time_for_window",
1839 queueing_time.InMillisecondsF()); 1851 queueing_time.InMillisecondsF());
1852 this->uma_last_report_window_start_time_ = window_start_time;
1840 } 1853 }
1841 1854
1842 AutoAdvancingVirtualTimeDomain* RendererSchedulerImpl::GetVirtualTimeDomain() { 1855 AutoAdvancingVirtualTimeDomain* RendererSchedulerImpl::GetVirtualTimeDomain() {
1843 if (!virtual_time_domain_) { 1856 if (!virtual_time_domain_) {
1844 virtual_time_domain_.reset( 1857 virtual_time_domain_.reset(
1845 new AutoAdvancingVirtualTimeDomain(tick_clock()->NowTicks())); 1858 new AutoAdvancingVirtualTimeDomain(tick_clock()->NowTicks()));
1846 RegisterTimeDomain(virtual_time_domain_.get()); 1859 RegisterTimeDomain(virtual_time_domain_.get());
1847 } 1860 }
1848 return virtual_time_domain_.get(); 1861 return virtual_time_domain_.get();
1849 } 1862 }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1957 case TimeDomainType::VIRTUAL: 1970 case TimeDomainType::VIRTUAL:
1958 return "virtual"; 1971 return "virtual";
1959 default: 1972 default:
1960 NOTREACHED(); 1973 NOTREACHED();
1961 return nullptr; 1974 return nullptr;
1962 } 1975 }
1963 } 1976 }
1964 1977
1965 } // namespace scheduler 1978 } // namespace scheduler
1966 } // namespace blink 1979 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698