Taming My Noisy Homelab

How I traced HDD clicking and fan spikes back to software — using iotop, sensors, Docker inspection, and CPU affinity tuning to make everything quieter and cooler.

Homelab Diagnostics

Taming a Noisy Homelab

How I traced HDD clicking and fan spikes back to software — using iotop, sensors, Docker inspection, and CPU affinity tuning.

-20°C
Board Temp Drop
-13°C
CPU Temp Drop
Silent
HDD Noise After Fix

Two Devices, Two Noise Sources

What seemed like hardware failure turned out to be workload behavior in both cases.

UGREEN NASync DXP2800
Storage Noise
UGREEN NAS

HDD Clicking & Chatter

  • Mechanical clicking from HDD-backed Docker storage
  • Gitea + Gitea Runner generating frequent small writes
  • Repeated runner retries creating constant I/O churn
  • Random writes on HDD are unexpectedly loud
  • Stopping containers silenced the disks entirely
Lenovo ThinkCentre M70q
Thermal Noise
Lenovo M70q Gen 5 · i5-14600T

Proxmox Fan Ramping

  • Fan spinning up aggressively every few seconds
  • Heavy background VMs spread across all cores
  • Board temp at 76°C, CPU package at 69°C
  • Pinning background VMs to specific CPU lanes reduced heat
  • Workload placement in SFF hosts matters enormously

Before vs After

Measurable improvements from software-only changes — on both devices.

UGREEN NAS — Storage Noise
Before
Constant
HDD Clicking & Chatter
24/7
Gitea + Runner I/O Churn
Disks never resting
After
Silent
HDD Noise After Fix
Idle
Containers Stopped
Silent disks
Proxmox · Lenovo M70q — Thermal Noise
Before
76°C
Board / ACPI Temp
69°C
CPU Package Temp
Fan ramping every few seconds
After
56°C
Board / ACPI Temp
56°C
CPU Package Temp
Calm fan · Steady temps

Root Cause Troubleshooting

Two parallel investigation paths that converged on the same lesson.

NAS — Storage Path
Hear clicking noise from NAS
Inspect disk I/O with iotop
Inspect Docker mounts via docker inspect
Inspect runner logs — retries/errors found
Stop Gitea + Gitea Runner containers
Clicking stops immediately
Root cause confirmed ✓
Proxmox — Thermal Path
Notice aggressive fan ramping
Check temps with sensors
Inspect load with htop
Identify heavy KVM process PIDs
Pin background VMs with taskset
Temps drop ~20°C
Fan behavior normalizes ✓

Workload Placement Models

Practical models to separate priority workloads from background noise, and chatty I/O from mechanical disks.

NAS Storage Placement Model
High-IOPS PoolNVMe SSD
1TB NVMe
1TB NVMe
Docker AppData
Gitea Runners
Bulk Data PoolSATA HDD Array
16TB HDD
16TB HDD
Media Library
Backups
Moving chatty databases and runner caches to SSDs prevents random reads/writes from keeping the mechanical HDDs awake.
Proxmox CPU Affinity Model
Priority LaneCPUs 0-11
0
1
2
3
4
5
6
7
8
9
10
11
Web VM
Database
Background LaneCPUs 12-19
12
13
14
15
16
17
18
19
K8s VMs
OpenRAG VM
Background workloads pinned to E-cores reduced thermal pressure on performance-critical lanes

Key Commands Used

A handful of targeted commands that revealed the root causes.

UGREEN NAS
terminal · nas
# === PHASE 1: DIAGNOSIS === # Watch cumulative disk I/O to find the chattiest processes $ sudo iotop -oPa # Query which files the suspicious process (e.g. PID 441) holds open $ sudo lsof -p 441 # We isolated the noise to Gitea. Let's trace where its data lives physically. $ docker inspect gitea | grep -A 20 "Mounts"
# === PHASE 2: RESOLUTION === # Temporarily stop the noisy containers $ docker stop gitea gitea-runner # Edit the application configuration to dial back the aggressive logging $ sudo nano /volume1/@docker/volumes/.../conf/app.ini # Restart the containers with the quieted configuration $ docker start gitea gitea-runner
Proxmox · i5-14600T
terminal · proxmox
# === PHASE 1: DIAGNOSIS === # Check raw hardware thermal sensors to verify CPU package temps $ sensors # Find the exact process ID (PID) of the heavy background Virtual Machine $ ps aux | grep "/usr/bin/kvm -id 310"
# === PHASE 2: RESOLUTION === # Immediately (but temporarily) test the fix by pinning the live VM $ taskset -cp 12-19 <PID> # Make the CPU affinity permanent for that specific VM $ qm set 310 --affinity 12-19 # Pin high-priority Database container (LXC) to performance cores $ pct set 800 --cpuset 0-11

The Fixes & Next Steps

Turning diagnosis into actionable improvements for a quieter lab.

NAS Fix Strategy

1. Immediate

Stop Gitea Runner manually when not actively running CI pipelines.

2. Tuning

Reduce noise in app.ini by setting LEVEL=warn and disabling router/SQL logs.

3. Ideal

Move chatty Docker app data off mechanical drives and onto SSD/NVMe.

Engineering Follow-Through
  • NAS Implement "quiet-hours" using cron routines to gracefully spin down the dev stack at night.
  • Proxmox Enforce CPU placement persistently at boot using documented systemd service overrides.
Hardware noise is often a software symptom.
  • Developer tools on HDD-backed storage can be surprisingly loud
  • Compact hosts react strongly to unfocused background load
  • Observability + smart placement = dramatically quieter homelab

The final lesson: Storage tiering, workload isolation, and diligent observability matter just as much in a small homelab as they do in enterprise environments. Treating your home infrastructure like a production system prevents "spooky behavior" and transforms your living room space back into the quiet environment it was meant to be.

Linux
Docker
Proxmox
iotop
sensors
taskset
htop
UGREEN DXP2800
NASync Series Storage Node
Lenovo M70q Gen 5
ThinkCentre Tiny Proxmox Host