Test Immich with one repeatable operation, correlate its latency with resource waits, and confirm the suspected bottleneck through a controlled intervention.
A dashboard snapshot cannot distinguish useful activity from harmful contention. Measure one endpoint—such as upload acceptance, thumbnail display, or smart-search response—under fixed media and client conditions, then change only the suspected limiting resource.
Define One Endpoint and a Reproducible Baseline
Start by naming the endpoint in observable terms. “Immich is slow” is not testable, but “the same twenty timeline thumbnails take four seconds to appear after a restart” is. Fix the client, network path, account, photo set, and start condition so later runs differ in only one intended variable.
The Immich data-path model shows that upload, processing, database selection, and media delivery traverse different dependencies. A test aimed at search selection should time the result list separately from image rendering; otherwise a fast query followed by slow file reads is reported as one undifferentiated delay.
Run the baseline at least three times and preserve both median and slowest useful percentile. Record queue depth, CPU per container, memory pressure, swap activity, network throughput and retransmissions, disk latency, and I/O queue depth. A bottleneck claim must align its resource signal with the endpoint delay.
Separate CPU Saturation From Memory Pressure
A CPU-bound run keeps runnable work waiting for processor time, so endpoint latency should track sustained core saturation or throttling. A memory-bound run may instead show reclaim, swap, container kills, or repeated model loading. Both can make CPU charts look busy, but their interventions produce different responses.
A recent independent Immich resource guide breaks usage across the server, PostgreSQL, Redis, and machine-learning components rather than treating total RAM as one requirement. That service-level view matters because free host memory can coexist with an undersized container limit, while a large file cache is not automatically distress.
Verify CPU pressure by lowering background worker concurrency or assigning more CPU while holding memory constant. Verify memory pressure by removing swap activity or raising a constrained memory limit without changing worker count. If the endpoint does not improve consistently, reject that resource as the primary boundary for this test.
Distinguish Network Delay From Storage Delay
Network and storage limits often appear together because remote media crosses both. A saturated link limits transferred bytes per second, while storage contention raises read or write completion time even on a quiet link. Testing from only a remote client can therefore misattribute slow file delivery to the wrong layer.
Kingston’s SSD analysis emphasizes background work, firmware behavior, caching, and host commands that affect storage response beyond headline sequential speed. For Immich, many small thumbnail and database operations make latency and queue behavior more informative than a single large-file bandwidth result.
Repeat the endpoint from a wired local client, then from the normal remote path, without changing the server dataset. Separately read a representative file set on the host and watch device latency. Improvement only on the local client implicates the network path; persistent host-side waits implicate storage or its mount.
Use an Intervention Matrix to Accept or Reject Each Cause
Write four rows before testing: CPU, memory, network, and storage. Give each row one expected symptom, one targeted intervention, and one rejection condition. This prevents the diagnosis from changing after results appear and makes a negative finding useful rather than a reason to buy several upgrades at once.
A public Immich field report with delayed thumbnails despite substantial internet bandwidth demonstrates why specifications alone are insufficient. The relevant evidence is whether a targeted change moves the measured endpoint while the media cohort, cache condition, jobs, client, and application version remain fixed.
Accept CPU only if processor relief improves latency; memory only if reclaim relief does; network only if path relief does; and storage only if lower device or mount wait does. If two interventions help, repeat them in both orders because the second bottleneck may become visible only after the first is removed.
Tech & AI HUB
More to Read

What Is Immich State, and Which Parts Must Persist?
Immich state includes originals, database relationships, identity, configuration, and derivatives; persist each according to whether it is reconstructable.

How Does Immich Handle Authentication Across Local and Remote Sessions?
Immich uses server-side identity with client sessions, while proxy headers, origins, and OIDC redirects can make local and remote behavior differ.

What Causes Immich Search or Query Results to Slow as Data Grows?
Immich growth can enlarge indexes, evict hot pages, complicate filters, and delay media delivery; separate these stages before tuning.

