Le nombre d'écritures sur un SSD est limité, car une cellule mémoire peut être réécrite seulement un certain nombre de fois. De plus, la garantie du constructeur s'applique souvent en-deça d'un certain seuil d'écritures (et/ou en deça d'un nombre d'années d'utilisation présumée). Je voulais savoir comment surveiller ça sur un SSD de marque Samsung.
La première étape est de chercher le seuil prévu par la garantie, car il donne une bonne idée du nombre d'écritures que le constructeur accepte de prendre en charge, c'est-à-dire le nombre d'écritures qui lui semblent relever d'une utilisation conforme de son produit à ses estimations de durée de vie. Ce seuil se nomme « TeraByte Written » (TBW). Pour un Samsung 850 Pro 512 Mo, la garantie couvre jusqu'à 300 teraoctets écris.
Comment récupérer ce TBW sur un SSD en fonctionnement ?
Mon premier réflexe est de chercher les outils proposés par le constructeur. Il en existe un : Samsung Magician. Malheureusement, la seule version GNU/Linux proposée ne prend pas en charge mon modèle, un 850 Pro.
Mon deuxième réflexion est d'effectuer une recherche sur le web. Le résultat le plus satisfaisant est How can I monitor the TBW on my Samsung SSD?. Je recopie ici le script présenté :
#!/bin/bash
#######################################
# Variables #
#######################################
SSD_DEVICE="/dev/sda"
ON_TIME_TAG="Power_On_Hours"
WEAR_COUNT_TAG="Wear_Leveling_Count"
LBAS_WRITTEN_TAG="Total_LBAs_Written"
LBA_SIZE=512 # Value in bytes
BYTES_PER_MB=1048576
BYTES_PER_GB=1073741824
BYTES_PER_TB=1099511627776
#######################################
# Get total data written... #
#######################################
# Get SMART attributes
SMART_INFO=$(sudo /usr/sbin/smartctl -A "$SSD_DEVICE")
# Extract required attributes
ON_TIME=$(echo "$SMART_INFO" | grep "$ON_TIME_TAG" | awk '{print $10}')
WEAR_COUNT=$(echo "$SMART_INFO" | grep "$WEAR_COUNT_TAG" | awk '{print $4}' | sed 's/^0*//')
LBAS_WRITTEN=$(echo "$SMART_INFO" | grep "$LBAS_WRITTEN_TAG" | awk '{print $10}')
# Convert LBAs -> bytes
BYTES_WRITTEN=$(echo "$LBAS_WRITTEN * $LBA_SIZE" | bc)
MB_WRITTEN=$(echo "scale=3; $BYTES_WRITTEN / $BYTES_PER_MB" | bc)
GB_WRITTEN=$(echo "scale=3; $BYTES_WRITTEN / $BYTES_PER_GB" | bc)
TB_WRITTEN=$(echo "scale=3; $BYTES_WRITTEN / $BYTES_PER_TB" | bc)
# Output results...
echo "------------------------------"
echo " SSD Status: $SSD_DEVICE"
echo "------------------------------"
echo " On time: $(echo $ON_TIME | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta') hr"
echo "------------------------------"
echo " Data written:"
echo " MB: $(echo $MB_WRITTEN | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
echo " GB: $(echo $GB_WRITTEN | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
echo " TB: $(echo $TB_WRITTEN | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
echo "------------------------------"
echo " Mean write rate:"
echo " MB/hr: $(echo "scale=3; $MB_WRITTEN / $ON_TIME" | bc | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
echo "------------------------------"
echo " Drive health: ${WEAR_COUNT} %"
echo "------------------------------"
Utilisation concrète :
$ ./monit_ecritures_ssd.sh /dev/sda
------------------------------
SSD Status: /dev/sda
------------------------------
On time: 5,699 hr
------------------------------
Data written:
MB: 2,746,510.173
GB: 2,682.138
TB: 2.619
------------------------------
Mean write rate:
MB/hr: 481.928
------------------------------
Drive health: 99 %
------------------------------
Si j'effectue un dd
de 1 Go à partir de /dev/zero, je constate que ce script calcule bien qu'un gigaoctet supplémentaire a été écrit.
Néanmoins, je perçois plusieurs limites à ce script :