Why Does Immich Cause Repeated Disk Activity Overnight?

Eva Wong is the Technical Writer and resident tinkerer at ZimaSpace. A lifelong geek with a passion for homelabs and open-source software, she specializes in translating complex technical concepts into accessible, hands-on guides. Eva believes that self-hosting should be fun, not intimidating. Through her tutorials, she empowers the community to demystify hardware setups, from building their first NAS to mastering Docker containers.

Immich can generate repeated disk activity overnight because scheduled maintenance, database work, queued media jobs, or retries continue after people stop using the library.

A quiet household does not mean an idle server. The useful question is whether the same process and job explain the reads or writes at the same clock time. Correlate the activity first, then decide whether it is expected work, backlog catch-up, or a loop that should stop.

Match the Disk Spike to the Clock Before Changing Anything

Begin with three nights of timestamps rather than one noisy observation. Record when block I/O rises, which device is busy, whether reads or writes dominate, and whether the pattern starts at nearly the same time. A repeatable start time points toward a scheduler; an irregular pattern points more strongly toward arrivals, retries, or another container.

Immich deployments can schedule database backups and integrity-oriented work during low-use hours, so an early-morning spike may be deliberate. Do not disable a job only because it wakes the disks. First check whether a corresponding backup, maintenance result, or queue completion appears after the activity window.

The adjacent ZimaSpace diagnosis of Immich idle-hour background work uses the same timestamp rule: connect the visible symptom to the process and job before treating “idle” as a failure state.

Separate PostgreSQL Writes From Media Reads

Immich application state changes can keep PostgreSQL active even when no new photo is being opened. Database checkpoints, write-ahead logging, vacuum-related work, and ordinary application updates have a different I/O signature from scanning thousands of media files. Identify the path or device receiving the traffic before blaming the photo library.

The PostgreSQL observability discussion in pg_stat_io analysis explains why reads, writes, backend activity, checkpointer behavior, and background writes need to be separated. Use that distinction to ask whether the database device is busy because useful transactions are being persisted or because something is repeatedly churning.

If database writes are small and periodic while media disks remain asleep, the behavior may be normal database housekeeping. If the same database file receives sustained heavy writes while no job advances, preserve logs and inspect the responsible queries or restart loop rather than moving the entire library to faster storage.

Check Whether Background Queues Are Actually Advancing

Open the job view and compare pending, active, failed, and completed work before and after the overnight window. Thumbnail generation, video processing, metadata extraction, machine-learning tasks, or imported-library work can legitimately keep storage active after a large change. A falling backlog is evidence of useful catch-up.

A current community report of sustained unexplained reads shows the opposite diagnostic boundary: very high continuous reads with no expected work deserve investigation rather than being normalized as “what Immich does.” Treat the reported rate as a case, not a benchmark.

If the same few jobs fail and re-enter the queue, disk activity can repeat without producing progress. Capture the first error and one affected asset, then isolate that job type. Do not clear every queue or regenerate the whole library before establishing whether the loop is caused by one file, permissions, storage latency, or a service dependency.

-15% OFF
Single board computer zimaboard2

Attribute I/O to a Process Instead of Guessing From Drive Noise

Use host-level I/O monitoring during the next recurrence to identify the process that is reading or writing the device. Then map that process to the Immich server, PostgreSQL, machine learning, a backup tool, antivirus, filesystem scrub, or an unrelated container. Drive LEDs and fan noise cannot provide that ownership information.

A practical iotop workflow demonstrates the process-first method. Record several samples because a short burst can disappear between observations; the goal is to catch the process during the same window as the symptom.

If Immich is not the top I/O owner, stop changing Immich settings and follow the actual process. If PostgreSQL, Immich, or a related worker is responsible, correlate its logs and job progress with the I/O sample. That turns “the server is noisy every night” into a specific component and trigger.

Define the Boundary Between Normal Overnight Work and a Fault

Accept the activity as normal when it begins around a known schedule or recent library change, completes useful work, leaves no growing failure count, and returns storage latency and queue depth to baseline. Record the normal duration so a future increase has a comparison point.

A historical Immich discussion about frequent database writes illustrates why some database activity can exist without a visible user action. Because versions and deployments change, use the case only to justify measuring the database separately, not to declare every persistent write normal.

Escalate when I/O continues after queues stop, the same errors recur, storage latency affects daytime use, free space falls unexpectedly, or the pattern grows night after night. Preserve timestamps, process I/O, job counts, relevant logs, filesystem free space, and one repeatable trigger before making invasive changes.

Support & Tips

More to Read

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.