System designTroubleshooting

Embedded vision box: why sustained recording FPS drops and the fix

A grab test holds 60 FPS but sustained two-camera recording sinks to 18. Why the power profile throttles the encoder, and how MAXN with pinned clocks fixes it.

LumaSpec Vision10 min read Share on LinkedIn

On this page 9 sections
  1. 01The pattern: grab tests pass, sustained recording sinks
  2. 02Read the power profile first
  3. 03Rule out storage, streams and links in four short tests
  4. 04The fix: set MAXN and pin the clocks
  5. 05Worked example: two 1920 × 1200 streams at 60 FPS on a 25 W profile
  6. 06When MAXN is not enough
  7. 07Controller hardware that takes over the recording job
  8. 08Checks before the next benchmark run
  9. 09Questions

Your grab benchmark holds a clean 60 FPS from both GMSL cameras, and the same two streams sink to 18-19 FPS the moment recording starts. That pattern points away from the cameras and the capture link, and straight at the compute budget of the embedded box. This guide gives you the sequence that separates a throttled board from a genuine capacity limit: read the power profile with nvpmodel, rule out storage and single-stream faults with four short tests, set the MAXN profile, pin the clocks with jetson_clocks, and re-run the sustained test. The worked example computes the pixel budget for two 1920 × 1200 streams at 60 FPS, so you know what the encoder must sustain before you blame anything.

The pattern: grab tests pass, sustained recording sinks

Write down the signature before changing anything:

  • Grab-only: both cameras deliver essentially 60 FPS, with even timestamps and no dropped frames.
  • Sustained recording with H.264 GPU encoding: both streams start near 60 FPS, then settle at 18-19 FPS per camera and stay there.
  • Depth, live preview and preview saving are disabled, so no optional consumer is hiding in the numbers.

A grab test exercises only the delivery path: sensor, GMSL link, capture driver and memory. Recording adds the stages that consume compute — image processing, H.264 encoding and the disk write. That is why the two numbers disagree. A grab benchmark can also run partly out of buffer, as camera burst capture faster than link bandwidth explains, so it measures delivery rather than steady-state processing. When acquisition outruns processing anywhere in a vision system, frames queue and then drop; the host-side version of that imbalance is covered in acquisition faster than processing: fix the frame rate gap.

Read the power profile first

On the box in this failure mode, nvpmodel -q reports the 25 W profile as mode 3, and that one line explains the collapse. A power profile caps total board power, and under sustained load the clock governor pulls CPU, GPU and encoder clocks down until consumption fits the cap. Short grab bursts fit under it; a continuous two-stream encode does not, so the encode rate settles at whatever the capped clocks sustain.

MAXN is the opposite setting: the unconstrained profile on this module class, which enables every core at its maximum clock frequency with no fixed cap. The module vendor's guidance for exactly this symptom is to enable MAXN and run jetson_clocks, and it confirms that 18-19 FPS sustained is the expected behavior under the 25 W profile.

Run nvpmodel -q now and write the mode number next to every benchmark result. A frame rate quoted without the power profile it was measured under is not a repeatable number.

Power throttling is the likely cause when the pattern matches, but other faults look similar, and each has a fast test. Run them in this order:

  1. Storage write rate. Record a 30-second clip to a RAM-backed path and the same clip to the normal disk. A 30-second clip at 8 bit per pixel produces about 8.3 GB (2 × 2,304,000 px × 8 bit × 60 FPS × 30 s = 66.4 Gbit), well inside the 15 GiB of RAM this box exposes. If the frame rate recovers in RAM, the storage chain was the cap.
  2. One stream alone. Record a single camera with encoding on. If one stream holds 60 FPS and two streams collapse, every per-stage pipeline is sound and the aggregate budget is the limit — the power-mode signature again.
  3. Exposure-driven caps. On some cameras a long exposure lowers the achievable frame rate by itself, as depth camera frame rate drops: exposure settings cap the FPS explains. That fault caps grab tests too, so it cannot explain a 60 FPS grab beside an 18 FPS recording.
  4. Link faults. A failing GMSL link or capture card produces torn frames, sporadic dropouts or a camera that disappears — the signatures covered in GMSL camera not detected: capture card power and cabling. A clean, steady 18-19 FPS on both streams is not a link fault.

Four tests, ten minutes, and the cause is either the power profile or a genuine capacity limit.

The fix: set MAXN and pin the clocks

  1. Read the current profile with nvpmodel -q and note the mode number.
  2. Switch the profile to MAXN through nvpmodel, which lists the module's profiles by number; select the MAXN entry and confirm with nvpmodel -q.
  3. Pin the clocks by running jetson_clocks. Locked clocks stop the governor scaling down mid-run, and they make consecutive benchmark runs comparable.
  4. Re-run the same sustained recording: same resolution, same clip length, same disk.
  5. Watch clock and temperature readouts with the board's system monitor while it runs, and record both numbers with the result.

