diff options
author | Miguel Alcon Pinto <malcon@google.com> | 2015-11-19 13:43:09 +0000 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2015-11-19 16:46:06 +0000 |
commit | 5f048979364f9c9dcad8a7c941f43865e27b227f (patch) | |
tree | 8b7063e39cc99345c2580b520c96cf853669893d /src/main/java/com/google/devtools/build/lib/profiler/Profiler.java | |
parent | b2519e049e4561caf89c51806b54a80f6a19d2fc (diff) |
Record histogram and other statistics for the ProfileTask objects. In case of recording VFS_ stats we try to catalog the access base on the path type.
--
MOS_MIGRATED_REVID=108238357
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/profiler/Profiler.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/profiler/Profiler.java | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java b/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java index def46d8983..57ab3b0e58 100644 --- a/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java +++ b/src/main/java/com/google/devtools/build/lib/profiler/Profiler.java @@ -16,7 +16,11 @@ package com.google.devtools.build.lib.profiler; import static com.google.devtools.build.lib.profiler.ProfilerTask.TASK_COUNT; import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.profiler.PredicateBasedStatRecorder.RecorderAndPredicate; +import com.google.devtools.build.lib.profiler.StatRecorder.VfsHeuristics; import com.google.devtools.build.lib.util.Clock; import com.google.devtools.build.lib.util.VarInt; @@ -29,11 +33,13 @@ import java.util.ArrayList; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.PriorityQueue; import java.util.Queue; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.zip.Deflater; import java.util.zip.DeflaterOutputStream; @@ -130,7 +136,10 @@ public final class Profiler { */ private static final Profiler instance = new Profiler(); + private static final int HISTOGRAM_BUCKETS = 20; + /** + * * A task that was very slow. */ public final class SlowTask implements Comparable<SlowTask> { @@ -452,7 +461,10 @@ public final class Profiler { private final SlowestTaskAggregator[] slowestTasks = new SlowestTaskAggregator[ProfilerTask.values().length]; + private final StatRecorder[] tasksHistograms = new StatRecorder[ProfilerTask.values().length]; + private Profiler() { + initHistograms(); for (ProfilerTask task : ProfilerTask.values()) { if (task.slowestInstancesCount != 0) { slowestTasks[task.ordinal()] = new SlowestTaskAggregator(task.slowestInstancesCount); @@ -460,6 +472,27 @@ public final class Profiler { } } + private void initHistograms() { + for (ProfilerTask task : ProfilerTask.values()) { + if (task.isVfs()) { + Map<String, ? extends Predicate<? super String>> vfsHeuristics = + VfsHeuristics.vfsTypeHeuristics; + List<RecorderAndPredicate> recorders = new ArrayList<>(vfsHeuristics.size()); + for (Entry<String, ? extends Predicate<? super String>> e : vfsHeuristics.entrySet()) { + recorders.add(new RecorderAndPredicate( + new SingleStatRecorder(task + " " + e.getKey(), HISTOGRAM_BUCKETS), e.getValue())); + } + tasksHistograms[task.ordinal()] = new PredicateBasedStatRecorder(recorders); + } else { + tasksHistograms[task.ordinal()] = new SingleStatRecorder(task, HISTOGRAM_BUCKETS); + } + } + } + + public ImmutableList<StatRecorder> getTasksHistograms() { + return ImmutableList.copyOf(tasksHistograms); + } + public static Profiler instance() { return instance; } @@ -659,6 +692,7 @@ public final class Profiler { } private synchronized void clear() { + initHistograms(); profileStartTime = 0L; if (timer != null) { timer.cancel(); @@ -698,6 +732,7 @@ public final class Profiler { duration = 0; } + tasksHistograms[type.ordinal()].addStat((int) TimeUnit.NANOSECONDS.toMillis(duration), object); TaskData parent = taskStack.peek(); if (parent != null) { parent.aggregateChild(type, duration); |