Skip to main content

isaac-sim-troubleshooting

Reference for Isaac Sim hangs, freezes, and performance stalls. Use when startup, MDL, physics, or Replicator blocks progress.

Source facts

Repository
isaac-sim/IsaacSim
Last source activity
September 18, 2026 at 16:05
Detected SKILL.md language
English
Stars
4,243
Forks
571

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
2 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
isaac-sim-troubleshooting
description
Reference for Isaac Sim hangs, freezes, and performance stalls. Use when startup, MDL, physics, or Replicator blocks progress.
license
Apache-2.0
metadata
{"author":"Renato Gasoto <info@nvidia.com>"}
# Isaac Sim 6 Troubleshooting — Large USD Scene Hangs ## Purpose Diagnose Isaac Sim startup hangs, stage-load stalls, MDL/shader compilation freezes, physics stepping blocks, Replicator/Hydra issues, Nucleus latency, and GPU OOM crashes. ## Prerequisites - Built Isaac Sim (`$ISAAC_SIM_DIR` or `_build/linux-x86_64/release`). - NVIDIA GPU with a current driver (`nvidia-smi`). - Shell env contract from `isaac-sim-orchestrator`: `$ISAAC_SIM_DIR`, `$ISAAC_LAB_DIR`, `$WORKSPACE_DIR`. ## Limitations - Symptom lists are heuristic; root causes can overlap across subsystems. - Some fixes require local Kit builds or NVIDIA internal-only packages. ## Troubleshooting | Error / symptom | Cause | Solution | |---|---|---| | Extension or import not found | Wrong `$ISAAC_SIM_DIR` or stale build | Point env vars at `_build/linux-x86_64/release` or rebuild | | Black or empty frames | Missing lights or non-RTX render mode | Add dome/key light; confirm RTX / PathTracing settings | | Hang on stage load or first render | MDL compile or oversized stage | Follow isolation steps in `isaac-sim-troubleshooting` | | Hang on shutdown / `SimulationApp.close()` | `carb.tasking` thread pool deadlock during `shutdown_and_release_framework()` | Use SIGALRM watchdog (see Section 1a) — threading.Event cannot fire when GIL is held by the deadlocking C extension | Diagnosis and resolution for Isaac Sim 6.0 (Kit 110) hangs, freezes, and perf degradation on large USD scenes (10K-150K+ prims, factory/warehouse twins). Upstream debugging docs: `docs/isaacsim/utilities/debugging/` (profiling, Python debugging tutorials). Pair this skill with `profile-isaac-sim` for Tracy-based diagnosis. ## Quick Diagnosis Flowchart ``` Isaac Sim hangs/freezes | +-- During startup (before stage load)? | -> Section 1: Startup Hangs | +-- During shutdown / SimulationApp.close()? | -> Section 1a: Shutdown Hangs (Kit Framework Deadlock) | +-- During stage open / USD loading? | -> Section 2: Stage Loading Hangs | +-- During shader/material compilation? | -> Section 3: MDL/Shader Compilation | +-- During physics stepping / `SimulationManager` setup or timeline play? | -> Section 4: Physics Hangs | +-- During Replicator / sensor capture? | -> Section 5: Replicator Hangs | +-- During rendering (viewport frozen)? | -> Section 6: Hydra/Rendering Hangs | +-- Nucleus/remote asset fetch? | -> Section 7: Nucleus Network Hangs | +-- OOM crash or memory spike? | -> Section 8: Memory Issues | +-- Slow but not frozen? -> Section 9: Performance Optimization ``` ## Section 1: Startup Hangs ### Common Causes and Fixes **1. Extension conflict (circular import)** ```bash ./isaac-sim.sh --/app/extensions/exclude='["problematic.extension"]' ``` **2. Renderer initialization freeze** ```bash ./isaac-sim.sh --vulkan # Force Vulkan ./isaac-sim.sh --reset-user # Reset user settings ``` **3. Thread over-subscription on high-core-count CPUs** ```bash ./isaac-sim.sh \ --/plugins/carb.tasking.plugin/threadCount=16 \ --/plugins/omni.tbb.globalcontrol/maxThreadCount=16 ``` ```python simulation_app = SimulationApp({"headless": False, "limit_cpu_threads": 16}) ``` **4. Nucleus login popup hang** — Force-kill Isaac Sim and restart. Complete login before proceeding. ## Section 1a: Shutdown Hangs (Kit Framework Deadlock) ### Symptom `SimulationApp.close()` never returns. Process hangs indefinitely (or until CI kills it at 1500s). Stack trace shows threads blocked in `futex_wait` inside `carb.tasking` thread pool teardown during `shutdown_and_release_framework()` or `unload_all_plugins()`. ### Root Cause `shutdown_and_release_framework()` calls `app->shutdown()` then `framework->unloadAllPlugins()`. These are C extension calls that hold the GIL while internally deadlocking on native thread joins. A Python-side `threading.Event.wait()` watchdog cannot fire because it needs the GIL to check its timeout and call `os.kill()` — it starves. ### Fix: SIGALRM Watchdog `SIGALRM` is kernel-delivered regardless of GIL state. Set an alarm before the blocking C call; if it deadlocks, the alarm handler SIGKILLs the process unconditionally. Pattern (generalized — apply to any potentially-deadlocking native teardown): 1. Save the previous `SIGALRM` handler. 2. Install a handler that calls `os.kill(os.getpid(), signal.SIGKILL)`. 3. `signal.alarm(timeout_seconds)` — 120s for full shutdown, 30s for plugin unload. 4. Call the blocking native function. 5. In `finally`: cancel the alarm (`signal.alarm(0)`) and restore the previous handler. ### When to Suspect This - CI job hangs after all test assertions pass (shutdown phase). - `strace` shows the main thread stuck in `futex_wait` inside Kit's plugin system. - Python-based timeout mechanisms (threading, asyncio) silently fail to trigger. ### Key Insight Any time a Python watchdog must guard a C extension call that can hold the GIL indefinitely, `threading.Event`/`threading.Timer` will be starved. Use `signal.alarm()` (Linux) or `os.alarm()` as the only reliable GIL-independent timeout mechanism in CPython. ### Reference - File: `source/extensions/isaacsim.simulation_app/isaacsim/simulation_app/simulation_app.py` ## Section 2: Stage Loading Hangs ### Diagnosis Check layer count: ```python for layer in stage.GetUsedLayers(): print(f" {layer.GetDisplayName()} ({layer.GetFileFormat().formatId})") ``` If layer count > 1,000, this is the primary bottleneck. ### Common Causes **1. Excessive layer count (>1,000 layers)** | Strategy | Cold Load | Layers | |----------|-----------|--------| | Per-asset files | 4 min | 11,488 | | Library packaging | 53s | 8 | Fix: Package assets into library layers (consolidate per-asset files into a small number of library `.usd`/`.usdc` layers; see `usd-composition-architecture` for the layered-asset pattern). **2. Missing/broken references** — Cause USD to try every resolver including network fallbacks. Fix: Audit references: ```python from pxr import Sdf for layer in stage.GetUsedLayers(): for ref in layer.GetExternalReferences(): if not os.path.exists(ref): print(f"MISSING: {ref}") ``` ## Section 3: Shader/MDL Compilation - First launch always compiles MDL shaders — can take 5-15 minutes, normal - Subsequent launches use shader cache - Cache location: `~/.nvidia-omniverse/data/Kit/Isaac-Sim/shader_cache/` - Force rebuild: delete cache folder ## Section 4: Physics Hangs **Physics setup / first-play hangs** (`SimulationManager.setup_simulation`, `timeline.play()`, or the legacy `world.reset()` flow — see [Renaming Extensions](https://docs.isaacsim.omniverse.nvidia.com/latest/migration_guides/isaac_sim_4_5/extensions_renaming.html) to migrate off `omni.isaac.core.World`): usually caused by: - `PhysicsScene` not yet defined when physics starts. - Too many contact pairs on the first step. - GPU dynamics enabled with too many rigid bodies (>100K). Fix: ```python # Ensure PhysicsScene exists before reset if not stage.GetPrimAtPath("/World/PhysicsScene"): ps = UsdPhysics.Scene.Define(stage, "/World/PhysicsScene") # Reduce initial contact storm px_scene.CreateEnableStabilizationAttr().Set(True) ``` ## Section 5: Replicator Hangs - `rep.orchestrator.run()` hangs: ensure the timeline is playing (`omni.timeline.get_timeline_interface().play()` or `isaacsim.core.experimental.utils.app.play(commit=True)`) before invoking. - `step_async()` never completes: use `await rep.orchestrator.step_async()` correctly inside an async context. - Frame capture hangs: call `app_utils.update_app()` (or a `simulation_app.update()`) once before capture so the renderer has a fresh frame. ## Section 6: Rendering (Hydra) Hangs - Viewport black and frozen: Check GPU memory (`nvidia-smi`) - RTX renderer OOM: Reduce texture streaming budget: ```python carb.settings.get_settings().set("/rtx/resourcemanager/textureMipCountBudget", 256) ``` ## Section 7: Nucleus Network Hangs - Set timeout: `carb.settings.set("/omni/client/timeout_seconds", 10.0)` - Use local assets when possible: Copy needed USDs to local disk - Disable Nucleus: Launch with `--/omni/client/enabled=false` for local-only work ## Section 8: Memory Issues - Prims > 150K: Enable instancing (`UsdGeom.PointInstancer`) - Textures: Use texture atlases, reduce resolution - Monitor: `watch -n1 'nvidia-smi --query-gpu=memory.used,memory.free --format=csv'` ## Section 9: Performance Optimization - Layer count: Package into library layers (see Section 2) - Mesh instancing: Use `PointInstancer` for repeated assets - Payload loading: Mark large sub-scenes as unloaded payloads - Physics: Reduce collision mesh complexity for non-critical objects
View on GitHub