Netdata閾値最適化:DSM SHR環境MDアレイアラート詳細研究

Netdataにおける閾値の研究:DSM SHR環境におけるMDアレイアラートの最適化

はじめに

本稿では、Synology DiskStation Manager(DSM)のSynology Hybrid RAID(SHR)環境において、NetdataのMDアレイに関するアラートが誤検知される問題に焦点を当て、その原因を深く掘り下げ、そして最適な閾値設定を研究します。特に、SHRの特性がNetdataのデフォルト監視に与える影響を解説し、2つの異なる改善案を提示します。

問題の背景とDSM SHRの特性

通常のLinuxシステムにおいて、RAIDアレイのディスクが「ダウン」状態になることは、物理的な故障やディスクの不足を意味し、データ損失のリスクがあるため、緊急性の高い問題として扱われます。Netdataのデフォルト設定も、md.disksチャートの$downメトリクスが0より大きくなるとアラートを発するように定義されています。

しかし、SynologyのDSMで採用されているSHR(Synology Hybrid RAID)は、従来のRAIDとは異なる特性を持ちます。SHRは、異なるサイズのディスクを柔軟に組み合わせてストレージプールを構築し、効率的な容量利用とデータ保護を両立させることを目的としています。このSHRの内部実装において、特にシステムパーティションや一部のデータボリュームを構成するMDアレイ(例: /dev/md0/dev/md1)は、論理的に最大で26個のような多数のデバイスを期待するメタデータを持つことがあります。

実際の環境では、例えば物理ディスクが2台しか接続されていなくても、cat /proc/mdstatの出力では [26/2] [UU________________________] のように表示されます。これは、「26個の期待されるデバイスのうち、2個がアクティブであり、残りの24個は論理的に不足している(つまり、待機スロットとして扱われている)」状態を示唆します。Netdataは、この「24個の論理的に不足しているデバイス」を「24 failed devices」として認識し、デフォルトの $this > 0 という閾値によってアラートをトリガーします。

この状況は、物理的なディスク故障ではないにもかかわらず、継続的なアラート発生を引き起こし、真の障害検知の妨げとなります。

閾値設定の研究と提案

この問題に対処するため、Netdataのmdstat_disksアラート(/etc/netdata/health.d/mdstat.conf 内で定義)を修正します。キーとなるのは、calc変数の活用と、それに続くwarnおよびcrit閾値の調整です。

共通の修正点:calc変数の活用

どちらの提案も、calc変数を以下の式で修正することで、Netdataが「ダウンデバイス数」として扱う値を、あなたの環境での「真の物理的な故障数」に変換します。これにより、後続のwarncritの閾値を通常の意味(>0>1)で設定できるようになります。

calc: ($down > 24 ? ($down - 24) : 0)

この計算により、$downが24を超える場合のみ、その超過分(すなわち、論理的不足数を超える物理的故障数)が$thisに代入されます。これにより、$thisは「24個の論理的不足を除いた、実際の物理故障デバイス数」を示します。

提案1(私の案):物理ディスク1台故障で警告、2台故障で致命的

この案は、一般的なRAID1アレイの耐障害性モデルに沿ったものです。2台の物理ディスクで構成されるRAID1において、1台の故障は「デグレード」状態(冗長性喪失)であり警告を要し、2台の故障は「アレイ停止」であり致命的な問題と見なされます。

template: mdstat_disks
    on: md.disks
    class: Errors
    type: System
    component: RAID
    units: failed devices
    every: 10s # ディスク故障の即時検知を優先

    calc: ($down > 24 ? ($down - 24) : 0) # 24個の論理的不足を除外

    warn: $this > 0 # 物理ディスクが1台でも故障したら警告
    crit: $this > 1 # 物理ディスクが2台以上故障したら危険

    summary: MD array device ${label:device} physical status alert
    info: Number of devices in the down state for the ${label:device} ${label:raid_level} array. \
          Calculated actual physical failed devices: ${this}. \
          (Note: In this specific Synology DSM environment, up to 24 non-active logical devices are considered normal.) \
          A positive 'physical failed devices' count indicates a true hardware degradation.
    to: sysadmin

