profiling
Skill34 starsChanged 7 months agoApache-2.0View on GitHub
Capture performance traces using CPU ChromeTrace, Tracy, and Nsight Systems/NVTX for Kit-based applications (Isaac Sim, Isaac Lab, Kit SDK). Covers COLD/WARM/TRACY measurement separation, canonical Tracy capture sequence, last-resort force-kill handling, nsys profile commands, Kit profiler args, and lightweight export handoff to nsys-analyze. Use when running profiling captures, setting up trace collection, or troubleshooting capture failures. NOT for adding profiling zones (use profiling-api), deep trace analysis (use nsys-analyze), memory allocation profiling (use tracy-memory), or applying performance fixes (use perf-tuning).
- Reads credentials
6 other projects use a version of this.
Adopted by
Most recently taken up by
- Grarak/DSVitatheir own version, first seen Oct 8, 2026
- leanprover/lean4their own version, first seen Oct 8, 2026
- qduc/skillstheir own version, first seen Sep 19, 2026
- AntheaLaffy/missing-semester-skills-dshtheir own version, first seen Aug 16, 2026
- AntheaLaffy/the-missing-semester-skillstheir own version, first seen Aug 16, 2026
- Shopify/rubydextheir own version, first seen Mar 18, 2026
Used with
Projects with it also use debugging, testing and 1 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
BlockSkilldebugging
Debugging guidelines and best practices
Also in 3 projects that use this
NVIDIASkilltesting
Run Python and Rust tests for physicsnemo-curator using uv + pytest with coverage reporting via pytest-cov, and cargo-nextest for Rust tests. Includes benchmark workflows with pytest-benchmark and criterion.
Also in 3 projects that use this
GoogleSkillcode-review
Adversarial systems, concurrency, memory-model, and architecture code review protocol. Use this skill whenever asked to review code, PRs, diffs, or branches in Filament.
Also in 3 projects that use this
Other versions6 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 6
- leanprover/lean4★ 9.9ksame name
- Grarak/DSVita★ 527same name
- Shopify/rubydex★ 374same name
- AntheaLaffy/the-missing-semester-skills★ 1same name
- AntheaLaffy/missing-semester-skills-dsh★ 0same name
- qduc/skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository12 other files it gives its agents.
- benchmark-isaaclabSkill
- benchmark-isaacsimSkill
- diagnose-perfSkill
- install-isaaclabSkill
- install-isaacsimSkill
- install-profilersSkill
- kit-app-streaming-debugSkill
- nsys-analyzeSkill
- nvtx-pythonSkill
- perf-tuningSkill
- profiling-apiSkill
- tracy-memorySkill
The file
We split this skill into the rules it gives an agent
11 rules. 0 are common, 6 are distinctive, and 5 are very specific to this project.
0
Common
Most of the 3 edited versions we read keep these.
6
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Distinctive: line 19
Never report benchmark performance from a profiled run.
- Distinctive: line 23
Use the CPU backend for short, shareable, offline captures or targeted runtime intervals.
- Very specific: line 83
Tracy port: default is 8086; Isaac Sim 6.0+ commonly uses 8087 to avoid OV Hub.
- Very specific: line 85
Tracy capture binary: use the bundled omni.kit.profiler.tracy capture binary when available, or build the Tracy version that matches Kit's …
- Very specific: line 92
Check Kit's all-deps.packman.xml before building a fallback capture binary.
- Very specific: line 147
Do not wait for Isaac Sim graceful shutdown: after benchmark outputs exist.
- Distinctive: line 151
Do not patch installed Isaac Sim files by default.
- Distinctive: line 153
Use this workaround only when all of the following are true:
- Distinctive: line 158
Prefer first to use the force-kill sequence above after results are complete.
- Distinctive: line 207
If ALL expected output files exist with non-zero size, and the process is still running after 2+ minutes with no new output, it is probably …
- Very specific: line 269
Must cd to the directory containing the target exe
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Profiling Guide
This is the agent-facing profiling workflow for Kit-based applications (Isaac Sim, Isaac Lab, Kit SDK).
dev/docs/profiling-guide.md is the source of truth; keep this skill aligned with that guide.
Benchmark Accuracy: COLD / WARM / TRACY
Profilers add overhead. Keep measurement and diagnosis as separate runs:
- COLD: first run after a fresh install/cache state. Use this to expose startup and shader-cache effects, not as the steady-state performance number.
- WARM: same workload with caches already populated and profiling disabled. This is the authoritative FPS/frametime benchmark run.
- TRACY: same cache state as WARM, Tracy backend enabled,
CARB_PROFILING_PYTHON=1set, and.tracycaptured via a separate capture process. Use this for analysis only, not headline numbers.
Never report benchmark performance from a profiled run. Nsight Systems captures are also analysis-only and have their own overhead.
CPU ChromeTrace Backend
Use the CPU backend for short, shareable, offline captures or targeted runtime intervals.
Kit Args
--/app/profilerBackend=cpu
--/app/profileFromStart=true
--/profiler/enabled=true
--/plugins/carb.profiler-cpu.plugin/saveProfile=1
--/plugins/carb.profiler-cpu.plugin/compressProfile=1
--/plugins/carb.profiler-cpu.plugin/filePath=mytrace.gzRuntime On/Off
import carb.profiler
profiler = carb.profiler.acquire_profiler_interface()
profiler.set_capture_mask(1) # start targeted capture
# ... section to profile ...
profiler.set_capture_mask(0) # stop targeted captureConvert Chrome Trace JSON to Tracy
# From the Tracy binary directory
./import-chrome input_trace.json output.tracyTracy Profiling
Environment Setup
export TRACY_NO_SYS_TRACE=1
export TRACY_NO_CALLSTACK=1
export TRACY_PORT="${TRACY_PORT:-8086}" # Isaac Sim 6.0+ commonly uses 8087 to avoid OV Hub
# TRACY analysis phase only. Do not set during COLD/WARM benchmark measurement.
export CARB_PROFILING_PYTHON=1Kit Args (common for all Kit-based products)
--/app/profilerBackend=tracy
--/app/profileFromStart=true
--/profiler/enabled=true
--/profiler/gpu=true
--/profiler/gpu/tracyInject/enabled=true
--/app/profilerMask=1
--/plugins/carb.profiler-tracy.plugin/fibersAsThreads=false
--/profiler/channels/carb.events/enabled=false
--/profiler/channels/carb.tasking/enabled=false
--/profiler/gpu/tracyInject/msBetweenClockCalibration=0
--/rtx/addTileGpuAnnotations=true
--/plugins/carb.profiler-tracy.plugin/instantEventsAsMessages=trueTracy Capture — Correct Procedure (IMPORTANT)
Tracy capture is error-prone. Follow this exact sequence to avoid port conflicts and data loss.
Tracy port: default is 8086; Isaac Sim 6.0+ commonly uses 8087 to avoid OV Hub. Kit auto-increments to 8087, 8088, etc. on conflict. Set TRACY_PORT when you know the port.
Tracy capture binary: use the bundled omni.kit.profiler.tracy capture binary when available, or build the Tracy version that matches Kit's carb_sdk_plugins from source.
carb_sdk_plugins version | Tracy version |
< 178 | 0.9.1 legacy protocol |
>= 178 | 0.11.1+nv1 current protocol |
Check Kit's all-deps.packman.xml before building a fallback capture binary. For current Kit builds, use Tracy v0.11.1 and the headless binary at capture/build/unix/capture-release.
Step-by-step:
# 1. Kill any existing Tracy-related processes hogging the port
pkill -9 -f "capture" 2>/dev/null || true
export TRACY_PORT="${TRACY_PORT:-8086}" # use 8087 for Isaac Sim 6.0+ when needed
ss -tlnp | grep ":$TRACY_PORT" || true # verify the intended port is free
BENCH_SCRIPT="standalone_examples/benchmarks/benchmark_camera.py"
RESULT_DIR="/tmp/isaacsim-profile-results"
TRACY_CAPTURE_BIN="${TRACY_CAPTURE_BIN:-}"
if [ -z "$TRACY_CAPTURE_BIN" ]; then
TRACY_CAPTURE_BIN=$(command -v capture || command -v capture-release || command -v tracy-capture)
fi
[ -n "$TRACY_CAPTURE_BIN" ] || { echo "Missing Tracy capture binary"; exit 1; }
# 2. Start the application FIRST (in background)
nohup ./python.sh "$BENCH_SCRIPT" \
--num-cameras 1 --num-frames 600 \
--/app/profilerBackend=tracy --/app/profileFromStart=true \
--/profiler/enabled=true --/profiler/gpu=true \
--/profiler/gpu/tracyInject/enabled=true --/app/profilerMask=1 \
--/plugins/carb.profiler-tracy.plugin/fibersAsThreads=false \
--/profiler/channels/carb.events/enabled=false \
--/profiler/channels/carb.tasking/enabled=false \
--/profiler/gpu/tracyInject/msBetweenClockCalibration=0 \
--/rtx/addTileGpuAnnotations=true \
--/plugins/carb.profiler-tracy.plugin/instantEventsAsMessages=true \
--/exts/isaacsim.benchmark.services/metrics/metrics_output_folder="$RESULT_DIR" \
> /tmp/app.log 2>&1 &
APP_PID=$!
# 3. Poll until Tracy port is open (app needs time to initialize)
for i in $(seq 1 60); do
ss -tlnp | grep -q ":$TRACY_PORT" && break
sleep 2
done
# 4. Start capture AFTER port is confirmed open
"$TRACY_CAPTURE_BIN" -o trace_output.tracy -f -p "$TRACY_PORT" &
CAPTURE_PID=$!
# 5. Wait for benchmark result files, not graceful Isaac Sim shutdown
until ls "$RESULT_DIR"/kpis_*.json >/dev/null 2>&1; do sleep 5; done
# 6. Isaac Sim can hang during Tracy shutdown. Force-kill after outputs exist.
kill -9 "$APP_PID" "$CAPTURE_PID" 2>/dev/null || trueCritical warnings:
- Prefer app first, then capture. Starting capture before the app can work, but app-first plus port verification is the most reliable sequence.
- NEVER kill capture with kill/SIGTERM. It will NOT save the trace file.
- Always check for zombie processes on the intended Tracy port before starting.
- Do not wait for Isaac Sim graceful shutdown after benchmark outputs exist; Tracy shutdown can hang. Use
kill -9as the guide-prescribed last resort.
Last Resort: Scoped os._exit(0) Close Patch
Do not patch installed Isaac Sim files by default. Normal shutdown is preferred because it runs cleanup code and keeps the install reproducible.
Use this workaround only when all of the following are true:
- The workload repeatedly hangs during Tracy shutdown.
- Expected benchmark and trace outputs already exist with non-zero size.
- The install is disposable or you can restore the original file immediately after capture.
Prefer first to use the force-kill sequence above after results are complete. Patch only when repeated hangs prevent usable capture completion.
# Find simulation_app.py — path varies between source and build layouts:
# Source build: source/extensions/isaacsim.simulation_app/isaacsim/simulation_app/simulation_app.py
# Build output: _build/linux-x86_64/release/exts/isaacsim.simulation_app/isaacsim/simulation_app/simulation_app.py
# NOTE: `find -path` may fail in some environments (dots in dir names). Use glob instead:
shopt -s globstar nullglob
PACKAGE_PATH="/path/to/IsaacSim-or-pip-package"
SIM_APP=$(echo "$PACKAGE_PATH"/**/isaacsim/simulation_app/simulation_app.py | tr ' ' '\n' | grep -v __pycache__ | head -1)
# Or explicit known paths:
# SIM_APP="$PACKAGE_PATH"/_build/linux-x86_64/release/exts/isaacsim.simulation_app/isaacsim/simulation_app/simulation_app.py
echo "Found: $SIM_APP"
# Idempotent patch with a restore point.
cp -n "$SIM_APP" "$SIM_APP.bak.codex-tracy-close"
python3 - "$SIM_APP" <<'PY'
from pathlib import Path
import re, sys
path = Path(sys.argv[1])
text = path.read_text()
marker = "CODEX_TRACY_CLOSE_BYPASS"
if marker in text:
print(f"Already patched: {path}")
raise SystemExit(0)
patched, count = re.subn(
r"(^\s*def close\(self[^)]*\):\n)",
r"\1 # CODEX_TRACY_CLOSE_BYPASS: last-resort workaround for Tracy shutdown hangs.\n import os; os._exit(0)\n",
text,
count=1,
flags=re.MULTILINE,
)
if count != 1:
raise SystemExit(f"Could not find close() in {path}")
path.write_text(patched)
print(f"Patched: {path}")
PY
# Verify the patch applied
grep -n 'CODEX_TRACY_CLOSE_BYPASS' "$SIM_APP"
# Restore after the capture
cp "$SIM_APP.bak.codex-tracy-close" "$SIM_APP"Last Resort: Force-kill Hung Benchmarks When Results Exist
If ALL expected output files exist with non-zero size, and the process is still running after 2+ minutes with no new output, it is probably hung. Follow the guide sequence and force-kill the app and capture processes:
RESULT_DIR="/tmp/isaacsim-profile-results"
APP_PID=12345
CAPTURE_PID=12346
ls -la "$RESULT_DIR"/kpis_*.json "$RESULT_DIR"/*.tracy 2>/dev/null
# If files exist and size > 0:
kill -9 "$APP_PID" "$CAPTURE_PID" 2>/dev/null || trueNsight Systems Profiling
Install
# Linux: download from https://developer.nvidia.com/nsight-systems
sudo dpkg -i nsight-systems-*.deb
# Windows: download the latest standalone .msi from https://developer.nvidia.com/nsight-systemsKit Args for NVTX
--/app/profileFromStart=true
--/profiler/enabled=true
--/app/profilerBackend=nvtx
--/profiler/gpu=true
--/app/profilerMask=1
--/plugins/carb.profiler-tracy.plugin/fibersAsThreads=false
--/profiler/channels/carb.events/enabled=false
--/profiler/channels/carb.tasking/enabled=falseNsys Command
export CARB_PROFILING_PYTHON=1
NSYS_OUTPUT="kit_profile"
sudo nsys profile \
--force-overwrite=true \
--output="$NSYS_OUTPUT" \
--sample=system-wide \
--trace=cuda,nvtx,vulkan,osrt \
--gpu-metrics-devices=all \
--gpuctxsw=true \
--cuda-memory-usage=true \
--cuda-graph-trace=graph:host-and-device \
./python.sh standalone_examples/benchmarks/benchmark_camera.py \
--num-cameras 1 --num-frames 100 --headless \
--/app/profileFromStart=true --/profiler/enabled=true \
--/app/profilerBackend=nvtx --/app/profilerMask=1 \
--/plugins/carb.profiler-tracy.plugin/fibersAsThreads=false \
--/profiler/channels/carb.events/enabled=false \
--/profiler/channels/carb.tasking/enabled=falseWindows nsys Differences
-t osrtis NOT supported on Windows (use-t wddm)nsys profileCANNOT profile.batfiles — must target.exedirectlynsys statsmay fail with UnicodeDecodeError — export to SQLite instead- Must
cdto the directory containing the target exe
Analyzing Profiles
For NVTX zone interpretation and phase detection config, see the nsys-analyze skill.
Product-Specific Profiling Examples
Isaac Sim with Tracy:
./python.sh standalone_examples/benchmarks/benchmark_camera.py \
--num-cameras 1 --resolution 1920 1080 --num-gpus 1 --num-frames 600 \
--/app/profilerBackend=tracy --/app/profileFromStart=true \
--/profiler/enabled=true --/profiler/gpu=true \
--/profiler/gpu/tracyInject/enabled=true --/app/profilerMask=1 \
--/plugins/carb.profiler-tracy.plugin/fibersAsThreads=false \
--/profiler/channels/carb.events/enabled=false \
--/profiler/channels/carb.tasking/enabled=false \
--/profiler/gpu/tracyInject/msBetweenClockCalibration=0 \
--/rtx/addTileGpuAnnotations=true \
--/plugins/carb.profiler-tracy.plugin/instantEventsAsMessages=true \
--/exts/isaacsim.benchmark.services/metrics/metrics_output_folder=/tmp/resultsIsaac Sim with Nsight:
export CARB_PROFILING_PYTHON=1
sudo prlimit --nofile=65536:65536 /bin/bash -c \
"export OMNI_KIT_ALLOW_ROOT=1; \
export DISPLAY=:0; \
export OMNI_PASS='<YOUR_API_KEY>'; \
export OMNI_USER='\$omni-api-token'; \
nsys profile \
--force-overwrite=true \
--output=isaacsim_profile \
--sample=system-wide \
--trace=cuda,nvtx,vulkan,osrt \
--gpu-metrics-devices=all \
--gpuctxsw=true \
--cuda-memory-usage=true \
--cuda-graph-trace=graph:host-and-device \
./python.sh standalone_examples/benchmarks/benchmark_camera.py \
--num-cameras 1 --num-frames 100 --headless \
--/app/profileFromStart=true --/profiler/enabled=true \
--/app/profilerBackend=nvtx --/app/profilerMask=1 \
--/plugins/carb.profiler-tracy.plugin/fibersAsThreads=false \
--/profiler/channels/carb.events/enabled=false \
--/profiler/channels/carb.tasking/enabled=false"Isaac Lab with Nsight:
sudo OMNI_KIT_ALLOW_ROOT=1 DISPLAY=:0 \
TRACY_NO_SYS_TRACE=1 TRACY_NO_CALLSTACK=1 CARB_PROFILING_PYTHON=1 \
nsys profile --force-overwrite=true --output=isaaclab_profile \
--sample=system-wide --trace=cuda,nvtx,vulkan,osrt \
--gpu-metrics-devices=all --gpuctxsw=true \
--cuda-memory-usage=true --cuda-graph-trace=graph:host-and-device \
./isaaclab.sh -p scripts/benchmarks/benchmark_non_rl.py \
--task=Isaac-Cartpole-Direct-v0 --viz none --num_frames 100 \
--kit_args "--/app/profileFromStart=true --/profiler/enabled=true --/app/profilerBackend=nvtx --/app/profilerMask=1 --/plugins/carb.profiler-tracy.plugin/fibersAsThreads=false --/profiler/channels/carb.events/enabled=false --/profiler/channels/carb.tasking/enabled=false"Export Handoff
Export traces here, then use nsys-analyze for SQL queries, Tracy Statistics/Range Limit comparison, zone ranking, phase detection, and interpretation.
Tracy capture already applies LZ4 compression. For sharing very large .tracy files, optionally recompress with update -z 1.
nsys export --type=sqlite -o profile.sqlite profile.nsys-rep
csvexport profile.tracy > zones.csv
TRACY_UPDATE_BIN=$(command -v update || command -v tracy-update || true)
[ -n "$TRACY_UPDATE_BIN" ] && "$TRACY_UPDATE_BIN" -z 1 profile.tracy profile.recompressed.tracyCPU Governor — Performance Mode
MANDATORY before any benchmark. See the perf-tuning skill for commands and details.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

