OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <!-- | 2 <!-- |
3 Copyright 2016 The Chromium Authors. All rights reserved. | 3 Copyright 2016 The Chromium Authors. All rights reserved. |
4 Use of this source code is governed by a BSD-style license that can be | 4 Use of this source code is governed by a BSD-style license that can be |
5 found in the LICENSE file. | 5 found in the LICENSE file. |
6 --> | 6 --> |
7 | 7 |
8 <link rel="import" href="/tracing/base/iteration_helpers.html"> | 8 <link rel="import" href="/tracing/base/iteration_helpers.html"> |
9 <link rel="import" href="/tracing/metrics/metric_registry.html"> | 9 <link rel="import" href="/tracing/metrics/metric_registry.html"> |
10 <link rel="import" href="/tracing/value/diagnostics/diagnostic_map.html"> | 10 <link rel="import" href="/tracing/value/diagnostics/diagnostic_map.html"> |
(...skipping 18 matching lines...) Expand all Loading... |
29 var hist = new tr.v.Histogram(histogramName, | 29 var hist = new tr.v.Histogram(histogramName, |
30 tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, TIME_BOUNDARIES); | 30 tr.b.Unit.byName.timeDurationInMs_smallerIsBetter, TIME_BOUNDARIES); |
31 hist.addSample(duration); | 31 hist.addSample(duration); |
32 histograms.addHistogram(hist); | 32 histograms.addHistogram(hist); |
33 } | 33 } |
34 | 34 |
35 // Adds histograms specific to memory-infra dumps. | 35 // Adds histograms specific to memory-infra dumps. |
36 function addMemoryInfraHistograms( | 36 function addMemoryInfraHistograms( |
37 histograms, model, categoryNamesToTotalEventSizes) { | 37 histograms, model, categoryNamesToTotalEventSizes) { |
38 var memoryDumpCount = model.globalMemoryDumps.length; | 38 var memoryDumpCount = model.globalMemoryDumps.length; |
39 if (memoryDumpCount === 0) | 39 if (memoryDumpCount === 0) return; |
40 return; | |
41 | 40 |
42 var totalOverhead = 0; | 41 var totalOverhead = 0; |
43 var nonMemoryInfraThreadOverhead = 0; | 42 var nonMemoryInfraThreadOverhead = 0; |
44 var overheadByProvider = {}; | 43 var overheadByProvider = {}; |
45 tr.b.iterItems(model.processes, function(pid, process) { | 44 for (var process of tr.b.dictionaryValues(model.processes)) { |
46 tr.b.iterItems(process.threads, function(tid, thread) { | 45 for (var thread of tr.b.dictionaryValues(process.threads)) { |
47 tr.b.iterItems(thread.sliceGroup.slices, (unusedSliceId, slice) => { | 46 for (var slice of tr.b.dictionaryValues(thread.sliceGroup.slices)) { |
48 if (slice.category !== MEMORY_INFRA_TRACING_CATEGORY) | 47 if (slice.category !== MEMORY_INFRA_TRACING_CATEGORY) return; |
49 return; | 48 |
50 totalOverhead += slice.duration; | 49 totalOverhead += slice.duration; |
51 if (thread.name !== 'MemoryInfra') | 50 if (thread.name !== 'MemoryInfra') |
52 nonMemoryInfraThreadOverhead += slice.duration; | 51 nonMemoryInfraThreadOverhead += slice.duration; |
53 if (slice.args && slice.args['dump_provider.name']) { | 52 if (slice.args && slice.args['dump_provider.name']) { |
54 var providerName = slice.args['dump_provider.name']; | 53 var providerName = slice.args['dump_provider.name']; |
55 var durationAndCount = overheadByProvider[providerName]; | 54 var durationAndCount = overheadByProvider[providerName]; |
56 if (durationAndCount === undefined) { | 55 if (durationAndCount === undefined) { |
57 overheadByProvider[providerName] = durationAndCount = | 56 overheadByProvider[providerName] = durationAndCount = |
58 {duration: 0, count: 0}; | 57 {duration: 0, count: 0}; |
59 } | 58 } |
60 durationAndCount.duration += slice.duration; | 59 durationAndCount.duration += slice.duration; |
61 durationAndCount.count++; | 60 durationAndCount.count++; |
62 } | 61 } |
63 }); | 62 } |
64 }); | 63 } |
65 }); | 64 } |
66 | 65 |
67 addTimeDurationHistogram( | 66 addTimeDurationHistogram( |
68 'Average CPU overhead on all threads per memory-infra dump', | 67 'Average CPU overhead on all threads per memory-infra dump', |
69 totalOverhead / memoryDumpCount, histograms); | 68 totalOverhead / memoryDumpCount, histograms); |
70 addTimeDurationHistogram( | 69 addTimeDurationHistogram( |
71 'Average CPU overhead on non-memory-infra threads per memory-infra ' + | 70 'Average CPU overhead on non-memory-infra threads per memory-infra ' + |
72 'dump', | 71 'dump', |
73 nonMemoryInfraThreadOverhead / memoryDumpCount, histograms); | 72 nonMemoryInfraThreadOverhead / memoryDumpCount, histograms); |
74 tr.b.iterItems(overheadByProvider, function(providerName, overhead) { | 73 for (var [providerName, overhead] of Object.entries(overheadByProvider)) { |
75 addTimeDurationHistogram( | 74 addTimeDurationHistogram( |
76 'Average CPU overhead of ' + providerName + ' per OnMemoryDump call', | 75 'Average CPU overhead of ' + providerName + ' per OnMemoryDump call', |
77 overhead.duration / overhead.count, histograms); | 76 overhead.duration / overhead.count, histograms); |
78 }); | 77 } |
79 | 78 |
80 var memoryInfraEventsSize = | 79 var memoryInfraEventsSize = |
81 categoryNamesToTotalEventSizes.get(MEMORY_INFRA_TRACING_CATEGORY); | 80 categoryNamesToTotalEventSizes.get(MEMORY_INFRA_TRACING_CATEGORY); |
82 var memoryInfraTraceBytesValue = new tr.v.Histogram( | 81 var memoryInfraTraceBytesValue = new tr.v.Histogram( |
83 'Total trace size of memory-infra dumps in bytes', | 82 'Total trace size of memory-infra dumps in bytes', |
84 tr.b.Unit.byName.sizeInBytes_smallerIsBetter, BYTE_BOUNDARIES); | 83 tr.b.Unit.byName.sizeInBytes_smallerIsBetter, BYTE_BOUNDARIES); |
85 memoryInfraTraceBytesValue.addSample(memoryInfraEventsSize); | 84 memoryInfraTraceBytesValue.addSample(memoryInfraEventsSize); |
86 histograms.addHistogram(memoryInfraTraceBytesValue); | 85 histograms.addHistogram(memoryInfraTraceBytesValue); |
87 | 86 |
88 var traceBytesPerDumpValue = new tr.v.Histogram( | 87 var traceBytesPerDumpValue = new tr.v.Histogram( |
89 'Average trace size of memory-infra dumps in bytes', | 88 'Average trace size of memory-infra dumps in bytes', |
90 tr.b.Unit.byName.sizeInBytes_smallerIsBetter, BYTE_BOUNDARIES); | 89 tr.b.Unit.byName.sizeInBytes_smallerIsBetter, BYTE_BOUNDARIES); |
91 traceBytesPerDumpValue.addSample(memoryInfraEventsSize / memoryDumpCount); | 90 traceBytesPerDumpValue.addSample(memoryInfraEventsSize / memoryDumpCount); |
92 histograms.addHistogram(traceBytesPerDumpValue); | 91 histograms.addHistogram(traceBytesPerDumpValue); |
93 } | 92 } |
94 | 93 |
95 function tracingMetric(histograms, model) { | 94 function tracingMetric(histograms, model) { |
96 if (!model.stats.hasEventSizesinBytes) { | 95 if (!model.stats.hasEventSizesinBytes) { |
97 throw new Error('Model stats does not have event size information. ' + | 96 throw new Error('Model stats does not have event size information. ' + |
98 'Please enable ImportOptions.trackDetailedModelStats.'); | 97 'Please enable ImportOptions.trackDetailedModelStats.'); |
99 } | 98 } |
100 | 99 |
101 var eventStats = model.stats.allTraceEventStatsInTimeIntervals; | 100 var eventStats = model.stats.allTraceEventStatsInTimeIntervals; |
102 eventStats.sort(function(a, b) { | 101 eventStats.sort((a, b) => a.timeInterval - b.timeInterval); |
103 return a.timeInterval - b.timeInterval; | |
104 }); | |
105 | 102 |
106 var totalTraceBytes = eventStats.reduce((a, b) => | 103 var totalTraceBytes = eventStats.reduce( |
107 (a + b.totalEventSizeinBytes), 0); | 104 (a, b) => a + b.totalEventSizeinBytes, 0); |
108 | 105 |
109 // We maintain a sliding window of records [start ... end-1] where end | 106 // We maintain a sliding window of records [start ... end-1] where end |
110 // increments each time through the loop, and we move start just far enough | 107 // increments each time through the loop, and we move start just far enough |
111 // to keep the window less than 1 second wide. Note that we need to compute | 108 // to keep the window less than 1 second wide. Note that we need to compute |
112 // the number of time intervals (i.e. units that timeInterval is given in) | 109 // the number of time intervals (i.e. units that timeInterval is given in) |
113 // in one second to know how wide the sliding window should be. | 110 // in one second to know how wide the sliding window should be. |
114 var maxEventCountPerSec = 0; | 111 var maxEventCountPerSec = 0; |
115 var maxEventBytesPerSec = 0; | 112 var maxEventBytesPerSec = 0; |
116 var INTERVALS_PER_SEC = Math.floor( | 113 var INTERVALS_PER_SEC = Math.floor( |
117 1000 / model.stats.TIME_INTERVAL_SIZE_IN_MS); | 114 1000 / model.stats.TIME_INTERVAL_SIZE_IN_MS); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 | 191 |
195 tr.metrics.MetricRegistry.register(tracingMetric); | 192 tr.metrics.MetricRegistry.register(tracingMetric); |
196 | 193 |
197 return { | 194 return { |
198 tracingMetric, | 195 tracingMetric, |
199 // For testing only: | 196 // For testing only: |
200 MEMORY_INFRA_TRACING_CATEGORY, | 197 MEMORY_INFRA_TRACING_CATEGORY, |
201 }; | 198 }; |
202 }); | 199 }); |
203 </script> | 200 </script> |
OLD | NEW |