【評価】

  • 利点: 物理ディスク1台の故障で迅速に警告を発するため、最も保守的かつ安全な監視を提供します。冗長性が失われた時点でアラートを出すため、次の故障に備える時間的余裕が生まれます。
  • 適用シナリオ: データの整合性と可用性を最優先し、いかなるデグレード状態も見逃したくない場合に最適です。

提案2(ユーザー様の案):物理ディスク1台故障では警告なし、2台故障で警告、3台以上で致命的

この案は、提案1よりも警告の敷居を高く設定するものです。RAID1の性質上、1台の故障ではまだデータ損失には至らないため、あえて警告をスキップし、より深刻な状態(2台以上の故障)で警告を発することを意図している可能性があります。

template: mdstat_disks
    on: md.disks
    class: Errors
    type: System
    component: RAID
    units: failed devices
    every: 30s # 監視間隔を長めに設定し、負荷軽減を優先

    calc: ($down > 24 ? ($down - 24) : 0)  # SHRの待機ディスクを除外

    warn: $this > 1  # 物理ディスク2台以上故障で警告
    crit: $this > 2  # 物理ディスク3台以上故障で危険

    summary: MD array device ${label:device} down
    info: Number of devices in the down state for the ${label:device} ${label:raid_level} array. \
          Any number > 1 indicates that the array is degraded beyond SHR's normal standby limits.
    to: sysadmin

【評価】

  • 利点: 警告の頻度をさらに減らし、RAID1の性質上1台故障ではデータ損失がないという点を重視する場合に有効です。every: 30sと組み合わせることで、Netdataの負荷をわずかに軽減する可能性があります。
  • 適用シナリオ: 警告の数を最小限に抑えたい、かつ1台のディスク故障は許容範囲内であり、複数台の故障時のみ迅速な通知が必要な場合に検討されます。ただし、RAID1で2台故障は既に致命的な状態であるため、critの閾値を$this > 1に設定し直す方が一般的なRAID運用の観点からは適切です。RAID1で$this > 2(物理ディスク3台以上の故障)という状態は通常発生しないため、この設定は実質的に機能しません。

結論と推奨

DSM SHR環境におけるNetdataのMDアレイアラートは、論理的なディスク不足による誤検知が原因です。この問題を解決するためには、calc変数で「真の物理的な故障数」を計算し、その値に対して閾値を設定することが不可欠です。

研究の結果、Netdataのデフォルト設定の意図と一般的なRAID1の耐障害性の概念を最も適切に両立させるのは、提案1(私の案)であると結論付けられます。 物理ディスク1台の故障で警告を発することで、冗長性が失われた状態を早期に検知し、データ損失のリスクを最小限に抑えることが可能です。

提案2は、warncritの閾値がRAID1の特性と乖離しており、特にcrit: $this > 2は実質的に機能しない可能性が高いため、推奨されません。また、every: 30sは負荷軽減のメリットはありますが、ディスク故障の即時性という点では10sに劣ります。

この研究と提案が、あなたのDSM環境におけるNetdataの監視を最適化し、より信頼性の高いシステム運用に貢献することを願っています。

© 2025 Your Name or Organization. All rights reserved.

// if (typeof Prism !== 'undefined') { Prism.highlightAll(); console.log('コードハイライトを適用しました。'); } else { console.warn('Prism.jsが見つかりません。コードハイライトは適用されません。'); } // 外部リンクに target="_blank" と rel="noopener noreferrer" を追加 // ライブドアブログのドメインに合わせて調整が必要な場合があります。 document.querySelectorAll('a[href^="http"]:not([href*="' + location.hostname + '"])').forEach(link => { link.setAttribute('target', '_blank'); link.setAttribute('rel', 'noopener noreferrer'); }); console.log('外部リンク属性を更新しました。'); });