Skip to content

Commit 6fb5f27

Browse files
tmf.analysis: Pre-filter events to speed up trace parsing
Add a pre-filter activity to reduce queue fill. Only enqueue data that may be read by analyses. This patch updates: * ActiveTidStateProvider * KernelStateProvider * KernelMemoryStateProvider * KernelCpuUsageStateProvider * CallstackStateProvider [Changed] add filter to event dispatch to speed up trace compass Change-Id: I51c8cb5594812491c85a2cbafe8d32fd4f6bc0c5 Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
1 parent b2a0ffb commit 6fb5f27

File tree

7 files changed

+83
-12
lines changed

7 files changed

+83
-12
lines changed

analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/cpuusage/KernelCpuUsageStateProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ public KernelCpuUsageStateProvider getNewInstance() {
9090
return new KernelCpuUsageStateProvider(this.getTrace(), this.fLayout);
9191
}
9292

93+
@Override
94+
protected boolean considerEvent(ITmfEvent event) {
95+
return super.considerEvent(event) && event.getName().equals(fLayout.eventSchedSwitch());
96+
}
97+
9398
@Override
9499
protected void eventHandle(@Nullable ITmfEvent event) {
95100
if (event == null) {

analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/kernelmemoryusage/KernelMemoryStateProvider.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212

1313
import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
1414

15+
import java.util.Set;
16+
import java.util.TreeSet;
17+
1518
import org.eclipse.core.runtime.NullProgressMonitor;
1619
import org.eclipse.jdt.annotation.NonNull;
1720
import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelTidAspect;
@@ -58,6 +61,12 @@ public class KernelMemoryStateProvider extends AbstractTmfStateProvider {
5861

5962
private IKernelAnalysisEventLayout fLayout;
6063

64+
private final String fEventKmemPageFree;
65+
66+
private final String fEventKmemPageAlloc;
67+
68+
private final Set<String> fToConsider = new TreeSet<>();
69+
6170
/**
6271
* Constructor
6372
*
@@ -69,6 +78,10 @@ public class KernelMemoryStateProvider extends AbstractTmfStateProvider {
6978
public KernelMemoryStateProvider(@NonNull ITmfTrace trace, IKernelAnalysisEventLayout layout) {
7079
super(trace, "Kernel:Memory"); //$NON-NLS-1$
7180
fLayout = layout;
81+
fEventKmemPageAlloc = fLayout.eventKmemPageAlloc();
82+
fEventKmemPageFree = fLayout.eventKmemPageFree();
83+
fToConsider.add(fEventKmemPageAlloc);
84+
fToConsider.add(fEventKmemPageFree);
7285
}
7386

7487
@Override
@@ -81,17 +94,24 @@ public ITmfStateProvider getNewInstance() {
8194
return new KernelMemoryStateProvider(getTrace(), fLayout);
8295
}
8396

97+
@Override
98+
protected boolean considerEvent(ITmfEvent event) {
99+
return super.considerEvent(event) && fToConsider.contains(event.getName());
100+
}
101+
84102
@Override
85103
protected void eventHandle(@NonNull ITmfEvent event) {
86104
String name = event.getName();
87105

88106
long inc;
89-
if (name.equals(fLayout.eventKmemPageAlloc())) {
107+
if (name.equals(fEventKmemPageAlloc)) {
90108
inc = PAGE_SIZE;
91-
} else if (name.equals(fLayout.eventKmemPageFree())) {
92-
inc = -PAGE_SIZE;
93109
} else {
94-
return;
110+
if (name.equals(fEventKmemPageFree)) {
111+
inc = -PAGE_SIZE;
112+
} else {
113+
return;
114+
}
95115
}
96116

97117
try {

analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/tid/ActiveTidStateProvider.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,13 @@ public int getVersion() {
7272
return new ActiveTidStateProvider(getTrace(), fLayout);
7373
}
7474

75+
@Override
76+
protected boolean considerEvent(@NonNull ITmfEvent event) {
77+
return super.considerEvent(event) && !event.getName().equals(fSchedSwitch);
78+
}
79+
7580
@Override
7681
protected void eventHandle(@NonNull ITmfEvent event) {
77-
if (!event.getName().equals(fSchedSwitch)) {
78-
return;
79-
}
8082
ITmfStateSystemBuilder ssb = getStateSystemBuilder();
8183
if (ssb == null) {
8284
return;

analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/KernelStateProvider.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@
1414

1515
package org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel;
1616

17+
import java.util.ArrayList;
18+
import java.util.HashSet;
19+
import java.util.List;
1720
import java.util.Map;
21+
import java.util.Set;
1822

1923
import org.eclipse.jdt.annotation.Nullable;
2024
import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
@@ -98,6 +102,7 @@ public class KernelStateProvider extends AbstractTmfStateProvider {
98102

99103
private final KernelEventHandler fSysEntryHandler;
100104
private final KernelEventHandler fSysExitHandler;
105+
private final Set<String> fValidEventNames = new HashSet<>();
101106

102107
// ------------------------------------------------------------------------
103108
// Constructor
@@ -116,7 +121,7 @@ public KernelStateProvider(ITmfTrace trace, IKernelAnalysisEventLayout layout) {
116121
super(trace, "Kernel"); //$NON-NLS-1$
117122
fLayout = layout;
118123
fEventNames = buildEventNames(layout);
119-
124+
fValidEventNames.addAll(fEventNames.keySet());
120125
fSysEntryHandler = new SysEntryHandler(fLayout);
121126
fSysExitHandler = new SysExitHandler(fLayout);
122127
}
@@ -175,6 +180,19 @@ public KernelStateProvider getNewInstance() {
175180
return new KernelStateProvider(this.getTrace(), fLayout);
176181
}
177182

183+
@Override
184+
protected boolean considerEvent(ITmfEvent event) {
185+
boolean considerEvent = super.considerEvent(event);
186+
if (!considerEvent) {
187+
return false;
188+
}
189+
String name = event.getName();
190+
if (fEventNames.containsKey(name) ) {
191+
return true;
192+
}
193+
return isSyscallEntry(name)|| isSyscallExit(name);
194+
}
195+
178196
@Override
179197
protected void eventHandle(@Nullable ITmfEvent event) {
180198
if (event == null) {

analysis/org.eclipse.tracecompass.analysis.profiling.core/src/org/eclipse/tracecompass/analysis/profiling/core/callstack/CallStackStateProvider.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@ public CallStackStateProvider(ITmfTrace trace) {
114114

115115
@Override
116116
protected void eventHandle(ITmfEvent event) {
117-
if (!considerEvent(event)) {
118-
return;
119-
}
120117

121118
ITmfStateSystemBuilder ss = checkNotNull(getStateSystemBuilder());
122119

@@ -204,7 +201,10 @@ public void done() {
204201
* @return If false, the event will be ignored by the state provider. If
205202
* true processing will continue.
206203
*/
207-
protected abstract boolean considerEvent(ITmfEvent event);
204+
@Override
205+
protected boolean considerEvent(ITmfEvent event) {
206+
return true;
207+
}
208208

209209
/**
210210
* Check an event if it indicates a function entry.

lttng/org.eclipse.tracecompass.lttng2.ust.core/src/org/eclipse/tracecompass/internal/lttng2/ust/core/analysis/memory/UstMemoryStateProvider.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,14 @@ public UstMemoryStateProvider(@NonNull ITmfTrace trace, @Nullable UstMemoryAnaly
159159
return builder.build();
160160
}
161161

162+
@Override
163+
protected boolean considerEvent(@NonNull ITmfEvent event) {
164+
if(!super.considerEvent(event)) {
165+
return false;
166+
}
167+
return fEventNames.containsKey(event.getName());
168+
}
169+
162170
@Override
163171
protected void eventHandle(ITmfEvent event) {
164172
String name = event.getName();

tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/statesystem/AbstractTmfStateProvider.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,10 @@ public void run() {
319319
event = fEventsQueue.take();
320320
continue;
321321
}
322+
if (!considerEvent(event)) {
323+
event = fEventsQueue.take();
324+
continue;
325+
}
322326
currentEvent = event;
323327
long currentTime = event.getTimestamp().toNanos();
324328
fSafeTime = currentTime - 1;
@@ -436,6 +440,20 @@ public void addFutureEvent(long time, @Nullable Object futureValue, int attribut
436440
// Abstract methods
437441
// ------------------------------------------------------------------------
438442

443+
/**
444+
* Check if this event should be considered at all for function entry/exit
445+
* analysis. This check is a fast fail to allow events to not be processed as much.
446+
*
447+
* @param event
448+
* The event to check
449+
* @return If false, the event will be ignored by the state provider. If
450+
* true processing will continue.
451+
* @since 10.2
452+
*/
453+
protected boolean considerEvent(ITmfEvent event) {
454+
return true;
455+
}
456+
439457
/**
440458
* Handle the given event and send the appropriate state transitions into
441459
* the the state system.

0 commit comments

Comments
 (0)