When encoder throughput was the cap, sustained recording returns to roughly the grab rate: 60 FPS on both streams instead of 18-19.

Worked example: two 1920 × 1200 streams at 60 FPS on a 25 W profile

Inputs. Two cameras recording at once; 1920 × 1200 px per frame as set in the capture application; 60 FPS per camera as the target; 18-19 FPS per camera measured during sustained recording; grab-only at 60 FPS per camera; nvpmodel -q reporting the 25 W profile, mode 3. Every input comes from the failing rig itself, none from a datasheet.

Rule in words. Sustained pixel throughput in pixels per second equals streams × width × height × frame rate. Raw ingest in bits per second equals pixel throughput × bits per pixel.

frame = 1920 × 1200 px = 2,304,000 px one stream = 2,304,000 px × 60 FPS = 138,240,000 px/s two streams = 2 × 138,240,000 px/s = 276,480,000 px/s ≈ 276 Mpx/s raw ingest = 276,480,000 px/s × 8 bit = 2,211,840,000 bit/s ≈ 2.21 Gbit/s measured = 2 × 2,304,000 px × 18.5 FPS = 85,248,000 px/s ≈ 85 Mpx/s kept = 18.5 / 60 = 0.31 ≈ 31% of target

Result. The rig asks the encoder for about 276 Mpx/s — 2.21 Gbit/s of raw pixels at 8 bit per pixel, twice that at 16 bit — and sustained about 85 Mpx/s (using 18.5 FPS, the midpoint of the measured 18-19), 31% of the target, while the grab test passed at 100%.

Decision. Grab at full rate with sustained recording below about half of target is the compute-budget signature: set MAXN, pin the clocks, and re-run. If sustained recording then holds 60 FPS on both streams, the profile was the whole fault. If it still sits near a third, the module's H.264 encoder lacks headroom for 276 Mpx/s and no setting will create it — record at 30 FPS, which halves the budget to about 138 Mpx/s, reduce the resolution, or move the job to a controller built for the load.

Multi-stream budgets compound per camera; multi-camera 3D processing performance: plan throughput plans that math on the host side, and the guide on sizing embedded vision hardware for 60 fps RGB analysis runs the same budget for a 60 FPS analysis load.

When MAXN is not enough

If the profile was already unconstrained, or MAXN with pinned clocks still misses the target, work down this list:

  • Encoder headroom. Hardware H.264 throughput is fixed per module generation; no software setting adds more. Test 30 FPS first — it halves the pixel budget and is usually enough for review and training footage.
  • Depth on top of recording. Depth computation shares the GPU with the encoder. With depth enabled alongside two encoded streams, the recording budget shrinks again, so record with depth off unless the application needs both at once.
  • Sustained storage rate. The disk must write the encoded stream for the whole clip with margin. The RAM-backed test above separates a storage cap from a compute cap in minutes.
  • A PC-based stack instead. Desktop recording software hits the same below-20-FPS wall for pipeline reasons of its own; the checklist for troubleshooting LabVIEW IMAQ recording below 20 fps is the matching reference there.

If all four check out and the rate still collapses, the conclusion is capacity, not configuration.

Controller hardware that takes over the recording job

When capacity is the conclusion, the fix is a recorder with multi-camera throughput designed in. Vision controllers combine several GigE ports, PoE camera ports and industrial storage in fanless housings, so sustained streams stop competing for a capped power budget. Pick the unit by port count and memory from the spec table:

Specification MV-VC5525-256G70-NN MV-VC4712-256G10-2TH
CPU Intel® Core i5-12400 Intel® Core Ultra 7 processor 255H
Memory 32 GB 2 × DDR5 6400 MHz non-ECC SO-DIMM memory slots; Up to 48 GB per slot, Up to 96 GB with two slots
Storage 256 GB SSD 1 × 7-pin SATA3.0, 1 × M.2 SATA 2280, 1 × M.2 NVMe 2280; 1 × 2.5"/3.5" drive bay
GPU Intel® UHD Graphics 730 Intel® Arc 140T GPU
Operating system Unactivated Windows 10 Windows 11 64-bit (not activated)
Video output HDMI interface × 1, VGA interface × 1; Supports independent display output at the same time; Max. resolution 1920 × 1080 @ 60 Hz Independent dual display supported; 1× HDMI port, Up to 1920 × 1080 @ 60 Hz; 1× VGA port, Up to 1920 × 1080 @ 60 Hz
Digital I/O Opto-isolated input × 8; Opto-isolated output × 12 ( supports NPN/PNP switching), digital-isolated low-side driver output × 8; Non-isolated bi-directional differential I/O × 4 18 digital isolated inputs supported; 18 isolated digital outputs
Network interface GigE interface × 7, including interface for PoE × 4 4× Gigabit Ethernet ports; PoE power supported, 15 W per port, 25 W total across 4 ports
USB Interface USB 2.0 × 4, USB 3.0 × 4, built-in USB 2.0 × 1 4× USB 2.0 ports; 2× USB 3.0 ports; 1 × internal USB2.0 port
Serial Port RS-232 × 2 by default, supports switching to RS-485 and RS-422 2 × configurable RS-232/RS-422/RS-485
Light interface 24 VDC constant voltage × 8; (Max. power consumption of single channel is 72 W, total max. power consumption 190 W) SMR-03V-BC female; 6-channel 24 V constant-voltage light drive, Max. power per channel: 72 W, Max. total power: 110 W
Extended interface SATA 3.0 interface × 2, M.2 NVME interface × 1; PCIe × 16 extended interface × 1, PCIe × 8 extended interface × 1, PCIe × 4 extended interface × 2; (When the PCIe × 8 extended interface is used, the PCIe × 16 will only provide half of the bandwidth.) 1× PCIe 4.0 x8 slot, 2× PCIe 4.0 x4 slot
Price $4,479.00 · quoted $6,049.00 · quoted

