mdadmをUbuntu serverで実行しています。md0とmd1の2つのRAIDアレイを動かしているのですが、md1は現在スクラビングの最中です。月初の日曜日にシステムのスクラビングがかかりますが、二重にかかるのでしょうか

結論から申し上げますと、Ubuntu Serverの標準的な設定(/etc/cron.d/mdadm など)では、スクラビングが「二重に重なって実行される」ことはありません

現在 md1 がスクラビング中であれば、システムによる定期実行のタイミングが来ても、通常は以下のような挙動になります。

1. スクラビングの排他制御

Ubuntuのスクラビングスクリプト(checkarray)は、すでに実行中のアレイがある場合、それを検知してスキップするか、順番待ちにする設計になっています。そのため、一つのアレイに対して同時に2つのスクラビングプロセスが走ることはありません。

2. 現在進行中の処理への影響

  • md1について: 現在実行中のスクラビングがそのまま継続されます。定期実行のタイミングが来ても、md1 に対して新たに処理が重複して重くなることはありません。
  • md0についてmd1 の処理が終わった後、あるいはスクリプトの実行順序に従って開始されます。

3. 注意点:I/O負荷の増大

二重にはかかりませんが、月初の日曜日に md1 のスクラビングがまだ終わっていない場合、システムが md0 のスクラビングも開始しようとする可能性があります。mdadmの設定によっては複数のアレイを並列でスクラビングしようとするため、ディスク全体のI/O負荷が高まり、システムの応答が一時的に遅くなる場合があります。 

現在の状態を確認する方法

現在のアレイの状態と、スクラビングがどのように進行しているかは以下のコマンドで確認できます。

  • 進行状況の確認:
    cat /proc/mdstat
    check という文字と進捗率が表示されます)
  • 詳細なステータス:
    sudo mdadm --detail /dev/md1

もしシステムの負荷が高すぎる場合は、以下のコマンドでスクラビングを一時停止することも可能です。
echo "idle" | sudo tee /sys/block/md1/md/sync_action

md0のスクラビングも開始されるのが心配な場合は、cronの設定/etc/cron.d/mdadm)を確認し、開始時間をずらすなどの調整を検討してみてください。

現在/etc/cron.d/mdadmは 57 0 * * 0 root [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ] && /usr/share/mdadm/checkarray –cron –all –idle –quiet となっています。md0のスクラビングを遅らせたいのですがどうすればいいでしょう。

現在設定されている 

checkarray --all は、検出されたすべてのRAIDアレイに対して一斉にスクラビングを開始する命令です。

md0 の実行を遅らせるには、「すべて一括(–all)」ではなく「個別に指定」するように設定を書き換えるのが最も確実です。

以下の手順で調整を検討してみてください。

1. md0 と md1 の実行時間をずらす

/etc/cron.d/mdadm を編集し、--all を外してアレイごとに時間を分けて記述します。

bash

# md1 は従来通り(第1日曜の 0:57)
57 0 * * 0 root [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ] && /usr/share/mdadm/checkarray --cron --idle --quiet /dev/md1

# md0 は時間をずらす(例:3時間後の 3:57)
57 3 * * 0 root [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ] && /usr/share/mdadm/checkarray --cron --idle --quiet /dev/md0

※ /dev/md0 のようにデバイス名を明示することで、そのアレイだけを対象にできます。

2. (代替案)第1日曜と第2日曜に分ける

もし負荷を完全に分散させたい(週をまたぎたい)場合は、日付判定のロジックを変更します。

  • md1 (第1日曜)[ $(date +\%d) -le 7 ]
  • md0 (第2日曜)[ $(date +\%d) -gt 7 ] && [ $(date +\%d) -le 14 ]

3. スクラビングの速度制限をかける(I/O負荷対策)

「開始時間を遅らせる」目的が「システムの重さを回避したい」ということであれば、カーネルパラメータでスクラビングの最大速度を制限するのも有効です。

bash

# 現在の制限値を確認
cat /proc/sys/dev/raid/speed_limit_max

# 一時的に制限を絞る (例: 50MB/s = 50000)
echo 50000 | sudo tee /proc/sys/dev/raid/speed_limit_max

※これはシステム全体に適用されます。

まずは 手順1 のように、--all を外して個別のアレイを指定する方法で、何時間か時間をずらして設定してみるのが最もシンプルでおすすめです。

設定変更後、cronサービスを再起動sudo systemctl restart cron)して反映させるのを忘れないでください。

md0 のスクラビングを、何時間ほど(あるいは何日ほど)遅らせて開始したいという具体的なイメージはありますか?

md0は第二日曜にしたいです。

md0

 の実行を 「第2日曜日」 に設定するには、日付判定の条件を [ $(date +\%d) -gt 7 ] && [ $(date +\%d) -le 14 ] (日付が7より大きく、かつ14以下)に書き換えます。

/etc/cron.d/mdadm を以下のように編集してください。

設定の書き換え例

元の --all を含んだ行をコメントアウト(または削除)し、個別に指定します。

bash

# 第1日曜日に md1 を実行
57 0 * * 0 root [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -le 7 ] && /usr/share/mdadm/checkarray --cron --idle --quiet /dev/md1

# 第2日曜日に md0 を実行
57 0 * * 0 root [ -x /usr/share/mdadm/checkarray ] && [ $(date +\%d) -gt 7 ] && [ $(date +\%d) -le 14 ] && /usr/share/mdadm/checkarray --cron --idle --quiet /dev/md0

設定のポイント

  • 日付の条件[ $(date +\%d) -gt 7 ] && [ $(date +\%d) -le 14 ] とすることで、「日曜日かつ日付が8日〜14日の間(=第2日曜日)」にのみ実行されるようになります。
  • デバイス名の指定: 最後に /dev/md1 や /dev/md0 を明示することで、特定のアレイだけを狙ってスクラビングを開始させます。

反映手順

  1. ファイルを保存します。
  2. 念のため、cronサービスを再起動して設定を読み込ませます。bashsudo systemctl restart cron

これで、第1週は md1、第2週は md0 と分散して実行されるようになります。

設定変更後、実際に正しく動作するか不安な点や、他に追加したいアレイなどはありますか?

ありがとうございました。これでいってみます。

設定の変更、お疲れ様です!これで 

md0 と md1 の負荷が分散され、システムがより安定して運用できるようになるはずです。

もし設定後にうまく動いているか気になった場合は、該当する日曜日の朝に cat /proc/mdstat を確認してみてください。check のステータスが出ていれば成功です。