Immich performance is usually capped by the slowest active dependency on a specific workflow, not by one permanent hardware specification.
Uploads, smart search, timeline browsing, and video playback traverse different combinations of client, network, server, database, workers, and storage. The real ceiling moves when the endpoint or background overlap changes, so a useful capacity answer begins with a path rather than a component list.
A Performance Ceiling Belongs to an Endpoint
A performance ceiling is the maximum useful rate or minimum achievable latency for one operation under stated conditions. It is not the highest CPU percentage. Upload acceptance, search selection, visible thumbnails, and playable video have different completion points and therefore different dependency chains.
The ZimaSpace Immich data-path article separates upload acceptance, processing readiness, search selection, and media delivery. That distinction explains why improving a machine-learning worker can accelerate indexing without changing thumbnail delivery, and why faster network access cannot repair a slow database query.
For every complaint or benchmark, write the start event, end event, client, media cohort, cache state, and background workload. Only then draw the required stages. The ceiling is set by the stage whose service time or queue prevents the endpoint from improving when upstream work arrives faster.
Database and Queue State Often Limit Coordination
The database selects assets and preserves application relationships, while queue state coordinates background work. Their delays can cap search, imports, or readiness even when compute workers have spare cycles. Conversely, a deep queue can indicate incoming work exceeds worker throughput rather than the queue service itself being slow.
An architectural deep dive describes PostgreSQL holding users, assets, albums, and vector embeddings while Redis manages asynchronous job queues. The source is an independent deployment explanation, and its value here is the dependency separation rather than any fixed resource number.
Observe database response time, connection waits, queue depth, and completed jobs per minute together. If queue depth rises while worker throughput is flat and database timing remains stable, workers are the likely limit. If every stage pauses around database waits, adding worker concurrency can make the ceiling worse.
Storage, Memory, and Compute Exchange the Bottleneck
Memory can keep database pages, thumbnails, and models close to processors. When the working set no longer fits, storage latency enters requests that were previously memory-speed. During new imports, compute-heavy thumbnail, video, and machine-learning work can dominate instead. The limiting dependency changes with state and workload.
An Immich self-hosting analysis separates modest application and database needs from larger machine-learning memory demand and notes the effect of model loading. Specific numbers vary by release and model, but the dependency lesson is stable: aggregate RAM does not reveal which service loses its working set.
Compare cold, warm, and sustained phases. A large cold-to-warm gain points to model or cache loading; high device latency under broad queries points to working-set misses; saturated compute with stable I/O points to processing. After changing one limit, rerun the full path because the next stage may now dominate.
Build an Endpoint-to-Dependency Map
Create rows for upload acceptance, search result response, last visible timeline thumbnail, and video start. Add columns for client preparation, network transfer, application handling, database or queue work, worker processing, storage access, and client decode. Mark stages not used rather than assigning every component to every endpoint.
A community report about offloading thumbnail generation for a two-terabyte family library illustrates the practical need to distinguish processing capacity from NAS storage capacity. It does not prove that offloading is always required; it identifies a specific worker path that can dominate a large import.
Measure one representative run and rank only observed waits. Propose one intervention for the leading stage and one rejection condition. If the endpoint improves, update the map because the ceiling moved; if it does not, discard that hypothesis. This produces an evidence chain instead of a shopping list.
Tech & AI HUB
More to Read

Why Does Immich Reprocess Existing Data After an Upgrade?
Immich may reprocess assets when an upgrade invalidates earlier derivatives, metadata, models, or job state; repeated endless work is a separate fault.

Immich Networking: How Discovery, DNS, and Routing Produce Reachability
Immich is reachable only when endpoint selection, DNS, routing, NAT or proxy handling, TLS, and application response form one valid path.

Immich for Families: How Identity and Permissions Shape the Experience
Immich family use depends on separate identities, asset ownership, intentional sharing, limited administration, and tested revocation.