All 2 share: Certification CE, KC. Values as printed in each product's data sheet; open a part for its drawing and full specifications.

A single-stream recorder needs less machine:

Vision controllersHikrobot MV-VC3301H-128G66 I3-8100, 8GB+128G SSD, No PoE, PCIe expansion supported, Incl. VM6200Pro licenseMV-VC3301H-128G66
LAN ports
5+ LAN ports
USB 3 ports
3-4 USB 3 ports
Light outputs
4 built-in channels
Memory
8 GB
$2,419.00View partBuild a system with it

If the camera side needs work instead, the camera finder filters the shop's stereo 3D sensors by type and series, including GMSL models. For frame-rate limits on the capture side, 3D camera frame rate low on software trigger walks through the mode and data-stream causes to check before blaming the host.

Checks before the next benchmark run

  • Run nvpmodel -q before every benchmark and put the mode number next to the result.
  • Quote recording FPS only from runs of the full pipeline: capture, encode and write together.
  • Pin clocks with jetson_clocks before comparing two runs, so clock scaling cannot skew either one.
  • Measure one stream, then two, before concluding anything about aggregate capacity.
  • Watch clock and temperature readouts through a multi-minute run, not just the first seconds.
  • After a reflash, an OS update or a board swap, re-check the profile and re-apply the clock pinning in the recorder's start-up script.

More host-side failure patterns live on the systems topic page. The closing decision, stated plainly: a grab test at 60 FPS never proves a recording rig works — only a sustained, clock-pinned, full-pipeline run does. If your numbers say the module cannot hold two 60 FPS streams, send the bench results through the contact page and we will size the recorder with you.

Questions

Why does recording start at 60 FPS and only then drop?

The throttle is load-driven, not instant. A recording opens at nearly the grab rate because clocks are still high; within seconds the continuous dual-stream encode trips the capped power budget, the governor lowers the clocks, and the frame rate settles at what the reduced clocks sustain — 18-19 FPS per camera in this configuration. A grab-only test never accumulates that load, which is why it stays at 60 FPS throughout.

Is the 18-19 FPS a GMSL link or camera fault?

No. The grab-only benchmark at 60 FPS on both cameras already proves the sensors, link and capture driver deliver full rate into memory. Link faults look different: torn or frozen frames, sporadic dropouts, or a camera that drops off the bus entirely. A clean, steady rate near one third of the target on both streams at once is the signature of a shared compute budget, not of a failing link or sensor.

Does jetson_clocks survive a reboot?

Treat clock pinning as a per-session setting. Put it in the recording application's start-up script so a power cycle cannot leave the box scaling clocks down mid-shift, and re-check the profile with nvpmodel -q after every reflash, OS update or board swap. A start-up script that sets the profile, pins the clocks and only then opens the recording files takes both settings out of the category of things a maintenance visit can undo.

What should I change first if MAXN still cannot hold 60 FPS?

Halve the frame rate. Recording at 30 FPS cuts the sustained budget from about 276 Mpx/s to about 138 Mpx/s — half the load, and the first thing to test before touching hardware. If the application truly needs 60 FPS, reduce resolution next, then move the encode job to a vision controller with multi-camera throughput designed in. Keep depth off while recording in every case: it shares the GPU with the encoder.

Does the MAXN profile draw much more power?

Yes in sustained work, and slightly at idle when clocks stay pinned. The 25 W profile caps the whole board; MAXN removes the cap, so sustained draw rises to whatever the recording workload demands, and pinned clocks add draw between recordings too. Budget for it: check the board's own power readout during a full recording run and make sure the supply and enclosure were not sized tightly around the capped profile.