SSD/HDDの状態を確認しよう

この記事はWanoグループ [Advent Calendar 2020](https://qiita.com/advent-calendar/2020/wano-group)の8日目の記事になります。

## 前置き

EDOCOEでは物理サーバを使っているサービスがあります。今どきだと「えっ？」っていう人もいるかもしれませんね。まぁ、色々事情があるのです。
今回の話はクラウドの場合は関係ない話なので、大半の人には興味がないかもしれません。
でも、自分の使っているPCとか自宅サーバとかやってる人は、物理のSSD/HDDを積んでるはずなので、若干は関係あるかもしれません。

## 物理サーバーだから気にしないといけないSSD/HDDの状態

クラウドであれば、SSD/HDDが壊れそうとか、壊れた、とか別に気にしなくても構いませんが、物理サーバだと、気にする必要があります。
物理サーバーでも、ケチっても、RAID1にしておいて、ホットスワップ対応(電源いれたまま、デバイスの交換が可能)のサーバであれば、問題が出ることは少ないです。
まぁ、サーバ自体も冗長構成だし、別に一台死んでも、すぐにユーザー影響が出るわけでもないですね。

...というわけでもないです。

## RAID1でも問題が出るケース

でも、そうでもないのですね。厄介なのは、

**微妙に壊れている**

という状態です。

RAID1で、片方のディスクが**ちゃんと壊れて**いれば、RIADの状態が異常になります。
そうすれば、片方のディスクだけで、動きます。冗長性が欠いた状態ですが、サービス影響は特に無いです。
なんですが、片方(両方でも)のディスクに、壊れるほどでもないエラーが発生して、I/Oが非常に遅くなっている場合、RAID1は継続したままですが、サービスの応答が悪くなる可能性があります。
(まぁ、あんまりおそければ、ロードバンサーが外してくれるでしょうが)

そんなわけで、SSD/HDDの状態を把握したいわけなんですね。

## RAIDの状態を把握する

### MegaRaidの場合

使っているRAIDコントローラーでMegaRaidが使えるなら、

```
$ sudo MegaCli -LDInfo -Lall -aALL | grep State
State               : Optimal
```

で、チェックできます。

```
State               : Degraded
```

となっていれば、RAIDが壊れてます。

### LinuxのSoftware RAIDの場合

LinuxのSoftware RAIDであれば、/proc/mdstat を見ると、

```
$ cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sdb1[1] sda1[0]
      2000266240 blocks super 1.2 [2/2] [UU]
      bitmap: 8/15 pages [32KB], 65536KB chunk
```

`[UU]` の部分が、`[_U]` とか`[U_]` とかになっていると、壊れています。

## ディスクの状態を把握する

smartctl というコマンドを使いますが、RAIDの場合、物理デバイスがパットわかりませんので、調べます。

### MegaRaidの場合

storcli というコマンドがあると思いうので、下記のコマンドを実行します。

```
$ storcli64 /c0 /eall /sall show
```

出力結果が長いので、欲しい部分だけ抜き出します。

```
----------------------------------------------------------------------------
EID:Slt DID State DG       Size Intf Med SED PI SeSz Model               Sp
----------------------------------------------------------------------------
252:0     8 Onln   0 223.062 GB SATA SSD N   N  512B INTEL SSDSC2BB240G4 U
252:1     9 Onln   0 223.062 GB SATA SSD N   N  512B INTEL SSDSC2BB240G4 U
----------------------------------------------------------------------------
```

ここのDIDというものを、下の、Nのところに入れます。/dev/sdX の部分はdfで出てくる情報を使って下さい。

```
$ sudo smartctl -a -d sat+megaraid,N /dev/sdX  # SATA用
$ sudo smartctl -a -d megaraid,N /dev/sdX # SAS用
```

### Software RAIDの場合

mdadm コマンドでRAIDの詳細を見ることができます。

```
$ sudo mdadm -D /dev/md0
```

必要な部分を抜き出すと

```
    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
```

下記のようにすればよいです。

```
$ sudo smartctl -a /dev/sda
$ sudo smartctl -a /dev/sdb
```

### smartctlとは？

なんの前置きもなく出してしまいましたが、smartctlは、S.M.A.R.T(Self-Monitoring, Analysis and Reporting Technology)情報を知るためのツールです。
smartctlは、Ubuntuであれば、下記でインストールできます。

```
$ sudo apt install smartmontools  
```

Mac OSでも入れれるようですが、手元にMacがないので試していません。

#### 結果の見方

smartctl の出力結果をそのまま貼ってみます。長いのでスクロールしましょう。

```
smartctl 6.6 2016-05-31 r4324 [x86_64-linux-4.15.0-123-generic] (local build)
Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Device Model:     Micron_1100_MTFDDAK2T0TBN
Serial Number:    17121AD322AD
LU WWN Device Id: 5 00a075 11ad322ad
Firmware Version: M0MU031
User Capacity:    2,048,408,248,320 bytes [2.04 TB]
Sector Size:      512 bytes logical/physical
Rotation Rate:    Solid State Device
Form Factor:      2.5 inches
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   ACS-3 T13/2161-D revision 5
SATA Version is:  SATA 3.2, 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is:    Sun Dec  6 13:47:32 2020 JST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x04) Offline data collection activity
                                        was suspended by an interrupting command from host.
                                        Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever 
                                        been run.
Total time to complete Offline 
data collection:                ( 3045) seconds.
Offline data collection
capabilities:                    (0x7b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine 
recommended polling time:        (   2) minutes.
Extended self-test routine
recommended polling time:        (  21) minutes.
Conveyance self-test routine
recommended polling time:        (   3) minutes.
SCT capabilities:              (0x0035) SCT Status supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x002f   100   100   000    Pre-fail  Always       -       2
  5 Reallocated_Sector_Ct   0x0032   100   100   010    Old_age   Always       -       1
  9 Power_On_Hours          0x0032   100   100   000    Old_age   Always       -       20688
 12 Power_Cycle_Count       0x0032   100   100   000    Old_age   Always       -       22
171 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       1
172 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       0
173 Unknown_Attribute       0x0032   097   097   000    Old_age   Always       -       50
174 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       10
183 Runtime_Bad_Block       0x0032   100   100   000    Old_age   Always       -       0
184 End-to-End_Error        0x0032   100   100   000    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   100   100   000    Old_age   Always       -       0
194 Temperature_Celsius     0x0022   071   056   000    Old_age   Always       -       29 (Min/Max 18/44)
196 Reallocated_Event_Count 0x0032   100   100   000    Old_age   Always       -       1
197 Current_Pending_Sector  0x0032   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0030   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x0032   100   100   000    Old_age   Always       -       0
202 Unknown_SSD_Attribute   0x0030   097   097   001    Old_age   Offline      -       3
206 Unknown_SSD_Attribute   0x000e   100   100   000    Old_age   Always       -       1
246 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       64768904039
247 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       2054572005
248 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       1855496825
180 Unused_Rsvd_Blk_Cnt_Tot 0x0033   000   000   000    Pre-fail  Always       -       9377
210 Unknown_Attribute       0x0032   100   100   000    Old_age   Always       -       4

SMART Error Log Version: 1
No Errors Logged

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Vendor (0xff)       Completed without error       00%     20674         -
# 2  Vendor (0xff)       Completed without error       00%     20295         -
# 3  Vendor (0xff)       Completed without error       00%     19586         -
# 4  Vendor (0xff)       Completed without error       00%     18197         -
# 5  Vendor (0xff)       Completed without error       00%     16799         -
# 6  Vendor (0xff)       Completed without error       00%     15646         -
# 7  Vendor (0xff)       Completed without error       00%     14805         -
# 8  Vendor (0xff)       Completed without error       00%     14438         -
# 9  Vendor (0xff)       Completed without error       00%     13305         -
#10  Vendor (0xff)       Completed without error       00%     12521         -
#11  Vendor (0xff)       Completed without error       00%     11602         -
#12  Vendor (0xff)       Completed without error       00%     10968         -
#13  Vendor (0xff)       Completed without error       00%     10079         -
#14  Vendor (0xff)       Completed without error       00%      9558         -
#15  Vendor (0xff)       Completed without error       00%      8186         -
#16  Vendor (0xff)       Completed without error       00%      7054         -
#17  Vendor (0xff)       Completed without error       00%      6020         -
#18  Vendor (0xff)       Completed without error       00%      5243         -
#19  Vendor (0xff)       Completed without error       00%      4597         -
#20  Vendor (0xff)       Completed without error       00%      4141         -
#21  Vendor (0xff)       Completed without error       00%      3759         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.
```

なっが...いですね。

#### === START OF READ SMART DATA SECTION ===

下記が、出ていれば、基本的にはOKのはずです。

```
SMART overall-health self-assessment test result: PASSED
```

...とも、言えないので、残りも見ます。

#### Vendor Specific SMART Attributes with Thresholds:

というのがあります。これは、書いてある通り、ベンダーが決めた閾値になります。
つまり、ベンダーごとに仕様が違います(がーん)。

Intelだと、下記に仕様があります。
https://www.intel.co.jp/content/www/jp/ja/support/articles/000023512/memory-and-storage/data-center-ssds.html

先程の出力例だと、Micronというメーカーですが、こちらもありますね。
https://www.micron.com/-/media/client/global/documents/products/technical-note/solid-state-storage/tnfd22_client_ssd_smart_attributes.pdf

SamusungとかSeagateとかもあるでしょう(ぐぐってください)。

ベンダーによって違いはあるものの、VALUEが現在値、WORSTが最悪のところ、THRESHが閾値というのは変わらないと思います。

```
VALUE WORST THRESH
```

100が正常値(温度の場合もあるので、その場合は関係ないですが)でTHRESHに近づくほど微妙な感じになります(Old_age は寿命で、Pre-failは壊れかけ)。

IntelのSSDの場合、`Media_Wearout_Indicator` とかが、低い値になってると、もう書き込み耐用限度に達したということなので、だいぶやばいです。SamsungのSSDだと、同様の値は、`Wear_Leveling_Count` になりますね。

MicronのSSDの場合... msecli というコマンドを使うので、まぁ、お使いのSSD/HDDによってはsmartctlだと微妙な場合もありますね。

他にも、Error系の値はチェックしておいたほうが良いかもしれませんね。

なお、英語のWikipediaを見ると、割と詳しく説明されています。
https://en.wikipedia.org/wiki/S.M.A.R.T.

#### SMART Error Log Version: 1

ここにも注目しましょう、

```
No Errors Logged
```

となっているので、特にエラーはないですね。ここにエラーが出ている場合、何かしら問題があるかもしれません。

#### SMART Selective self-test log data structure revision number 1

セルフテストの結果です。何もでていません。

```
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
```

テストしてみましょう。

```
$ sudo smartctl  -t short /dev/sda
```

`short`の部分は、`long` も指定できます。

バックグラウンドで動くので、途中でやめたい時は、下記のようにします。(上のコマンドの結果にも案内がでます)

```
$ sudo smartctl -X /dev/sda
```

結果を見る時は、最初のsmartctlのコマンドを実行すればよいです。
下記のようになります(なんで、3番目にでてるのかは不明)。

```
SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Completed [00% left] (57881389-57946924)
    4        0        0  Not_testing
    5        0        0  Not_testing
```

`Completed [00% left]`となっているので、完了していますね。

これの結果に error とか出ていると、何かしら問題がある可能性がありますね。交換したほうが良いでしょう。
まぁ、その場合は、下記のようになっていることでしょう。

```
SMART overall-health self-assessment test result: FAILING
```

#### msecli の結果

Micronのディスクがどれくらい使われているか分かりませんが、msecli の結果もみてみましょう。

下記のフッター部分からインストーラーをDLできます(217MBもあります)。
https://www.micron.com/products/ssd/storage-executive-software

実行権限を与えて、実行するとインストーラーが動きます。親切なことに日本語も用意されています。

msecliがインストールされたら、結果を見てみます。

```
$ sudo msecli -L
Device Name          : /dev/sda
Model No             : Micron_1100_MTFDDAK2T0TBN
Serial No            : 17121AD322AD        
FW-Rev               : M0MU031             
Total Size           : 2048.00GB
Drive Status         : Drive is in good health
Sata Link Speed      : Gen3 (6.0 Gbps)
Sata Link Max Speed  : Gen3 (6.0 Gbps)
Temp(C)              : 27

Device Name          : /dev/sdb
Model No             : Micron_1100_MTFDDAK2T0TBN
Serial No            : 17121AD322A9        
FW-Rev               : M0MU031             
Total Size           : 2048.00GB
Drive Status         : Drive is in good health
Sata Link Speed      : Gen3 (6.0 Gbps)
Sata Link Max Speed  : Gen3 (6.0 Gbps)
Temp(C)              : 29

Drive information is retrieved successfully
CMD_STATUS   : Success 
STATUS_CODE  : 0 

Copyright (C) 2020 Micron Technology, Inc.
```

`Device is in good health` とあるので、問題なさそうですね。

Micronの場合、msecli からS.M.A.R.Tの値を見れます(より詳しく)。

```
$ sudo msecli -S -n /dev/sda
Device Name  : /dev/sda

 ID  Attribute Name                Attribute Data Units

 1   Raw Read Error Rate           0            Errors/Page

 5   Reallocated NAND Block Count  0            NAND Blocks

 9   Power On Hours Count          20689        Hours

 12  Power Cycle Count             22           Power Cycles

 171 Program Fail Count            0            NAND Page Program Failures

 172 Erase Fail Count              0            NAND Block Erase Failures

 173 Block Wear-Leveling Count     51           Erases

 174 Unexpected Power Loss Count   10           Unexpected Power Loss events

 180 Unused Reserved Block Count   9364         Blocks

 183 SATA Interface Downshift      0            Downshifts

 184 Error Correction Count        0            Correction Events

 187 Reported Uncorrectable Errors 0            ECC Correction Failures

 194 Enclosure Temperature         29           Current Temperature (C)

                                   48           Highest Lifetime Temperature (C)

 196 Reallocation Event Count      0            Events

 197 Current Pending ECC Count     0            ECC Counts

 198 SMART Off-line Scan           0            Errors

     Uncorrectable Errors          

 199 Ultra-DMA CRC Error Count     0            Errors

 202 Percentage Lifetime Remaining 97           % Lifetime Remaining

 206 Write Error Rate              0            Program Fails/MB

 210 RAIN Successful Recovery      0            TUs successfully recovered by

     Page Count                                 RAIN

 246 Cumulative Host Write         68771972581  512 Byte Sectors

     Sector Count                  

 247 Host Program Page Count       2179659814   NAND Page

 248 FTL Program Page Count        1893257411   NAND Page


SMART attributes are retrieved successfully
CMD_STATUS   : Success 
STATUS_CODE  : 0 

Copyright (C) 2020 Micron Technology, Inc.
```

現状、寿命の3%を使っているようですね。

```
202 Percentage Lifetime Remaining 97           % Lifetime Remaining
```

#### Thinkpad T480Sの結果

参考までに、僕の使っているPC、Thinkpad T480Sの結果も載せてみます。

```
$ sudo smartctl -a /dev/nvme0n1
smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-54-generic] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Number:                       SAMSUNG MZVLB512HAJQ-000L7
Serial Number:                      S3TNNB0K476708
Firmware Version:                   5L2QEXA7
PCI Vendor/Subsystem ID:            0x144d
IEEE OUI Identifier:                0x002538
Total NVM Capacity:                 512,110,190,592 [512 GB]
Unallocated NVM Capacity:           0
Controller ID:                      4
Number of Namespaces:               1
Namespace 1 Size/Capacity:          512,110,190,592 [512 GB]
Namespace 1 Utilization:            418,693,611,520 [418 GB]
Namespace 1 Formatted LBA Size:     512
Namespace 1 IEEE EUI-64:            002538 8481bdefc1
Local Time is:                      Sun Dec  6 14:38:43 2020 JST
Firmware Updates (0x16):            3 Slots, no Reset required
Optional Admin Commands (0x0017):   Security Format Frmw_DL Self_Test
Optional NVM Commands (0x001f):     Comp Wr_Unc DS_Mngmt Wr_Zero Sav/Sel_Feat
Maximum Data Transfer Size:         512 Pages
Warning  Comp. Temp. Threshold:     81 Celsius
Critical Comp. Temp. Threshold:     82 Celsius

Supported Power States
St Op     Max   Active     Idle   RL RT WL WT  Ent_Lat  Ex_Lat
 0 +     7.02W       -        -    0  0  0  0        0       0
 1 +     6.30W       -        -    1  1  1  1        0       0
 2 +     3.50W       -        -    2  2  2  2        0       0
 3 -   0.0760W       -        -    3  3  3  3      210    1200
 4 -   0.0050W       -        -    4  4  4  4     2000    8000

Supported LBA Sizes (NSID 0x1)
Id Fmt  Data  Metadt  Rel_Perf
 0 +     512       0         0

=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

SMART/Health Information (NVMe Log 0x02)
Critical Warning:                   0x00
Temperature:                        37 Celsius
Available Spare:                    100%
Available Spare Threshold:          10%
Percentage Used:                    5%
Data Units Read:                    35,790,059 [18.3 TB]
Data Units Written:                 82,128,793 [42.0 TB]
Host Read Commands:                 1,023,852,516
Host Write Commands:                7,476,300,810
Controller Busy Time:               3,180
Power Cycles:                       1,277
Power On Hours:                     3,836
Unsafe Shutdowns:                   174
Media and Data Integrity Errors:    0
Error Information Log Entries:      229
Warning  Comp. Temperature Time:    0
Critical Comp. Temperature Time:    0
Temperature Sensor 1:               37 Celsius
Temperature Sensor 2:               40 Celsius

Error Information (NVMe Log 0x01, max 64 entries)
No Errors Logged
```

特にエラーはないようですが、これは、`VALUE WORST THRESH` がないですね...。
NVMeだからですかね...。

## 終わり

というわけで、SSD/HDDの状態を確認する方法について書いてみました。
これらのコマンドの結果を見て、お使いの監視システムとつなぎこめば、SSD/HDDの状態を監視して、事前に対応ができますね。
今どきは、余り使いどころはないかもしれませんが、個人のノートPCや自宅サーバでもチェックしてみると良いかと思います。

----
Wanoは積極的にエンジニア採用を行なっています！
まずはオンラインでVPoEとのカジュアル面談から。お好きな入り口からお気軽にお声がけください！
Wano Recruitページ　https://group.wano.co.jp/recruit/
QiitaJobs　https://jobs.qiita.com/employers/wano-inc/postings/1297
Wantedly　https://www.wantedly.com/companies/wano/projects
Findy　https://findy-code.io/companies/522

EDOCODEも積極的にエンジニア採用を行っています!
興味のある方は下記を参照ください。
Green https://www.green-japan.com/job/94118