2024. április 30., kedd

Gyorskeresés

TrueNAS Scale HDD spindown beállítása

Írta: |

[ ÚJ BEJEGYZÉS ]

TrueNAS Scale rendszeren lehetőség van arra, hogy leállítsuk (spin down) azt a HDD-t, amelyet megadott ideig nem olvasunk és írunk. A TrueNAS Scale ZFS fájlrendszert használ az adatok tárolására. A linuxban már megszokott block eszközök, mint például egy egész meghajtó vagy partíció alkotják ZFS esetében a valamilyen funkciót ellátó virtuális eszközöket (vdev). Ezek különféle típusú csoportokba (storage vdev esetén például stripe, mirror, raidz*) szerveződnek, amelyek így alkotják a ZFS poolt.

Otthoni NAS-om a következő diskeket tartalmazza:
1x SanDisk SSD PLUS 240GB
1x KINGSTON SA400S37240G
2x WDC WD40EFZX-68AWUN0 4TB

A két SSD-n csak 32GB van kiosztva "boot-pool"-nak, a fennmaradó tárterületen további "ssd-data" pool foglal helyet. A két HDD kizárólag egy "data" poolnak van odaadva. Minden esetben mirrored data vdev típus van beállítva.

A TrueNAS OS a jelenlegi legfrissebb TrueNAS-SCALE-23.10.2 (Cobia).

A TrueNAS Scale potenciálisan nagyon sokoldalúan testreszabható eszköz rengeteg szolgáltatással, ami miatt a HDD leállításához különböző beállításokra is szükség lehet, de most csak azokra szorítkozom, amelyek az én használati esetemből következnek. Az itthoni NAS leginkább a nappali órákban használatos, éjszakára le lehet kapcsolni a tétlen HDD-t. Ehhez az szükséges, hogy semmilyen szolgáltatás, alkalmazás, vagy processz ne érje el a HDD-t, ami újra bekapcsolná.

A szolgáltatások közül (System Settings > Services) jelenleg az NFS van bekapcsolva, de a tétlen órákban nincs csatolva és olvasva róla. A S.M.A.R.T. service alapértelmezés szerint bekapcsolt állapotban van. A System Settings > Services > S.M.A.R.T. > Configure segítségével beállítható, hogy a S.M.A.R.T. ne ellenőrízze a meghajtót ha Standby módban van: a Power Mode-ot állítsuk Never helyett Standby-ra.

Az alkalmazásaimmal (Apps menüpont) ugyanaz a helyzet, mint az NFS-el, a tétlen órákban nincsenek használva. Azok az alkalmazások, amelyeknek futniuk kell 7x24 (például AdGuard) olyan virtuális gépen futnak konténerizálva, amelyek diskjei az "ssd-data" poolban vannak.

A TrueNAS Kubernetest használ az alkalmazások kezelésére. Mielőtt bármilyen alkalmazást tudnánk telepíteni ki kell választani azt a poolt, ahova a Kubernetes és az alkalmazások deploymentjei kerülni fognak. Ez eredetileg nekem a "data" pool volt, szükségessé vált tehát, hogy elmozgassuk a "data" poolból az "ssd-data" poolba. Ennek megoldásához a Truenas egy nagyon egyszerű megoldást kínál, ha van elég helyünk másik poolban, akkor egy gombnyomásra áthelyezhető az Apps > Settings > Choose Pool menüpontban. Az alkalmazások leskálázása után itt kiválasztottam a "data" pool helyett az "ssd-data" poolt és pár perc alatt átmozgatta a közel 20G méretű apps service-t.

Ezáltal lehetővé vált, hogy a Kubernetes dolgozhasson az "ssd-data" poolban, függetlenül a HDD-től. Az alkalmazások hostPath-jai viszont továbbra is a "data" pool pathjaira mutatnak. Ahhoz, hogy az alkalmazások ne érjék el a hostPath-on keresztül a HDD-t, le kell scalelni őket a tétlen időszak elején, majd vissza fel, amikor újra szükséges. Ehhez kell két szkript, amelyek szükség szerint le és fel tudják scalelni az ix alkalmazásokat, míg a Kubernetes deploymenteket érintetlenül hagyják. A futó replikák száma loggolódik és indításkor annyi indul el, amennyi előzőleg futott.

Az alkalmazások leállításához:

#!/bin/bash

