如何监控三星 SSD 上的 TBW?

You*_*Git 20 ssd disk monitoring

众所周知,SSD 在 NAND 单元死亡之前的 PE(程序擦除)周期数是有限的。

因此,了解已将多少数据写入您的 SSD 非常有帮助,以确定在 NAND 死亡之前它还能持续多长时间。

我有一个三星 850 Pro 512GB SSD,我运行的是 Ubuntu 14.04。

如何获取驱动器的 TBW(写入的总字节数)?

You*_*Git 23

完全披露:此答案中的 scipt/命令不是我自己的,而是 JDG Leaver 的工作。它们来自他网站上的一篇博客文章


注意:

  • 这只会报告三星 SSD 的准确数字
  • 你需要smartctl安装

方法一:

这是一个方便的小脚本,可让您监控 SSD 的 TBW 以及其他一些信息:

#!/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 "------------------------------"
Run Code Online (Sandbox Code Playgroud)

这是输出的示例:

------------------------------
 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 %
------------------------------
Run Code Online (Sandbox Code Playgroud)

这个数据是准确的,因为我刚刚安装了我的新 850 Pro。


方法二:

或者,这里有一个单线只能获得 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')"
Run Code Online (Sandbox Code Playgroud)


Dan*_*iel 8

如何查找信息

我们可以用它smartctl来求TBW的值。

  1. 安装smartctl$ sudo apt install smartmontools

  2. 获取设备的扇区大小和在本例中写入的LBA$ sudo smartctl -Ai /dev/sda/dev/sda

  3. 一些数学:[sector size] * [LBA written] / 1024^3 = X GiB到目前为止写的

设备 /dev/sda 的示例

$ sudo smartctl -Ai /dev/sda | grep -E 'Sector Size|Total_LBAs_Written'
Sector Size:      512 bytes logical/physical
241 Total_LBAs_Written      0x0032   099   099   000    Old_age   Always       -       1214641768

$ calc 1214641768*512/1024^3
    579.186328887939453125
Run Code Online (Sandbox Code Playgroud)

在这种情况下,扇区大小为 512 字节,这是常见的,写入的总 LBA 为 1214641768。到目前为止,写入的结果为 579 GiB。这是有道理的,因为该驱动器相对较新。

命令可以与其他东西calc一起安装或使用。$ sudo apt install calc

更多信息

该命令$ sudo smartctl -A /dev/sda提供有关“供应商特定 SMART 属性”的信息,这意味着您的驱动器显示的内容可能与此不同。在示例中,我使用了具有所需信息的三星 SSD。


金士顿固态硬盘

根据 @JuliSmz 在他们的评论中所说的以及这个 PDF,我怀疑Total_LBAs_Written(至少一些)金士顿 SSD 返回的数据已经是 GB 了。

在 PDF 最后一页上查找 id 241。它说:

说明:表示在驱动器的使用寿命内主机系统写入驱动器的字节数(以 1 GB 分辨率)。

基本原理:此属性返回字节计数,以 GB 为单位,更新分辨率为 1 GB。计数表示写入的字节数。Attribute读取0直到写入的字节数达到1GB;在增加 GB 时,属性将增加到值1(十进制)。

注意:早于 520ABBF0 的客户端固件和早于 510ABBF0 的企业固件在将 64GB 数据写入驱动器之前不会更新分辨率。


小智 5

Crucial SSD 剩余使用寿命

对于 Crucial SSD(由 Micron 制造),剩余寿命的问题变得更容易一些。

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

本文档将 202 标识为剩余寿命百分比。例如,Ubuntu 16.04 ( sudo smartctl /dev/sda1 -a) 将 202 报告为未知,但 90 的值(在我的情况下)与 pdf 中的描述相匹配,并表示剩余寿命为 90%。这可以通过关键.com 文献中关于您拥有的驱动器的 TBW 进行适当缩放。实际上,剩余寿命更有用。


Яро*_*лин 5

接受的答案有臃肿的输出,太多无用的脚本向导,并且隐藏了初始参数名称smartctl。这是一个更好的版本;

#!/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@
Run Code Online (Sandbox Code Playgroud)

示例输出:

$ 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)
Run Code Online (Sandbox Code Playgroud)

和单线

$ sudo /usr/sbin/smartctl -A /dev/sda | 
     awk '$0~/LBAs/{ printf "TBW %.1f\n", $10 * 512 / 1024^4 }'
TBW 17.1
Run Code Online (Sandbox Code Playgroud)