vizmaya desk · 4 Nov 2026
GPU utilization: what “busy” really means
Your dashboard says the chip is busy. Busy doing what?
A 15-page paper tries to find out. Start with one word.
Source: Shaikh, “GHOST-Driver”, p.1
A high number feels like a full tank.
nvidia-smi is NVIDIA’s standard tool for watching a GPU. It shows one utilization number per chip.
It looks like a fuel gauge. High means the chip is working hard.
Is that really what the number measures?
Source: paper p.1-2
The number asks one yes-or-no question.
Was any task running on the chip during this short window? If one task ran the whole time, the meter reads fully busy.
That holds even when the task uses one tiny corner of the chip.
VerifiedSo what happens when a job is stuck waiting?
Sources: paper p.1-2; PyTorch docs; NVIDIA forum; Netdata guide. Grid is an illustration.
Waiting does not count as busy.
The paper says driver delays hide inside the busy number. NVIDIA defines the number as time with a task running.
A job stuck waiting is not running. By that definition, it would not count.
ContestedAnd how long is the window the number is averaged over?
Sources: paper p.1 (claim); NVIDIA definition via PyTorch docs. Strip is an illustration, not to scale.
Even the clock is in dispute.
The paper says nvidia-smi samples every 100 ms. NVIDIA’s own wording gives a period between 1 second and 1/6 of a second.
1/6 of a second is 166.7 ms, so even the fastest case is slower than the paper says.
ContestedIf the number is blurry, what is really going on inside?
Sources: paper p.2, p.4, p.9; NVIDIA forum; PyTorch docs. 166.7 = 1000 / 6 (computed).
A job takes a hidden road before it reaches the chip.
Your app does not talk to the chip directly. Its work first passes through the operating system’s GPU driver, which checks memory, waits for earlier work and queues the job.
The paper says normal profiling tools cannot see inside that road.
What if you could time every stop on that road?
Source: paper p.1-3
The paper puts six stopwatches on the road.
The stops are: request arrives, memory check, wait for earlier work, handed to the queue, chip scheduled, done signal.
It stamps the time at each stop and adds them up for every job.
Which stop does the paper bet is the slowest?
Source: paper p.6-7, Table I (small labels are the paper’s stage names)
The paper bets the waiting stop is the slow one.
That stop is a fence wait: a job waits for earlier work to finish. The paper calls it the main blocking point, citing Linux kernel documents.
It drew the ranking as a sketch. It did not time it.
Sketch, not measuredHow do you watch every job without slowing it down?
Source: paper p.7 (Stage 3), p.9-10, Fig. 3. “No absolute values are claimed”, p.10.
Tiny watchers can note the time without changing the driver.
The tool uses eBPF, a Linux feature that runs small, safety-checked programs inside the operating system.
Each watcher fires when a job passes one stop and writes down the time.
What does all that watching cost?
Source: paper p.2-3, p.5-8
5,000 jobs a second cost 2.655 ms of CPU.
2.655 ms vs 20 ms
That is the paper’s own math: 3 × 78 ns plus 3 × 99 ns is 531 ns per job, times 5,000 jobs. The paper rounds it to 2.7 ms against a budget of 20 ms, which is 2% of one core.
ComputedWhat if jobs arrive faster?
Source: paper p.9 (inputs and budget); arithmetic is ours. 531 × 5,000 = 2,655,000 ns = 2.655 ms.
The watchers alone hit the budget near 37,665 jobs a second.
Cost grows in a straight line: 531 ns for every job. Double the load and the cost doubles.
This counts the watchers only. It leaves out the maps, the buffer and the daemon that the tool also needs.
ComputedSo what should you do with all this?
Source: paper p.7-9 (stage mapping, costs, 20 ms budget); arithmetic is ours: jobs per second × 531 ns. 20,000,000 / 531 = 37,665.
Next time a GPU looks “busy”, ask three questions.
- How long is the window it averages over?NVIDIA wording: 1/6 s to 1 s
- Busy with how much of the chip?The number does not say
- What is each job waiting on before it runs?The question this paper wants answered
Does the paper’s tool answer the third question yet?
Sources: slides 3 to 5; paper p.1-2. Window range is Contested (slide 5).
The tool has no hardware results yet.
The paper says so itself: its overhead is arithmetic, its delay chart is a sketch, and its gains are projections. Its own numbers also disagree in places.
hardware measurements. “Empirical validation… is in preparation”, p.14.
nanoseconds per event. Same paper: p.2 says 12, p.9 uses 63 to 99.
the paper’s projected combined cut, p.12, vs what its four parts would give if they stacked. Computed. No method shown.
And will its tripwires survive the next Linux update?
Source: paper p.2, p.9, p.10, p.12, p.14. 74.7% = 1 − (0.58 × 0.74 × 0.83 × 0.71), computed. The 56% is a projection, not a measurement.
Its road signs use names that changed between kernels.
The paper says one binary works from Linux 5.10 to 6.x. A newer kernel header lists the scheduler’s trace events under new names.
I read header snippets, not the full files, so treat this as a flag.
Contested| Kernel | Trace event names seen |
|---|---|
| 5.10.46 matches the paper | drm_sched_job_wait_depdrm_run_jobdrm_sched_process_job |
| v6.19-rc7 newer | drm_sched_job_queuedrm_sched_job_rundrm_sched_job_add_depdrm_sched_job_done |
Has anyone measured something like this for real?
Sources: paper p.7, p.12; 5.10.46 header; v6.19-rc7 header.
A related tool, gpu_ext, did measure real workloads.
These are the gpu_ext authors’ reported results from real tests, with low overhead for instrumentation only. It is a different system with a different goal.
Its numbers are not comparable with this paper’s projections.
Verified: arXiv abstractWhere to read more, and who to credit.
Source: gpu_ext, arXiv:2512.12615; paper p.13
Sources & method
The paper
- Azhar Shaikh, “GHOST-Driver: A Non-Intrusive eBPF Framework for GPU Kernel Driver Latency Observability in AI Inference Infrastructure”, 2026, 15 pages. Attached PDF; file name 2611.03649v1.
Checks
- PyTorch docs: utilization
- NVIDIA developer forum: utilization
- Netdata guide
- Linux 5.10.46 trace header
- Linux v6.19-rc7 trace header
- gpu_ext, arXiv:2512.12615
- OpenAlex search: no record of the paper
Method
- Every number is from a paper page or computed, with inputs shown. Contested claims are labeled. Claims I could not check, such as 47%, 200 µs, 3.7× and the projected gains as results, are left out. I did not open the paper’s references.
Photos
- AMD Fiji GPU package: C. Spille / pcgameshardware.de, Commons, CC BY-SA 4.0
- A Complex Graphics Card: Nick Stathas, Commons, CC BY-SA 4.0
- Network cables in server room: ProjectManhattan, Commons, CC BY-SA 3.0
- GPU workstation lid off: Wikideas1, Commons, CC0
Paper by Azhar Shaikh. Research and story by vizmaya desk, 4 Nov 2026. More vizmaya stories
Source: full list above