You can tell what limits Plex by reproducing one known workload and looking for the resource whose pressure rises at the same time the stream slows. Do not upgrade the busiest-looking component first; high utilization matters only when it lines up with the playback failure.
Start with one file, one client, one playback mode, and one time window. Then separate Plex conversion work from the operating-system signals for CPU, memory, storage, and network. The test is complete only when changing one suspected resource changes the original Plex symptom while the other conditions stay stable.
Reproduce One Plex Workload Before Reading System Metrics
Choose a file and client that reproduce the problem reliably. Record whether the symptom is slow startup, repeated buffering, a transcode that falls behind, a scan that makes playback lag, or a remote-only failure, because each symptom points to a different wait path.
A Plex-specific troubleshooting flow should begin with the active session rather than a generic CPU graph. A practical Dashboard-first check separates Direct Play, transcoding, network, and storage branches before you start changing the server.
Keep the file, selected tracks, client quality, and concurrent workload unchanged while you collect system metrics. If the symptom moves around between tests, simplify the workload until the same failure repeats; otherwise a later CPU or disk spike may belong to a different job.
Use the Plex Session to Separate Delivery From Conversion
Read the Plex session while the problem is happening. Direct Play means the server is mostly delivering the stored media, while a video transcode adds a real-time conversion path that can shift the bottleneck toward CPU or hardware video engines.
Use that mode as a branch, not as a conclusion. A transcode that falls behind makes compute a strong candidate, but Direct Play that buffers still leaves storage and network in scope. If the same file switches mode when subtitles, audio, or quality change, reproduce the problem again with the original request before comparing host metrics.
The exit from this section is a fixed playback mode tied to the symptom. If you cannot state whether the failing test is Direct Play or Transcode, stop here; comparing RAM, disk, and network data before the media path is stable makes the remaining metrics harder to interpret.
Test CPU and RAM Pressure Together
Watch CPU utilization, run queue or load, available memory, and swap activity during the fixed Plex test. CPU pressure is strongest when the Plex process or its transcoder consumes sustained compute while output falls behind; memory pressure is stronger when the system starts reclaiming or swapping and response time degrades even though CPU is not the only busy resource.
A general Linux performance workflow uses tools such as top, vmstat, iostat, and sar to separate resource pressure. In particular, CPU, memory, disk, and network need different saturation signals rather than one overall utilization number.
If CPU stays near its limit only during the failing transcode and the stream recovers when conversion is removed or accelerated, treat compute as the leading bottleneck. If swapping or memory reclaim rises instead, reduce concurrent memory-heavy jobs or add memory, then repeat the same Plex workload before touching storage or network settings.
Test Storage With the Same Media Path
For storage, read the same media from the same filesystem while the symptom reproduces and watch device latency, queueing, and I/O wait. Capacity and performance are separate: a disk can have free space and still respond slowly because another job is creating random I/O or because the media path sits behind a busy pool or network mount.
Linux tools such as iostat and iotop are useful because disk I/O wait and device throughput expose a different failure mode from high CPU or swap activity. Compare those numbers with the exact buffering interval rather than with an idle average.
If the file reads cleanly while Plex buffers, storage becomes less likely. If latency and queueing rise with the symptom, pause the competing disk job or move the test file to a known-fast local path; if Plex immediately recovers under the same playback mode, storage has passed from suspicion to evidence.
Test Network Throughput on the Actual Path
Test the path between server and client separately from Plex. A local wired client can distinguish a remote-route problem from a server-wide resource problem, while an end-to-end throughput test can show whether the path can sustain the media rate without depending on the Plex application.
Use a tool such as iperf3 when you control both ends. A network test should look at throughput, packet loss, and latency, because a headline link speed does not prove that the actual route delivers stable application traffic.
If the independent network test collapses while CPU, memory, and storage remain healthy, fix the path before tuning the transcoder. If the network has comfortable sustained headroom and the Plex symptom persists on a wired local test, return to the server resource branch rather than buying a faster router.
Change Only the Resource That Failed the Test
Choose the first resource that failed a discriminator and make one change that should affect only that branch. Examples include enabling a verified hardware transcode for a compute-bound stream, reducing a memory-heavy background job, rescheduling a disk-intensive task, or bypassing a weak network hop.
For Plex-specific follow-up, the ZimaSpace buffering diagnostic path provides a deeper continuation once you know whether playback mode, conversion load, network stability, or storage responsiveness is the branch you need to change.
Repeat the original file, client, and playback mode after the change. Call a component the bottleneck only when the original symptom improves and the matching pressure signal falls or gains headroom. If the symptom is unchanged, restore the baseline and test the next branch instead of stacking upgrades until the real cause disappears by accident.
Support & Tips
More to Read

Can Plex Share a GPU With Another Docker Container?
Plex and another container can often access the same GPU, but you must test driver support, device mapping, video-engine load, memory, and recovery behavior.

How to Tell Whether a Plex Error Comes From the Client or Server
Reproduce the same item on another client, compare the session path, then collect server evidence only after scope tells you where the failure actually...

How to Configure Plex Cache and Transcode Temporary Storage
Protect persistent Plex state while placing transcode temp files on suitable local storage, then verify cleanup, free space, and restart behavior.