#################################################################################################
# #
# ix-scale-down.sh #
# #
# Decreases the scale of all ix deployments to zero and logs the replica counts to the logfile. #
# #
#################################################################################################

NAMESPACE_PREFIX="^ix-"
MY_LOG_FILE="/var/log/daily_scalings.log"

for mynamespace in $(k3s kubectl get namespaces | egrep $NAMESPACE_PREFIX | awk '{print $1}'); do
for mydeployment in $(k3s kubectl get deployment -n $mynamespace --no-headers | awk '{print $1}'); do
MY_AVAILABLE_REPLICAS=$(k3s kubectl -n $mynamespace get deployment $mydeployment --no-headers | awk '{print $4}')
echo "$(date +'%Y-%m-%d %H:%M:%S') Scaledown ${mynamespace}/${mydeployment} ${MY_AVAILABLE_REPLICAS} -> 0" >> $MY_LOG_FILE
k3s kubectl -n $mynamespace scale --replicas=0 deploy $mydeployment
done
done

Az alkalmazások elindításához:

#!/bin/bash

##################################################################################################
# #
# ix-scale-up.sh #
# #
# Enables scaling up of all ix deployments according to replica counts specified in the logfile. #
# #
##################################################################################################

NAMESPACE_PREFIX="^ix-"
MY_LOG_FILE="/var/log/daily_scalings.log"

for mynamespace in $(k3s kubectl get namespaces | egrep $NAMESPACE_PREFIX | awk '{print $1}'); do
for mydeployment in $(k3s kubectl get deployment -n $mynamespace --no-headers | awk '{print $1}'); do
grep -v "Scaleup" $MY_LOG_FILE | tac | while IFS= read -r daily_scalings_line; do
if [[ $(echo ${daily_scalings_line} | awk '{print $4}') == "${mynamespace}/${mydeployment}" ]];
then
MY_DESIRED_REPLICAS=$(echo ${daily_scalings_line} | awk '{print $5}')
echo "$(date +'%Y-%m-%d %H:%M:%S') Scaleup ${mynamespace}/${mydeployment} 0 -> ${MY_DESIRED_REPLICAS} " >> $MY_LOG_FILE
k3s kubectl -n $mynamespace scale --replicas=$MY_DESIRED_REPLICAS deploy $mydeployment
break
fi
done
done
done

A szkriptek telepítéséhez másoljuk be a megfelelő pathba és ellátjuk őket futtatható flaggel:

vi /usr/local/bin/ix-scale-down.sh
vi /usr/local/bin/ix-scale-up.sh

chmod +x /usr/local/bin/ix-scale-down.sh
chmod +x /usr/local/bin/ix-scale-up.sh

A TrueNAS alapvető információkat tárol a system datasetben, ahonnan olvas és ahova ír adatokat. Ez aktív használatban van a rendszer futása alatt. Alapértelmezés szerint a system dataset a "data" poolba került. A helyének a megváltoztatásához a System settings > Advanced > Storage > Configure menüpontban van lehetőség. A rendszer figyelmeztet, hogy a Samba service eközben újra fog indulni.

A tulajdonképpeni spin down-t mindkét lemez esetén külön-külön kell beállítani a Storage > data > Disk Health > Manage Disks alatt. Itt a disket kiválasztva és az edit gombra kattintva két beállítást kell elvégezni. A HDD Standby alatt kiválasztható, hogy mennyi percben megadott idő elteltével lépjen a HDD standby módba. Az Advanced Power Management alatt pedig kiválasztható a "Level 1 - Minimum power usage with Standby (spindown)" profil.

Kiegészítésképpen monitorozhatjuk a TrueNAS alert rendszerével és S.M.A.R.T. adatokkal, hogy a tétlen időszakban valóban csak egyszer történt meg a HDD-k leállítása.
Ehhez szükség van python alert source létrehozására, amely akkor triggerelődik, ha egy fájl egy bizonyos pathon megjelenik. Scrub task éjszaka szokott futni így lehetséges, hogy másnap reggel false alarmot kapunk, ha a scrub felébresztette a HDD-t.

from middlewared.alert.base import AlertClass, AlertCategory, AlertLevel, FilePresenceAlertSource

class LoadCycleCountDailyAlertClass(AlertClass):
category = AlertCategory.STORAGE
level = AlertLevel.WARNING
title = "Load Cycle Count Daily"
text = f"Load Cycle Count Daily reached threshold"


