Quick answer
What this guide helps you do
Jellyfin 12, 12.1 or 12.2 using too much CPU or RAM, scanning forever or transcoding unexpectedly? Check version, scan state, logs, hardware acceleration, migrations and rollback safely.
Jellyfin beginner path
New to Jellyfin? Follow this order.
These guides form the SmallGrid Jellyfin path: install it, fix folder access, solve empty libraries, reduce unnecessary transcoding, then choose the right mini PC.
Quick answer
If Jellyfin 12 suddenly uses much more CPU or memory after an upgrade, first determine what the server is actually doing before changing settings or restarting it repeatedly.
Start with this order:
check Jellyfin version
→ check whether a library scan or migration is active
→ record CPU and memory use
→ inspect Jellyfin logs
→ verify hardware acceleration is still enabled
→ identify whether playback is transcoding
→ separate a long first scan from a scan that is stuck or looping
→ inspect migration errors before restarting again
→ preserve the backup before attempting rollback
Jellyfin 12.1 was released on 15 September 2026 with 47 server fixes, and Jellyfin 12.2, a minor bug-fix release, followed on 5 October 2026. If you are still on 12.0, take a fresh backup and review the 12.1 release notes before troubleshooting a problem that may already have been fixed in the point release.
Do not assume every Jellyfin 12 server has a memory leak or broken migration. There are confirmed issue reports affecting particular libraries and databases, but they are not evidence of a universal defect.
If your problem is broader than performance or scanning, use Jellyfin 12 Upgrade Problems: What to Check After Updating instead.
1. Check whether you are on Jellyfin 12.0 or 12.1
Open:
Dashboard → General
For Docker:
docker exec jellyfin jellyfin --version
docker inspect jellyfin --format '{{.Config.Image}}'
docker inspect jellyfin --format '{{.Image}}'
For native Ubuntu:
jellyfin --version
apt-cache policy jellyfin jellyfin-server jellyfin-web jellyfin-ffmpeg
Interpret the result:
| Version | What to do |
|---|---|
| 10.10.7 / 10.11.x | Use the Jellyfin 12 preparation guide before upgrading |
| 12.0 | Back up and review the 12.1 fixes before deeper troubleshooting |
| 12.1 | Continue with the checks below |
| 12.2 | Continue with the checks below, and see the Jellyfin 12.2 update guide |
Do not combine the 12.0 → 12.1 update with an Ubuntu release upgrade, Docker Engine update, storage move or GPU-driver redesign.
2. Record CPU and memory use before changing anything
For Docker:
docker stats jellyfin
For native Ubuntu:
ps -C jellyfin -o pid,pcpu,pmem,rss,vsz,etime,cmd
free -h
Record:
Jellyfin version:
CPU %:
Memory / RSS:
Uptime:
Library scan active: yes/no
Playback active: yes/no
Transcoding active: yes/no
The trend matters more than one number.
Healthy upgrade work often looks like:
resource use rises
→ scan progresses
→ activity eventually falls
A more suspicious pattern is:
resource use rises continuously
→ scan progress barely changes
→ logs repeat the same operation
→ memory never settles
3. Check whether a library scan is actually running
Jellyfin 12 requires a full library scan after the major upgrade from 10.11.
Open the dashboard and check scheduled-task/activity state.
For Docker, follow logs:
docker logs -f jellyfin
For Ubuntu:
sudo journalctl -u jellyfin -f
If the log is progressing through different files, libraries or tasks, the server may simply be busy.
If the same path, migration or item repeats continuously, capture that exact pattern before restarting.
A long scan is not automatically a failed scan.
4. Distinguish a normal first scan from a runaway scan
The first scan after Jellyfin 12 is intentionally heavier than an ordinary scheduled scan.
Normal signs include:
- sustained disk reads
- elevated CPU for a while
- metadata activity
- changing item paths in logs
- scan percentage or task state progressing
- memory eventually stabilising
Warning signs include:
- the same item or migration repeated indefinitely
- memory rising continuously until swap or OOM pressure appears
- one CPU core pinned for hours while the same migration line remains unchanged
- the server repeatedly restarting at the same migration step
- library scans repeatedly splitting or reprocessing the same merged versions
Do not repeatedly restart simply because resource use is high. A restart can make it harder to tell whether work was genuinely progressing.
5. Jellyfin 12.1 includes scan and memory-related fixes
Jellyfin 12.1 contains 47 server fixes across library, metadata, performance and playback areas.
That makes version checking part of troubleshooting.
If a server is on 12.0:
- take a fresh backup
- record the current logs and resource behaviour
- read the official 12.1 release notes
- update Jellyfin only
- compare scan progress, CPU and memory after the point update
Do not present 12.1 as a guaranteed cure for every high-memory or long-scan report. It contains relevant fixes, but open issues remain for some configurations.
Jellyfin 12.2 (5 October 2026) is a further minor bug-fix release. Its official notes list database, library-scanning and migration performance fixes. Do not assume it fixes your particular problem: read the release notes and follow the Jellyfin 12.2 update guide before and after updating.
6. Check whether hardware acceleration was disabled or reset
Unexpectedly high CPU during playback can be caused by software transcoding rather than the library scan itself.
Open:
Dashboard → Playback → Transcoding
Confirm the expected hardware acceleration method is still enabled.
For Intel systems this may be QSV or VA-API. NVIDIA systems may use NVENC. AMD systems commonly use VA-API where supported.
For Docker, also confirm the GPU device is still mapped:
docker inspect jellyfin --format '{{json .HostConfig.Devices}}'
docker exec jellyfin ls -la /dev/dri 2>/dev/null
For native Ubuntu:
ls -la /dev/dri 2>/dev/null
getent group render video
Jellyfin 12 ships with Jellyfin FFmpeg 8.1, so also record:
/usr/lib/jellyfin-ffmpeg/ffmpeg -version | head
or in Docker:
docker exec jellyfin /usr/lib/jellyfin-ffmpeg/ffmpeg -version | head
Use Jellyfin Hardware Transcoding on Ubuntu for the full hardware path.
7. Check whether playback is actually transcoding
A high-CPU server may be doing exactly what the client requested.
Open the active session in the Jellyfin dashboard and record:
Playback method:
Video codec:
Audio codec:
Subtitle format:
Transcoding reason:
Client:
Local or remote:
Then compare:
- the same file with subtitles off
- a known Direct Play file
- another maintained client
- the same client on the local network
Use How to Check Why Jellyfin Is Transcoding before changing codecs, FFmpeg or GPU drivers.
8. Inspect encoding and transcoding settings after migration
Some Jellyfin 12 upgrade reports describe encoding configuration not loading cleanly and transcoding settings returning to defaults.
That does not prove your server has the same issue.
Check the active configuration in the Jellyfin dashboard first.
Then inspect logs for encoding-related warnings:
Docker
docker logs jellyfin 2>&1 | grep -Ei 'encoding|ffmpeg|transcod|hardware|vaapi|qsv|nvenc'
Ubuntu
sudo journalctl -u jellyfin -b --no-pager | \
grep -Ei 'encoding|ffmpeg|transcod|hardware|vaapi|qsv|nvenc'
If hardware acceleration is disabled after the upgrade, restore the intended supported setting through the UI and test one known transcode.
Do not copy an old encoding.xml over a running 12.x instance without understanding whether its schema is still compatible.
9. Migration fails or appears stuck
There are confirmed Jellyfin 12 issue reports involving migration failures from conditions such as:
- SQLite constraint errors
- malformed database data
- duplicate item data
- migration stages that appear not to complete
A current open Jellyfin 12.1 report documents the 20260113203012_ChangeOwnerIdToGuid migration remaining in startup for hours while one CPU core stayed near 100%. In that report the database integrity check passed, but the migration generated extraordinary logical SQLite reads and restarted from the same stage after a clean container restart. That is useful evidence of a specific failure pattern, not proof that every large Jellyfin database will behave this way.
The useful response is evidence collection, not blind database editing.
Capture the logs around the first failure.
Docker
docker logs jellyfin 2>&1 | \
grep -Ei 'migration|sqlite|constraint|malformed|duplicate|fatal|error'
Ubuntu
sudo journalctl -u jellyfin -b --no-pager | \
grep -Ei 'migration|sqlite|constraint|malformed|duplicate|fatal|error'
If the service restarts automatically and retries the same migration, stop the restart loop before collecting more evidence.
For systemd:
sudo systemctl stop jellyfin
For Docker Compose:
docker compose stop jellyfin
Do not delete rows from the Jellyfin database because a forum post mentions a similar constraint error. Different migration failures can have different causes.
10. Check database integrity before assuming the migration code is broken
If logs explicitly report a malformed SQLite database, preserve the data directory and backup before doing anything else.
Do not run destructive repair operations against the only copy.
Record:
exact SQLite error:
migration name:
Jellyfin source version:
Jellyfin target version:
database backup date:
A pre-existing database problem can surface during a migration because the upgrade touches rows that normal day-to-day use never reached.
If you have a tested pre-upgrade backup, keep it untouched while investigating.
11. Merged or alternate versions keep changing
Jellyfin 12 changed alternate-version handling, and there have been confirmed reports around manually merged versions being split again during scans in particular configurations.
If your problem is specifically merged versions:
- let the initial required Jellyfin 12 scan finish
- record one affected movie and its files
- record whether versions span one or multiple libraries
- check the Jellyfin version
- reproduce with one controlled scan
- preserve logs before manually merging everything again
Avoid repeatedly re-merging a large library until you know whether the next scan will undo it again.
This is a narrower problem than general media visibility. If files themselves are missing, use Jellyfin Library Not Showing Files.
12. New files do not appear after the upgrade
If the old library is present but new files are not detected, compare one working and one failing item.
Native Ubuntu:
stat -c '%A %U:%G %n' \
"/mnt/media/tv/Working Show" \
"/mnt/media/tv/New Show"
sudo -u jellyfin find "/mnt/media/tv/New Show" -maxdepth 3 -type f | head
Docker:
docker exec jellyfin find "/media/tv/New Show" -maxdepth 3 -type f | head
If Jellyfin cannot read the new path, the fault may be permissions or file creation rather than the 12.x scan engine.
Use Jellyfin Not Scanning New Files for the detailed workflow.
13. When to stop instead of restarting again
Stop and preserve the state when:
- the same migration fails every startup
- the same database error repeats
- memory rises until the system begins swapping heavily or killing processes
- one migration stays unchanged for hours with no evidence of progress
- the same media items are processed in a clear loop
- the server cannot remain up long enough to collect useful logs
At that point, another restart is not diagnosis.
Collect:
Jellyfin version
installation method
source version before upgrade
migration name/error
30–60 minutes of relevant logs
CPU/memory measurements
library size
filesystem/database location
plugin list
GPU and transcoding method
Then decide whether to update, repair, restore or report the issue.
14. When to restore the backup
Rollback is appropriate when you have evidence that the upgraded instance cannot be repaired safely within your maintenance window.
The rollback unit is:
previous Jellyfin version
+
matching pre-upgrade data/configuration
Do not start an older Jellyfin build against a database already migrated by Jellyfin 12.
Before restoring:
- stop Jellyfin
- preserve the failed 12.x logs
- confirm the backup predates the migration
- confirm the previous application version
- verify the backup is complete
- restore into the matching old application version
Follow How to Back Up and Restore Jellyfin Before an Upgrade rather than attempting a partial rollback.
Practical decision tree
High CPU or RAM after Jellyfin 12
↓
Check version
↓
12.0? → back up → review/update to 12.1
↓
Is a migration active?
├─ yes → follow logs → progressing or repeating?
└─ no
↓
Is a library scan active?
├─ yes → measure progress and resource trend
└─ no
↓
Is playback active?
├─ yes → check Direct Play vs transcode + hardware acceleration
└─ no
↓
Logs show repeated migration / SQLite / duplicate-item error?
├─ yes → stop restart loop, preserve evidence, protect backup
└─ no → investigate library task, plugins, filesystem and client behaviour
Official and primary sources
- Jellyfin Server 12.2 release
- Jellyfin Server 12.1 release
- Jellyfin issue #18066: ChangeOwnerIdToGuid migration can remain stuck with one CPU core at 100%
- Jellyfin 12.0 release notes
- Jellyfin backup and restore documentation
Individual GitHub issue reports are useful evidence of specific failures, but they should not be treated as proof that every Jellyfin 12 or 12.1 installation has the same defect.
Related SmallGrid guides
- Jellyfin 12.2 Update Guide: Fix Scanning, Crashes and Docker Problems
- Jellyfin 12 Upgrade Problems: What to Check After Updating
- Jellyfin 12 Upgrade Guide: 10 Things to Check Before You Update
- Jellyfin Hardware Transcoding on Ubuntu
- How to Check Why Jellyfin Is Transcoding
- Jellyfin Not Scanning New Files
- Jellyfin Library Not Showing Files
- How to Back Up and Restore Jellyfin Before an Upgrade
- Jellyfin Troubleshooting Hub
Recap
High CPU, high memory and long scans after Jellyfin 12 can come from several very different things:
- expected first-scan work
- database migration work
- a migration that is failing or looping
- a scan that is repeatedly reprocessing items
- hardware acceleration being disabled or reset
- software transcoding
- a configuration-specific Jellyfin 12.x bug
The safest approach is to identify which layer is active before changing anything.
Check the version first, because the 12.1 and 12.2 point releases include dozens of fixes. Then measure resource use, follow scan or migration progress, verify hardware acceleration, inspect the exact logs and preserve the pre-upgrade backup until the server has proved stable.
Jellyfin guide cluster
More Jellyfin fixes and setup guides
These guides link the main Jellyfin setup, permissions, remote access, direct play, and hardware topics together.
Jellyfin 12 Upgrade Guide: 10 Things to Check Before You Update
Prepare Jellyfin 10.10 or 10.11 for version 12: verify backups, plugins, Docker or Ubuntu packages, migrations, permissions, playback and rollback.
How to Reduce Jellyfin Server Power Use on Ubuntu
Reduce Jellyfin server electricity use on Ubuntu by measuring idle and playback power, avoiding unnecessary transcoding, checking background load, storage, CPU behaviour and reboot health.
Give Jellyfin Access to Media Folders on Ubuntu
Fix Jellyfin permission denied errors on Ubuntu. Test the service user, find blocked parent folders, apply safe ACLs, verify inheritance, and check mounted-drive options.
Jellyfin Library Not Showing Files? 8 Checks That Fix It
Fix a Jellyfin library that is empty or missing media. Check mounts, Linux permissions, Docker paths, library folders, naming, scans and logs in the correct order.
Jellyfin Docker Permissions: Fix Media Folder Access and UID/GID Errors
Fix Jellyfin Docker permission denied errors. Check bind mounts, container paths, UID and GID values, read-only media access, active mounts, and file visibility step by step.
Jellyfin Direct Play vs Transcoding: What Is the Difference?
Why is Jellyfin transcoding instead of Direct Playing? Compare Direct Play, Direct Stream and transcoding, CPU usage, quality and common triggers.