Objectif modeste : que les disques d’un NAS s’endorment après 30 min d’inactivité, pour le bruit et la conso. Le spindown est configuré proprement (hdparm -S, smartd avec -n standby). Et pourtant, les disques restent obstinément éveillés. L’enquête est plus subtile qu’il n’y paraît.
Règle n°1 : tout réarme le timer
Le timer de standby ATA se remet à zéro à la moindre commande vers le disque — pas seulement une écriture, une lecture aussi. Et sur ce NAS, root, swap et data vivent sur les mêmes disques physiques :
sda2 → md/root sda3 → md/swap sda4 → md/data
Conséquence : une écriture de métadonnées sur le fs root réveille aussi la partition « data ». Il suffit d’un processus qui touche root plus souvent que le délai de spindown pour tout maintenir éveillé.
Le premier coupable : une sonde qui écrit
Une mesure de 60 s montre le fs root qui reçoit ~24 Ko/min, alors que find ne voit… presque aucun fichier changé. Le vrai writer :
$ find / -xdev -mmin -3 -type f
/var/lib/nas-temp-monitor/state ← état d'une sonde température
/var/lib/systemd/timers/stamp-nas-temp-monitor.timer
Un moniteur de température écrivait son état sur disque toutes les 5 min. Correction propre : état en RAM (/dev/shm) via un drop-in systemd, et Persistent=false sur le timer pour supprimer l’écriture du stamp. Écritures de la sonde : éliminées.
Différer ce qui reste
Il restait un goutte-à-goutte de métadonnées. On peut le repousser :
$ sysctl vm.laptop_mode=5
$ sysctl vm.dirty_expire_centisecs=210000 # page-cache différé
$ mount -o remount,commit=3600 / # journal ext4 différé
⚠️ vm.dirty_expire ne concerne que le page-cache ; le journal jbd2 a son propre intervalle (commit=, 5 s par défaut). Il faut agir sur les deux. Résultat : 40 minutes sans la moindre écriture. Et pourtant…
Le paradoxe : la sonde qui empêche de dormir
…toujours pas de standby. Le compteur d’écritures est figé à zéro pendant 40 min, mais le disque reste éveillé. Ce ne sont donc plus les écritures — ce sont les lectures, invisibles dans ce compteur.
Le moniteur de température lit les disques via smartctl toutes les 5 min. Et une lecture SMART réarme le timer. L’option -n standby ne skippe qu’un disque déjà endormi — d’où un magnifique problème de l’œuf et de la poule :
Le disque ne peut pas s’endormir parce qu’on le lit sans cesse pour vérifier sa température. Mais on ne le lit que parce qu’il est réveillé.
Espacer la sonde au-delà du délai de spindown casse la boucle (le disque atteint 30 min, s’endort, et la sonde le skippe ensuite). Mais une écriture OS sporadique (~toutes les 20-40 min, un fsync d’un démon) suffit encore à réarmer par intermittence.
La vraie leçon
Sur un système où l’OS tourne 24/7 sur les mêmes disques que les données, le sommeil total est souvent inatteignable proprement — et vouloir le forcer en raccourcissant le délai est contre-productif : le disque s’endort puis se fait réveiller quelques minutes plus tard par une écriture, encore et encore. Ces cycles Start/Stop répétés, eux, usent vraiment. À l’inverse, un disque qui tourne en continu accumule 0 cycle = aucune usure mécanique.
Le gain réel n’était pas le spindown parfait : c’était de supprimer les écritures inutiles (l’état de la sonde en RAM), sans compromettre les données, et d’assumer la rotation continue.
Lessons learned
- Le timer de standby se réarme sur toute I/O, lecture comprise — pas seulement les écritures.
- root/swap/data sur les mêmes disques : une écriture système empêche la « data » de dormir.
- Une sonde de température qui lit les disques empêche leur spindown.
-n standbyprotège un disque endormi, mais ne l’aide pas à s’endormir. Espacez la sonde au-delà du délai de veille. vm.dirty_expire≠commit=: le page-cache et le journal jbd2 ont chacun leur intervalle ; il faut différer les deux.- Un disque qui tourne en continu ne s’use pas (0 cycle Start/Stop). Le vrai risque, c’est le cyclage à répétition. Parfois, le bon réglage est de ne pas endormir du tout.