class LoadCycleCountDailyAlertSource(FilePresenceAlertSource):
path = "/tmp/load-cycle-count-diff"
klass = LoadCycleCountDailyAlertClass

Illetve arra a szkriptre, amely szükség szerint létrehozza a fájlt. Itt is az előzőekhez hasonlóan egy logfájlból hasonlít össze S.M.A.R.T. adatokat jelenlegivel:

#!/bin/bash

#########################################################
# #
# load-cycle-count.sh #
# #
# Compare Load_Cycle_Count and trigger alert on demand #
# #
#########################################################

MY_LOG_FILE="/var/log/load-cycle-count-daily.log"
MY_ZFS_POOL_NAME="data"
MY_ERROR_FILE="/tmp/load-cycle-count-diff"

if [ -e "${MY_LOG_FILE}" ]; then
blkid -t LABEL=${MY_ZFS_POOL_NAME} | while IFS= read -r mydisk; do
MY_BLOCK_DEVICE=$(echo ${mydisk} | sed 's/[0-9].*//')
MY_BLOCK_DEVICE_LOAD_CYCLE_COUNT=$(smartctl -a ${MY_BLOCK_DEVICE} | grep "Load_Cycle_Count" | awk '{print $NF}')

MY_BLOCK_DEVICE_UUID_SUB=$(echo ${mydisk} | awk '{print $4}' | awk -F "=" '{print $2}')
MY_READ_COUNT=$(grep ${MY_BLOCK_DEVICE_UUID_SUB} $MY_LOG_FILE | tac | head -1 | awk '{print $NF}')

if [ "${MY_BLOCK_DEVICE_LOAD_CYCLE_COUNT}" -ne "$((${MY_READ_COUNT} + 1))" ]; then
touch ${MY_ERROR_FILE}
fi

echo "$(date +'%Y-%m-%d %H:%M:%S') ${mydisk} Load_Cycle_Count ${MY_BLOCK_DEVICE_LOAD_CYCLE_COUNT}" >> $MY_LOG_FILE
done
else
blkid -t LABEL=${MY_ZFS_POOL_NAME} | while IFS= read -r mydisk; do
MY_BLOCK_DEVICE=$(echo ${mydisk} | sed 's/[0-9].*//')
MY_BLOCK_DEVICE_LOAD_CYCLE_COUNT=$(smartctl -a ${MY_BLOCK_DEVICE} | grep "Load_Cycle_Count" | awk '{print $NF}')
echo "$(date +'%Y-%m-%d %H:%M:%S') ${mydisk} Load_Cycle_Count ${MY_BLOCK_DEVICE_LOAD_CYCLE_COUNT}" >> $MY_LOG_FILE
done
fi

A szkriptek telepítéséhez másoljuk be a megfelelő pathba és ellátjuk a bash szkriptet futtatható flaggel:

vi /usr/lib/python3/dist-packages/middlewared/alert/source/load_cycle_count_daily.py
vi /usr/local/bin/load_cycle_count.sh

chmod +x /usr/local/bin/load_cycle_count_daily.sh

Ahhoz, hogy a python kiegészítés működjön újra kell indítani a middlewared. Ezt a TrueNAS újraindításával is megtehetjük. A teszteléshez, a riasztás megjelenítéséhez CLI-ben hozzunk létre egy üres fájlt, majd ha az alarm megjelent, törölhetjük:

touch /tmp/load-cycle-count-diff

rm /tmp/load-cycle-count-diff

A scriptek időzítése crontabbal történik, amelyhez bejegyzés hozzáadható a System Settings > Advanced > Cron Jobs > Add segítségével.

Ezzel kész is vagyunk. Minden este éjfélkor az alkalmazások deploymentjei 0-ra skálázódnak, majd fél óra elteltével leállnak a HDD-k. Reggel hatkor pedig az alkalmazások felskálázódnak és 15 perc elteltével a harmadik szkript megvizsgálja a load cycle countokat és ha nem pontosan 1-el nőtt, akkor az alarmot triggerel.

Hozzászólások

(#1) Peter Kiss


Peter Kiss
senior tag
LOGOUT blog

[ Szerkesztve ]

További hozzászólások megtekintése...
Copyright © 2000-2024 PROHARDVER Informatikai Kft.