← All benchmark runs

Gazebo Profiling — 2026-09-01 (server and GUI)

📄 Server findings report (PDF) (Markdown source) · 📄 GUI findings report (PDF) (Markdown source, GUI section below)

Profiling of the headless Gazebo server (gz-sim-main) on gz-sim PR #3447 (ECM on EnTT) with gz-transport PR #868 + #842 (Zenoh 1.8.0 with shared memory, GZ_TRANSPORT_IMPLEMENTATION=zenoh); every other Gazebo library at the tip of main on 2026-09-01.
CPU: Intel Core Ultra 9 285HX (24 cores, hybrid) · GPU: NVIDIA RTX PRO 3000 (driver 580.159.03, EGL headless) · Kernel 6.17.0-35 · perf 6.17.13 · DART 6.13.2 · OgreNext 2.3.1
Build: RelWithDebInfo, -fno-omit-frame-pointer, ENABLE_PROFILER=OFF. Sampled with perf -e task-clock -F 997 --call-graph dwarf; all worlds at RTF=0; rendering sensor worlds run with --headless-rendering and one subscriber per sensor topic.
Click any flamegraph to open it interactively (click frames to zoom, Ctrl+F to search).

Runtime Flamegraphs (30 s steady state, all threads)

RTF and steps/s are the steady state rate between two /world/*/stats snapshots taken 10 s and 30 s after launch (steady/results_unpinned.tsv); a single snapshot would include the hundreds of thousands of empty iterations a free running server executes before its entities are created. "Cores busy" is CPU time / 30 s during the perf capture.

WorldStress axisRTF (steady)Steps/s (steady)Cores busyFlamegraphHotspots
3k_shapes_static3000 static models: framework + broadphase0.242391.00Opentxt
3k_shapes3000 dynamic models: DART solver0.014141.00Opentxt
sensorsnon rendering sensors: per step overhead50.650,6441.00Opentxt
jettycomplex scene: ODE broadphase (4 ms step)1.984951.00Opentxt
gpu_lidar_sensorone GPU lidar, 1 subscriber50.250,1561.27Opentxt
sensors_demosix rendering sensors, 8 subscribers5.35,3351.40Opentxt
moving_robots_and_sensorsPR #3846: 2 vehicles, arm, 10 sensors, 12 subscribers3.03,0151.49Opentxt

Per Thread Flamegraphs

Share of process CPU per thread. The simulation thread is always saturated; rendering sensors run on a second thread; Zenoh transport threads (tx-0, rx-*, SHM watchdogs) stay below 1.2%.

WorldSimulation threadSensors render threadAll threads
3k_shapes_static100%tsv
3k_shapes100%tsv
sensors100%tsv
jetty100%tsv
gpu_lidar_sensor73%26%tsv
sensors_demo32%66%tsv
moving_robots_and_sensors64%34%tsv

Loading Flamegraphs (startup + 1 iteration)

Wall clock is the median of three unprofiled runs of gz-sim-main -s -r --iterations 1 (*_wallclock_unprofiled.txt); the perf wrapped run in *_wallclock.txt is 5 to 7x slower because of DWARF stack copying.

WorldWall clockFlamegraph
3k_shapes_static2.05 sOpen
3k_shapes2.11 sOpen
sensors0.82 sOpen
jetty1.55 sOpen
gpu_lidar_sensor1.22 sOpen
sensors_demo1.19 sOpen
moving_robots_and_sensors1.22 sOpen

Cache Counters (perf stat, 10 s, unprofiled)

WorldIPCL1d missLLC load missRaw
3k_shapes_static0.718.79%15.7%txt
3k_shapes1.611.15%54.3%txt
sensors2.710.10%6.2%txt
jetty2.111.90%0.5%txt
gpu_lidar_sensor2.590.27%6.6%txt
sensors_demo2.650.73%39.0%txt
moving_robots_and_sensors2.470.79%37.0%txt

Priority 1 validated: per step bookkeeping around dartsim WorldForwardStep

The server report's Priority 1 was implemented in two parts: gz-sim returns the cached step output by reference instead of copying it twice per step (merged upstream as gz-sim #3850 on 2026-09-01), and dartsim skips the NaN check and the ChangedWorldPoses pass for static models (gz-physics branch caguero/dartsim_static_bookkeeping). Steady state step rate (two stats snapshots 20 s apart, median of two interleaved runs pinned to one P core), same worlds and build:

WorldBeforegz-sim part onlyBoth PRsChange
3k_shapes_static254 steps/s261 steps/s462 steps/s1.82x
sensors49,729 steps/s51,558 steps/s51,982 steps/s+4.5%
3k_shapes14.6 steps/s14.6 steps/s14.8 steps/s+1.7%
jetty500 steps/s502 steps/s507 steps/s+1.4%
moving_robots_and_sensors1,833 steps/s1,853 steps/s1,840 steps/swithin noise
sensors_demo (unpinned, 3 runs each)5,288 to 5,509 steps/s5,005 to 5,352 steps/smedians 5,335 vs 5,227, −2%, within the spread of this GPU bound world
3k_shapes_static flamegraphsOpen
Before (baseline build, same day)Open
After both PRs (DART World::step is 90% of the process, was 63%)Open
Differential (blue = removed, red = grew in share)Open
Raw steady state data (pinned interleaved runs, unpinned runs)tsv / tsv

GUI Process Profiling

📄 GUI findings report (PDF) (Markdown source)

Same workspace and date; perf attached to the GUI client (gz-sim-gui-client) with the simulation playing (gz sim -r), rendering on the NVIDIA GPU via PRIME offload, server and GUI on Zenoh with SHM. For moving_robots_and_sensors the twelve sensor subscribers and the vehicle/arm commands are applied as in the server run.

GUI Runtime Flamegraphs (30 s, all GUI threads)

WorldSceneGUI coresRender threadQt mainZenoh threadsFlamegraphSubsystems
shapesidle baseline, six primitives0.1566%10%2.5%Opentxt
3k_shapes_static3000 visuals, nothing moves1.0489%6%0.6%Opentxt
3k_shapes_dynamic3000 visuals, all moving0.8188%7%0.6%Opentxt
jettycomplex meshes and textures0.4975%10%5.3%Opentxt
moving_robots_and_sensorsPR #3846: small moving scene, 2.4 kHz state stream0.4427%34%25.7%Opentxt

GUI Per Thread Flamegraphs

WorldRender threadQt main threadLargest Zenoh threadAll threads
shapes66%10%rx-1 1.2%tsv
3k_shapes_static89%6%rx-2 0.3%tsv
3k_shapes_dynamic88%7%rx-0 0.5%tsv
jetty75%10%rx-1 2.9%tsv
moving_robots_and_sensors27%34%rx-0 12.2%tsv

GUI Loading Flamegraphs (GUI launch, 20 s window)

WorldFlamegraph
3k_shapes_staticOpen
jettyOpen
moving_robots_and_sensorsOpen

Server State Stream Consumed by the GUI

5 s of gz topic -e -t /world/<name>/state with the world playing. The mixed world publishes on every one time change (JointVelocityCmd written each step by DiffDrive / AckermannSteering).

WorldMessagesEntities / msgPayload / msgSample
3k_shapes_static47 Hz130.2 KBsample
3k_shapes (dynamic)11 Hz50428 KBsample
moving_robots_and_sensors2,443 Hz240.9 KBsample

GUI Cache Counters (perf stat, 10 s)

WorldIPCL1d missLLC load missRaw
3k_shapes_static0.692.36%69.7%txt
3k_shapes0.912.19%43.0%txt
moving_robots_and_sensors1.881.04%1.7%txt

Unified Summary (gz_summary.sh)

WorldReport
3k_shapes_staticTSV / txt
3k_shapesTSV / txt
sensorsTSV / txt
jettyTSV / txt
gpu_lidar_sensorTSV / txt
sensors_demoTSV / txt
moving_robots_and_sensorsTSV / txt

Generated with FlameGraph and Linux perf. Scripts and worlds: github.com/caguero/gz-profiling.