28.5. NVDIMM のトラブルシューティング

28.5.1. S.M.A.R.T. を使用した NVDIMM 正常性の監視

一部の NVDIMMs は正常性情報の取得に Self-Monitoring, Analysis and Reporting Technology (S.M.A.R.T.) インターフェースに対応しています。
NVDIMM 正常性を定期的に監視することで、データの損失を回避します。「破損した NVDIMM の検出と置換」 で説明しているように、S.M.A.R.T. が NVDIMM の正常性ステータスについて問題を報告すると、置き換えられます。

前提条件

  • 一部のシステム上では、以下のコマンドを使用して正常性情報を取得するために acpi_ipmi ドライバーをロードする必要があります。
    # modprobe acpi_ipmi

手順

  • 正常性情報にアクセスするには、以下のコマンドを使用します。
    # ndctl list --dimms --health
    ...
        {
          "dev":"nmem0",
          "id":"802c-01-1513-b3009166",
          "handle":1,
          "phys_id":22,
          "health":
          {
            "health_state":"ok",
            "temperature_celsius":25.000000,
            "spares_percentage":99,
            "alarm_temperature":false,
            "alarm_spares":false,
            "temperature_threshold":50.000000,
            "spares_threshold":20,
            "life_used_percentage":1,
            "shutdown_state":"clean"
          }
         }
    ...

28.5.2. 破損した NVDIMM の検出と置換

システムログまたは S.M.A.R.T. で報告された NVDIMM 関連のエラーメッセージが使った場合は、NVDIMM デバイスがエラーを起こしていることが考えられます。この場合、以下を行う必要があります。
  1. NVDIMM デバイスがエラーしていることを検出
  2. そこに格納されているデータをバックアップ
  3. デバイスを物理的に交換。

手順28.3 破損した NVDIMM の検出と置換

  1. 破損した DIMM を検出するには、以下のコマンドを使用します。
    # ndctl list --dimms --regions --health --media-errors --human
    badblocks フィールドは、NVDIMM が破損していることを示しています。dev フィールドの名前をメモしてください。以下の例では、nmem0 が破損しています。

    例28.1 NVDIMM デバイスの正常性ステータス

    # ndctl list --dimms --regions --health --media-errors --human
    
    ...
      "regions":[
        {
          "dev":"region0",
          "size":"250.00 GiB (268.44 GB)",
          "available_size":0,
          "type":"pmem",
          "numa_node":0,
          "iset_id":"0xXXXXXXXXXXXXXXXX",
          "mappings":[
            {
              "dimm":"nmem1",
              "offset":"0x10000000",
              "length":"0x1f40000000",
              "position":1
            },
            {
              "dimm":"nmem0",
              "offset":"0x10000000",
              "length":"0x1f40000000",
              "position":0
            }
          ],
          "badblock_count":1,
          "badblocks":[
            {
              "offset":65536,
              "length":1,
              "dimms":[
                "nmem0"
              ]
            }
          ],
          "persistence_domain":"memory_controller"
        }
      ]
    }
  2. 以下のコマンドを使用して、破損した NVDIMM の phys_id 属性を見つけます。
    # ndctl list --dimms --human
    以前の例から、nmem0 が破損した NVDIMM であることがわかっています。よって、nmem0phys_id 属性を見つけます。以下の例では、phys_id0x10 です。

    例28.2 NVDIMMs の phys_id 属性

    # ndctl list --dimms --human
    
    [
      {
        "dev":"nmem1",
        "id":"XXXX-XX-XXXX-XXXXXXXX",
        "handle":"0x120",
        "phys_id":"0x1c"
      },
      {
        "dev":"nmem0",
        "id":"XXXX-XX-XXXX-XXXXXXXX",
        "handle":"0x20",
        "phys_id":"0x10",
        "flag_failed_flush":true,
        "flag_smart_event":true
      }
    ]
  3. 以下のコマンドを使用して、破損した NVDIMM のメモリースロットを見つけます。
    # dmidecode
    出力において、Handle 識別子が、破損した NVDIMM の phys_id 属性と一致するエントリーを見つけます。Locator フィールドは、破損した NVDIMM によって仕様されたメモリースロットを一覧表示します。以下の例では、nmem00x0010 識別子に一致し、DIMM-XXX-YYYY メモリースロットを使用します。

    例28.3 NVDIMM メモリースロットリスティング

    # dmidecode
    
    ...
    Handle 0x0010, DMI type 17, 40 bytes
    Memory Device
            Array Handle: 0x0004
            Error Information Handle: Not Provided
            Total Width: 72 bits
            Data Width: 64 bits
            Size: 125 GB
            Form Factor: DIMM
            Set: 1
            Locator: DIMM-XXX-YYYY
            Bank Locator: Bank0
            Type: Other
            Type Detail: Non-Volatile Registered (Buffered)
    ...
  4. NVDIMM 上の名前空間のすべてのデータをバックアップします。NVDIMM を交換する前にデータをバックアップ市内場合は、システムから NVDIMM を削除するとデータが失われます。

    警告

    時折、NVDIMM が完全に破損すると、バックアップが失敗することがあります。
    これを回避するためにも、「S.M.A.R.T. を使用した NVDIMM 正常性の監視」で説明しているように、S.M.A.R.T. を使用して NVDIMM デバイスを定期的に監視して、破損する前にエラーを起こしている NVDIMM を交換してください。
    以下のコマンドを使用して、NVDIMM 上の名前空間を一覧表示します。
    # ndctl list --namespaces --dimm=DIMM-ID-number
    以下の例では、nmem0 デバイスには、バックアップが必要な namespace0.0namespace0.2 名前空間が含まれます。

    例28.4 NVDIMM 名前リストの一覧表示

    # ndctl list --namespaces --dimm=0
    
    [
      {
        "dev":"namespace0.2",
        "mode":"sector",
        "size":67042312192,
        "uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "raw_uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "sector_size":4096,
        "blockdev":"pmem0.2s",
        "numa_node":0
      },
      {
        "dev":"namespace0.0",
        "mode":"sector",
        "size":67042312192,
        "uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "raw_uuid":"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
        "sector_size":4096,
        "blockdev":"pmem0s",
        "numa_node":0
      }
    ]
  5. 破損した NVDIMM を物理的に交換します。