Skip to content

Commit 305dd8a

Browse files
committed
feat: track spawned processes (execve count) per variation
Add a new 'Spawned Processes' data point that counts the number of processes each package manager spawns (via execve syscalls) during install. This is captured per-variation since different states (clean, cache, lockfile, etc.) may produce different process counts. ## How it works After each benchmark completes, a separate strace run is performed for each package manager under the same variation state: 1. `process-count.sh` — wraps a single install with `strace -f -e trace=execve` and counts execve() calls 2. `collect-process-count.js` — aggregates per-PM counts into `process-count.json` (same format as package-count.json) 3. `collect_process_count` in common.sh — orchestrates the strace runs for all included PMs using BENCH_PREPARE_BASE + setup commands The strace run is separate from the timed benchmark to avoid overhead. ## Backend changes - `scripts/process-count.sh` — new: strace wrapper per PM - `scripts/collect-process-count.js` — new: aggregation script - `scripts/variations/common.sh` — extracted bare BENCH_INSTALL_* commands (no log redirects) for reuse; added collect_process_count() - All 8 standard variation scripts — call collect_process_count - `scripts/process-results.sh` — copy process-count.json to results - `scripts/setup.sh` — ensure strace is installed ## Frontend changes - `ProcessCountData` / `ProcessCountTableRow` types - `use-process-count-data.ts` hook (mirrors use-package-count-data) - `ProcessCountTable` component with Terminal icon, sortable columns, locale-formatted numbers - Integrated into variation page below Package Count Data - `getAvailablePackageManagersFromProcessCount` utility
1 parent 2cac036 commit 305dd8a

18 files changed

Lines changed: 769 additions & 9 deletions

app/src/components/variation/index.tsx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import { ERROR_MESSAGES } from "@/constants";
55
import { VariationChart } from "@/components/variation/chart";
66
import { VariationTable } from "@/components/variation/table";
77
import { PackageCountTable } from "@/components/variation/package-count-table";
8+
import { ProcessCountTable } from "@/components/variation/process-count-table";
89
import { usePackageCountData } from "@/hooks/use-package-count-data";
10+
import { useProcessCountData } from "@/hooks/use-process-count-data";
911
import { useFixtureFilter } from "@/contexts/fixture-filter-context";
1012
import {
1113
sortFixtures,
@@ -14,6 +16,7 @@ import {
1416
getFixtureId,
1517
getAvailablePackageManagers,
1618
getAvailablePackageManagersFromPackageCount,
19+
getAvailablePackageManagersFromProcessCount,
1720
isTaskExecutionVariation,
1821
isRegistryVariation,
1922
} from "@/lib/utils";
@@ -46,6 +49,11 @@ export const VariationPage = () => {
4649
loading: packageCountLoading,
4750
error: packageCountError,
4851
} = usePackageCountData(variation as Variation);
52+
const {
53+
processCountData,
54+
loading: processCountLoading,
55+
error: processCountError,
56+
} = useProcessCountData(variation as Variation);
4957
const { enabledFixtures } = useFixtureFilter();
5058

5159
// Handle deep linking to sections and fixtures
@@ -111,6 +119,9 @@ export const VariationPage = () => {
111119
const filteredPackageCountData = packageCountData.filter((item) =>
112120
enabledFixtures.has(item.fixture),
113121
);
122+
const filteredProcessCountData = processCountData.filter((item) =>
123+
enabledFixtures.has(item.fixture),
124+
);
114125

115126
// Filter package managers to only show those with data for this variation
116127
const packageManagers = getAvailablePackageManagers(
@@ -125,6 +136,13 @@ export const VariationPage = () => {
125136
allPackageManagers,
126137
);
127138

139+
// Filter package managers for process count data to only show those with actual data
140+
const processCountPackageManagers =
141+
getAvailablePackageManagersFromProcessCount(
142+
filteredProcessCountData,
143+
allPackageManagers,
144+
);
145+
128146
// Check if this is a task execution variation or registry variation
129147
const isTaskExecution = isTaskExecutionVariation(variation as string);
130148
const isRegistry = isRegistryVariation(variation as string);
@@ -137,6 +155,7 @@ export const VariationPage = () => {
137155
perPackageChart: "Task Execution Time by Fixture",
138156
perPackageTable: "Task Execution Time Data",
139157
packageCountTable: "Package Count Data",
158+
processCountTable: "Spawned Processes Data",
140159
}
141160
: isRegistry
142161
? {
@@ -145,13 +164,15 @@ export const VariationPage = () => {
145164
perPackageChart: "Registry Install Time by Fixture",
146165
perPackageTable: "Registry Install Time Data",
147166
packageCountTable: "Package Count Data",
167+
processCountTable: "Spawned Processes Data",
148168
}
149169
: {
150170
totalChart: "Total Install Time by Fixture",
151171
totalTable: "Total Install Time Data",
152172
perPackageChart: "Per Package Install Time by Fixture",
153173
perPackageTable: "Per Package Install Time Data",
154174
packageCountTable: "Package Count Data",
175+
processCountTable: "Spawned Processes Data",
155176
};
156177

157178
// Section IDs for deep linking
@@ -161,6 +182,7 @@ export const VariationPage = () => {
161182
totalTable: createSectionId(titles.totalTable),
162183
perPackageTable: createSectionId(titles.perPackageTable),
163184
packageCountTable: createSectionId(titles.packageCountTable),
185+
processCountTable: createSectionId(titles.processCountTable),
164186
};
165187

166188
return (
@@ -240,6 +262,28 @@ export const VariationPage = () => {
240262
/>
241263
</div>
242264
) : null}
265+
266+
{/* 6. Spawned processes data table */}
267+
{processCountLoading ? (
268+
<div className="text-center text-muted-foreground">
269+
Loading process count data...
270+
</div>
271+
) : processCountError ? (
272+
<div className="text-center text-destructive">
273+
Error loading process count data: {processCountError}
274+
</div>
275+
) : filteredProcessCountData.length > 0 ? (
276+
<div id={sectionIds.processCountTable}>
277+
<ProcessCountTable
278+
title="Spawned Processes Data"
279+
description="Number of processes spawned (execve calls) by each package manager during install"
280+
processCountData={filteredProcessCountData}
281+
packageManagers={processCountPackageManagers}
282+
versions={chartData.versions}
283+
currentVariation={variation as string}
284+
/>
285+
</div>
286+
) : null}
243287
</div>
244288

245289
<div className="space-y-8">

0 commit comments

Comments
 (0)