Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
index b3812dc5780262f6b79143108f71885aee99d4b6..a4119f0ec830a77ce9e80d083928015d5b43209f 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
@@ -53,9 +53,11 @@ constexpr base::TimeDelta kThrottlingDelayAfterAudioIsPlayed = |
base::TimeDelta::FromSeconds(5); |
constexpr base::TimeDelta kQueueingTimeWindowDuration = |
base::TimeDelta::FromSeconds(1); |
-// Maximal bound on task duration for reporting. |
-constexpr base::TimeDelta kMaxTaskDurationForReporting = |
- base::TimeDelta::FromMinutes(1); |
+// Threshold for discarding ultra-long tasks. It is assumed that ultra-long |
+// tasks are reporting glitches (e.g. system falling asleep in the middle |
+// of the task). |
Ilya Sherman
2017/05/19 21:15:11
Hmm, why are you making this assumption? Could yo
altimin
2017/05/19 22:34:20
The problem is that we can't reliably detect when
Sami
2017/05/22 13:57:39
FWIW the inactive renderer dialog should already b
Ilya Sherman
2017/05/22 20:43:43
Having some visibility into what data is being mis
|
+constexpr base::TimeDelta kLongTaskDiscardingThreshold = |
+ base::TimeDelta::FromSeconds(30); |
void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { |
if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled()) |
@@ -64,8 +66,8 @@ void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { |
int load_percentage = static_cast<int>(load * 100); |
DCHECK_LE(load_percentage, 100); |
- UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", |
- load_percentage); |
+ UMA_HISTOGRAM_PERCENTAGE( |
+ "RendererScheduler.ForegroundRendererMainThreadLoad2", load_percentage); |
TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
"RendererScheduler.ForegroundRendererLoad", load_percentage); |
} |
@@ -77,8 +79,8 @@ void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) { |
int load_percentage = static_cast<int>(load * 100); |
DCHECK_LE(load_percentage, 100); |
- UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad", |
- load_percentage); |
+ UMA_HISTOGRAM_PERCENTAGE( |
+ "RendererScheduler.BackgroundRendererMainThreadLoad2", load_percentage); |
TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
"RendererScheduler.BackgroundRendererLoad", load_percentage); |
} |
@@ -220,7 +222,7 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
rail_mode_observer(nullptr), |
wake_up_budget_pool(nullptr), |
task_duration_per_queue_type_histogram(base::Histogram::FactoryGet( |
- "RendererScheduler.TaskDurationPerQueueType", |
+ "RendererScheduler.TaskDurationPerQueueType2", |
1, |
static_cast<int>(TaskQueue::QueueType::COUNT), |
static_cast<int>(TaskQueue::QueueType::COUNT) + 1, |
@@ -1841,26 +1843,31 @@ void RendererSchedulerImpl::DidProcessTask(TaskQueue* task_queue, |
task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks, |
end_time_ticks); |
- // We want to measure thread time here, but for efficiency reasons |
- // we stick with wall time. |
- GetMainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( |
- start_time_ticks, end_time_ticks); |
- GetMainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( |
- start_time_ticks, end_time_ticks); |
- |
// TODO(altimin): Per-page metrics should also be considered. |
- RecordTaskMetrics(task_queue->GetQueueType(), |
- end_time_ticks - start_time_ticks); |
+ RecordTaskMetrics(task_queue->GetQueueType(), start_time_ticks, |
+ end_time_ticks); |
} |
void RendererSchedulerImpl::RecordTaskMetrics(TaskQueue::QueueType queue_type, |
- base::TimeDelta duration) { |
- UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", |
+ base::TimeTicks start_time, |
+ base::TimeTicks end_time) { |
+ base::TimeDelta duration = end_time - start_time; |
+ if (duration > kLongTaskDiscardingThreshold) |
+ return; |
+ |
+ UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime2", |
duration.InMicroseconds(), 1, 1000 * 1000, 50); |
+ // We want to measure thread time here, but for efficiency reasons |
+ // we stick with wall time. |
+ GetMainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( |
+ start_time, end_time); |
+ GetMainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( |
+ start_time, end_time); |
+ |
// TODO(altimin): See whether this metric is still useful after |
// adding RendererScheduler.TaskDurationPerQueueType. |
- UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType", |
+ UMA_HISTOGRAM_ENUMERATION("RendererScheduler.NumberOfTasksPerQueueType2", |
static_cast<int>(queue_type), |
static_cast<int>(TaskQueue::QueueType::COUNT)); |
@@ -1870,8 +1877,6 @@ void RendererSchedulerImpl::RecordTaskMetrics(TaskQueue::QueueType queue_type, |
void RendererSchedulerImpl::RecordTaskDurationPerQueueType( |
TaskQueue::QueueType queue_type, |
base::TimeDelta duration) { |
- duration = std::min(duration, kMaxTaskDurationForReporting); |
- |
// Report only whole milliseconds to avoid overflow. |
base::TimeDelta& unreported_duration = |
GetMainThreadOnly() |