¿Cómo puedo monitorear el TBW en mi SSD Samsung?

13

Como es de conocimiento común, los SSD tienen un número limitado de ciclos de PE (Program-Erase) antes de que las células NAND mueran.

Por lo tanto, es muy útil saber cuántos datos se han escrito en su SSD, para determinar cuánto tiempo más durará antes de que muera el NAND.

Tengo un SSD Samsung 850 Pro de 512 GB y estoy ejecutando Ubuntu 14.04.

¿Cómo puedo obtener el TBW (Total-Bytes-Written) para mi disco?

You'reAGitForNotUsingGit
fuente

Respuestas:

16

DIVULGACIÓN COMPLETA: Los scipt / comandos presentes en esta respuesta no son míos, sino más bien el trabajo de JDG Leaver. Se obtuvieron de una publicación de blog en su sitio web .


NÓTESE BIEN:

  • Esto solo informará números precisos para los SSD de Samsung
  • Necesitas haber smartctlinstalado

Método 1:

Aquí hay un pequeño script útil que le permitirá monitorear el TBW de su SSD, junto con alguna otra información:

#!/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 "------------------------------"

Aquí está una muestra de la salida:

------------------------------
 SSD Status:   /dev/sda
------------------------------
 On time:      2 hr
------------------------------
 Data written:
           MB: 25,098.917
           GB: 24.510
           TB: .023
------------------------------
 Mean write rate:
        MB/hr: 12,549.458
------------------------------
 Drive health: 100 %
------------------------------

Estos datos son precisos, ya que acabo de instalar mi nuevo 850 Pro.


Método 2:

Alternativamente, aquí hay una línea para obtener solo el TBW:

echo "GB Written: $(echo "scale=3; $(sudo /usr/sbin/smartctl -A /dev/sda | grep "Total_LBAs_Written" | awk '{print $10}') * 512 / 1073741824" | bc | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta')"
You'reAGitForNotUsingGit
fuente
Esto no funciona para mi SSD SAMSUNG MZ7LN512HMJP-000L7. smartctl informa Total_LBAs_Writtenque es 2268 y esto produce 1.1 MB escritos, claramente incorrectos para una unidad que tiene más de un año y es mi unidad principal del sistema :(
Icydog
@Icydog :( ¿qué versión de Ubuntu estás ejecutando?
You'reAGitForNotUsingGit
Estoy en Fedora 27. Creo que mi SSD probablemente no informa los números correctamente.
Icydog
Mi investigación muestra que cada SSD parece tener su propio multiplicador de lo que realmente significa cada unidad de "LBAs escrito". No tengo los números para el Samsung 850, pero es absolutamente no sólo un sector ...
ljwobker
3

SSD crucial de por vida restante

Para Crucial SSD (hecho por Micron), la cuestión de la vida útil restante se hace un poco más fácil.

https://www.micron.com/~/media/documents/products/technical-note/solid-state-storage/tnfd22_client_ssd_smart_attributes.pdf

Este documento identifica 202 como porcentaje restante de por vida. Como ejemplo en Ubuntu 16.04 ( sudo smartctl /dev/sda1 -a), informa 202 como desconocido, pero el valor de 90 (en mi caso) coincide con la descripción en el pdf e indica que queda 90% de vida. El TBW puede escalarlo adecuadamente en la literatura de crucial.com en el disco que tiene. En realidad, la vida restante es bastante más útil.

Steve C
fuente
1

La respuesta aceptada tiene una salida hinchada, demasiada inutilización de scripts y oculta los nombres de los parámetros iniciales smartctl. Aquí hay una versión mejor;

#!/bin/bash

device=${1:-/dev/sda}
sudo smartctl -A $device |awk '
$0 ~ /Power_On_Hours/ { poh=$10; printf "%s / %d hours / %d days / %.2f years\n",  $2, $10, $10 / 24, $10 / 24 / 365.25 }
$0 ~ /Total_LBAs_Written/ {
    lbas=$10;
    bytes=$10 * 512;
    mb= bytes / 1024^2;
    gb= bytes / 1024^3;
    tb= bytes / 1024^4;
    printf "%s / %s  / %d mb / %.1f gb / %.3f tb\n", $2, $10, mb, gb, tb
    printf "mean writes per hour:  / %.2f",  mb/poh
}
$0 ~ /Airflow_Temperature_Cel/ { print $2 " / " $10}
$0 ~ /Wear_Leveling_Count/ { printf "%s / %d (%% health)\n", $2, int($4) }
' |
    sed -e 's:/:@:' |
    sed -e "s\$^\$$device @ \$" |
    column -ts@

salida de muestra:

$ for i in /dev/sd{a,b,c,d}; do ssd-tbw $i;done   |sort -k2,2
/dev/sda    Airflow_Temperature_Cel    49
/dev/sdb    Airflow_Temperature_Cel    49
/dev/sdc    Airflow_Temperature_Cel    45
/dev/sdd    Airflow_Temperature_Cel    47
/dev/sda    mean writes per hour:      655.80
/dev/sdb    mean writes per hour:      646.97
/dev/sdc    mean writes per hour:      874.49
/dev/sdd    mean writes per hour:      733.95
/dev/sda    Power_On_Hours             27292 hours / 1137 days / 3.11 years
/dev/sdb    Power_On_Hours             27300 hours / 1137 days / 3.11 years
/dev/sdc    Power_On_Hours             14432 hours / 601 days / 1.65 years
/dev/sdd    Power_On_Hours             23255 hours / 968 days / 2.65 years
/dev/sda    Total_LBAs_Written         36655329806  / 17898110 mb / 17478.6 gb / 17.069 tb
/dev/sdb    Total_LBAs_Written         36172538301  / 17662372 mb / 17248.4 gb / 16.844 tb
/dev/sdc    Total_LBAs_Written         25846999325  / 12620605 mb / 12324.8 gb / 12.036 tb
/dev/sdd    Total_LBAs_Written         34955224738  / 17067980 mb / 16668.0 gb / 16.277 tb
/dev/sda    Wear_Leveling_Count        93 (% health)
/dev/sdb    Wear_Leveling_Count        93 (% health)
/dev/sdc    Wear_Leveling_Count        95 (% health)
/dev/sdd    Wear_Leveling_Count        94 (% health)

y el one-liner

$ sudo /usr/sbin/smartctl -A /dev/sda | 
     awk '$0~/LBAs/{ printf "TBW %.1f\n", $10 * 512 / 1024^4 }'
TBW 17.1
Ярослав Рахматуллин
fuente