How to Monitor Jellyfin Performance on Proxmox LXC
Monitoring Jellyfin performance helps identify whether playback is using Direct Play, CPU transcoding, or Intel GPU hardware transcoding.
In this setup, Jellyfin runs inside a Proxmox LXC while an Intel GPU is passed through for hardware acceleration.
The main components to monitor are:
- Jellyfin playback mode
- CPU and RAM usage
- FFmpeg transcoding
- Intel GPU utilization
- Storage I/O
- Network traffic
1. Check Playback Status from Jellyfin Dashboard
While a video is playing, open:
:::code Jellyfin Dashboard → Active Devices :::The active playback session will indicate whether Jellyfin is using Direct Play, Direct Stream, or Transcoding.
:::code Direct Play = Media is sent directly to the client. Direct Stream / Remux = Jellyfin modifies the container or audio stream. Transcoding = FFmpeg converts the media during playback. :::Direct Play normally requires the least server processing. When transcoding is required, hardware acceleration can significantly reduce CPU load.
2. Monitor CPU and RAM from Proxmox
Proxmox provides basic resource monitoring for the Jellyfin LXC.
:::code Proxmox → Jellyfin LXC → Summary :::Monitor:
:::code CPU Usage Memory Usage Network Traffic Disk I/O :::This is useful for quickly identifying high CPU or memory usage during playback.
3. Monitor CPU and RAM Inside the Jellyfin LXC
Install htop inside the Jellyfin container.
Run:
:::code htop :::During Direct Play, Jellyfin normally requires relatively little CPU processing. During software transcoding, FFmpeg can consume multiple CPU cores.
4. Monitor Active FFmpeg Transcoding
Jellyfin uses FFmpeg whenever media needs to be converted during playback.
Inside the Jellyfin LXC, check for active FFmpeg processes:
:::code pgrep -af '^/usr/lib/jellyfin-ffmpeg/ffmpeg' :::For a continuously updated view:
:::code watch -n 1 "pgrep -af '^/usr/lib/jellyfin-ffmpeg/ffmpeg'" :::If no video transcoding is running, the command may return no output.
During transcoding, you should see a process similar to:
:::code /usr/lib/jellyfin-ffmpeg/ffmpeg -analyzeduration ... :::You can also monitor its CPU and memory usage:
:::code ps -eo pid,pcpu,pmem,args | grep '^ *[0-9].*/usr/lib/jellyfin-ffmpeg/ffmpeg' :::5. Monitor Intel GPU Usage
If Jellyfin uses Intel Quick Sync or VA-API hardware acceleration, intel_gpu_top is one of the easiest ways to confirm that the GPU is actually being used.
Install the tool on the Proxmox host:
:::code apt update apt install -y intel-gpu-tools :::Run:
:::code intel_gpu_top :::For Jellyfin transcoding, pay attention to these engines:
:::code Render/3D Video VideoEnhance :::The Video engine is especially useful when checking hardware video decoding or encoding.
For example:
:::code Original → 720p → 4 Mbps :::Then check intel_gpu_top on the Proxmox host.
A hardware transcoding session may look similar to:
:::code ENGINES BUSY Render/3D 61.63% Video 78.26% VideoEnhance 0.00% PID NAME 1415 ffmpeg :::This is strong evidence that Jellyfin FFmpeg is using the Intel GPU for hardware-accelerated processing.
If FFmpeg appears under intel_gpu_top and the Video engine shows significant activity, hardware transcoding is active.
6. Detect Possible Software Transcoding
A common sign of software transcoding is very high FFmpeg CPU usage while Intel GPU video utilization remains at or near zero.
For example:
:::code FFmpeg CPU = 200%+ Intel GPU Video = 0% :::This may indicate that video transcoding is being performed by the CPU instead of the Intel GPU.
Check the active FFmpeg command:
:::code pgrep -af '^/usr/lib/jellyfin-ffmpeg/ffmpeg' :::Intel Quick Sync hardware transcoding commonly includes QSV-related options, while VA-API acceleration includes VA-API-related options.
:::code qsv vaapi /dev/dri/renderD128 :::7. Verify Intel GPU Access Inside the LXC
Check that the Intel render device exists:
:::code ls -l /dev/dri/renderD128 :::A working setup may look similar to:
:::code crw-rw---- 1 root render 226, 128 /dev/dri/renderD128 :::Verify that the Jellyfin user belongs to the required groups:
:::code groups jellyfin :::Expected:
:::code jellyfin : jellyfin video render :::Test the Intel VA-API driver:
:::code /usr/lib/jellyfin-ffmpeg/vainfo --display drm --device /dev/dri/renderD128 :::A working Intel setup should detect the Intel driver and display supported codec profiles.
8. Monitor Disk I/O
If playback buffers even though CPU and GPU usage look normal, check storage performance.
Install sysstat on the Proxmox host:
Monitor physical disks:
:::code iostat -xz 1 :::Useful values include:
:::code r/s = Read operations per second w/s = Write operations per second rMB/s = Read throughput wMB/s = Write throughput %util = Device utilization :::This is especially useful when Jellyfin media is stored on USB HDDs or a mergerfs storage pool.
9. Monitor Disk Activity by Process
Install iotop:
Run:
:::code iotop -oPa :::This shows which processes are actively reading or writing storage.
10. Monitor Network Traffic
Streaming performance can also be limited by network bandwidth.
Install iftop:
Run:
:::code iftop :::You can also check interface statistics without installing additional tools:
:::code ip -s link :::11. Monitor Jellyfin Logs
For service-related issues, monitor the Jellyfin service log:
:::code journalctl -u jellyfin -f :::Check the service status:
:::code systemctl status jellyfin :::For playback or transcoding problems, Jellyfin FFmpeg logs are particularly useful because they show the actual transcoding command and hardware acceleration parameters.
From the Jellyfin web interface, open:
:::code Dashboard → Logs :::Recommended Monitoring Setup
For a quick Jellyfin performance test, use three terminals while playing a video.
Terminal 1 - Proxmox Host
:::code intel_gpu_top :::Terminal 2 - Jellyfin LXC
:::code htop :::Terminal 3 - Jellyfin LXC
:::code watch -n 1 "pgrep -af '^/usr/lib/jellyfin-ffmpeg/ffmpeg'" :::At the same time, keep the Jellyfin Dashboard open in your browser to check the playback mode.
How to Read the Results
:::code Direct Play CPU = Low GPU Video = Low / 0% FFmpeg = Usually no video transcoding Status = Ideal Hardware Transcoding CPU = Low to moderate GPU Video = Active FFmpeg = Active Status = Good Software Transcoding CPU = High GPU Video = 0% or very low FFmpeg = Active Status = Check hardware acceleration Playback Buffering CPU/GPU = May be normal Disk = Check I/O Network = Check bandwidth Status = Find the actual bottleneck :::Quick Monitoring Commands
:::code # Proxmox Host - Intel GPU intel_gpu_top # Proxmox Host - Disk I/O iostat -xz 1 # Proxmox Host - Process Disk Activity iotop -oPa # Jellyfin LXC - CPU and RAM htop # Jellyfin LXC - Active FFmpeg pgrep -af '^/usr/lib/jellyfin-ffmpeg/ffmpeg' # Jellyfin LXC - Jellyfin Logs journalctl -u jellyfin -f # Jellyfin LXC - GPU Device ls -l /dev/dri/renderD128 # Jellyfin LXC - GPU Permissions groups jellyfin # Jellyfin LXC - Intel VA-API Test /usr/lib/jellyfin-ffmpeg/vainfo --display drm --device /dev/dri/renderD128 :::Conclusion
Monitoring Jellyfin performance does not require a complex monitoring platform. The Jellyfin Dashboard, htop, intel_gpu_top, FFmpeg process monitoring, and basic disk and network tools are enough to identify most playback bottlenecks.
For Intel hardware transcoding, the easiest confirmation is to start a transcoding session and monitor intel_gpu_top. If the Jellyfin FFmpeg process appears and the Intel Video engine shows activity, the GPU is actively participating in the transcoding workload.
For normal operation, aim for Direct Play whenever possible and use Intel hardware acceleration when transcoding is required.
:::toc enable
Post a Comment for "How to Monitor Jellyfin Performance on Proxmox LXC"
Post a Comment