Article

ファイルサーバーの容量不足を根本解決する方法

高田晃太郎
ファイルサーバーの容量不足を根本解決する方法

統計では、企業が扱う情報の多くは非構造化データ(文書、画像、ログなどの固定スキーマを持たないデータ)で占められ、データ量の増加ペースは年平均で20〜30%に達するとされています¹²。運用の現場でも、容量警告は四半期末や決算資料の集約タイミングに偏在し、しかも過去90日間未アクセスの「冷データ」の割合が高い、という傾向は珍しくありません。業界調査でも「保存データの大多数は長期未アクセス」であり、過去90日未アクセスの比率が高いとする報告があります³。ストレージを増設する対処は即効性がありますが、根因であるデータライフサイクル(生成・利用・保管・廃棄)の設計を後回しにすれば、翌年も同じ課題に直面します。目指すべきは、単発の延命ではなく、可視化(実態を測る)・ポリシー(ルールを決める)・テクノロジー(仕組みで支える)を連動させた設計です。可視化で現実を直視し、削減で負債を圧縮し、抑制と階層化で将来の増大を制御する。その流れを具体的なコマンドと運用指標まで落とし込み、経営と現場の合意形成を進めていきます。私はCTOの立場から、実装の可搬性と運用の持続可能性を両立させる視点で整理します。

容量不足は現象であって原因ではない――まずは可視化と計測から

原因分析を飛ばして増設するほど、後戻りコストは膨らみます。初動では、どの共有がどれだけ成長し、重複が多いファイルタイプは何か、アクセスの新陳代謝はどうかを、事実ベースで掴みます。ここでいう「重複排除」は同一データの塊(チャンク)を一つにまとめる技術、「圧縮」はデータを小さく符号化する技術、「階層化(HSM/ILM)」はアクセス頻度に応じて保管場所を変えることです。WindowsではPowerShellで上位ディレクトリのサイズを洗い出し、Linuxではduとsortで傾向を掴むのが手早い。調査時は本番I/Oへの影響を避けるため、業務外時間帯に絞って実行するか、影響の小さいサンプリングを選びます。

# PowerShell: 上位20ディレクトリのサイズ可視化(概算、業務外で実行推奨)
Get-ChildItem -Path E:\Shares -Directory -ErrorAction SilentlyContinue |
  ForEach-Object {
    try {
      $size = (Get-ChildItem $_.FullName -Recurse -ErrorAction SilentlyContinue | 
               Measure-Object -Property Length -Sum).Sum
      [PSCustomObject]@{ Path = $_.FullName; Bytes = $size }
    } catch {
      [PSCustomObject]@{ Path = $_.FullName; Bytes = -1 }
    }
  } |
  Where-Object { $_.Bytes -ge 0 } |
  Sort-Object Bytes -Descending |
  Select-Object -First 20 | Ft -Auto

Linuxでも同様に、ディレクトリ別のサイズを短時間で俯瞰できます。さらに、atime(最終アクセス時刻、noatime等のマウントでは無効)を使える環境なら、古い領域を把握して階層化候補を抽出します。

# Linux: 上位20ディレクトリのサイズ(バイト単位)
sudo du -sx --bytes /srv/shares/* 2>/dev/null | sort -nr | head -20
# 最終アクセス180日超のファイル数把握(atime有効な場合)
sudo find /srv/shares -type f -atime +180 | wc -l

可視化が済んだら、容量モデルを用意します。過去12〜18カ月の実績から月次増分を算出し、今後の施策で見込める削減率と階層化率を仮置きします。例えば、重複排除で30〜50%⁴、圧縮で10〜30%(データ特性に依存)¹⁰、階層化で冷データの20〜40%を一次ストレージから逃がす、といった一般的なレンジを参考に³、合計の削減見込みとヘッドルームを30〜40%確保する前提で、投資と期日を引きます。現実的な判断のために、CPU/メモリの余力、バックアップ時間、再スキャンの所要時間といった非機能要件も同じ表に置き、トレードオフを可視化することが肝要です。

前提環境と想定

本文のコマンドや数値は例示であり、Windows Server 2019/2022のSMBファイルサーバーと、Linuxのxfs/btrfsを想定しています。ベンダーNASでは機能名や設定手順が異なるため、重複排除・クォータ・階層化(HSM/ILM)に該当する機能へ読み替えてください。仮想化やハイパーコンバージド環境では、重複排除とスナップショットの相互作用に留意し、バックアップ製品側の重複排除との二重適用は避けます。いずれも本番適用前にテスト環境での検証を推奨します。

根本施策を三層で設計する:削減・抑制・階層化

容量不足の再発防止には、物理増設に先立ち、データ自体を軽くする削減、無秩序な増大を制御する抑制、アクセスされないデータを安価な階層に逃がす階層化を、運用できる粒度でまとめて導入します。各施策は単独でも効きますが、三つを同時に回すと相乗効果が出て、一次ストレージの消費スピードは目に見えて鈍化します。

削減:重複排除と圧縮の現実値と安全な有効化

ユーザー共有やプロジェクト文書は重複が多く、Microsoftのガイダンスでも一般的なファイルサーバーで30〜50%の削減率が報告されています⁴。Windows Serverのデータ重複排除はボリューム単位で有効化でき、ジョブ実行はバックグラウンドでスロットリングされます。初期スキャンはCPUとディスクI/Oを使うため、メンテナンス時間帯を狙うのが実践的です。

# Windows データ重複排除の有効化と実行状況確認
try {
  Enable-DedupVolume -Volume "E:" -UsageType Default -ErrorAction Stop
  Set-DedupVolume -Volume "E:" -MinimumFileAgeDays 3 -ExcludeFileType .pst
  Start-DedupJob -Volume "E:" -Type Optimization
} catch {
  Write-Error "重複排除の有効化に失敗: $($_.Exception.Message)"
}
Get-DedupStatus
Get-DedupVolume

Linuxでは、ファイルシステムの圧縮機能が手軽です。btrfsのzstd圧縮はCPUコストと圧縮率のバランスが良く、オフィス文書混在の共有で10〜30%の削減が一般に期待できます(データ特性による)¹⁰。新規マウントや再バランス時に適用し、既存データには再書き込みやバランス操作で圧縮を行き渡らせます。

# btrfs: zstd圧縮のマウント例(/etc/fstab)
UUID=xxxx /srv/shares btrfs defaults,compress=zstd:3,space_cache=v2,ssd 0 0
# 既存データの再圧縮・再配置
sudo btrfs balance start -dlimit=2 -mlimit=2 /srv/shares

初期最適化時はI/Oが一時的に高止まりし、重複排除のチャンク参照はランダムI/Oを増やします。一方で定常運用ではオーバーヘッドは小さく収まり、バックアップ送出量の削減でメンテナンス時間が短縮されるケースが多い、というのが一般的な現場感です。性能は観測とセットで評価してください。

抑制:クォータとガバナンスで無秩序な増大を止める

削減で空けた容量は、施策を伴わなければすぐ埋まります。共有単位のハード/ソフトクォータ(上限・警告閾値)と、拡張申請の運用ルールを同時に敷きます。WindowsのFSRMでソフトクォータの通知を設定し、利用者にセルフクリーニングを促すのが効果的です⁸。通知テンプレートにデータ保全ポリシーやアーカイブ手続きのリンクを添え、行動を具体化します。

# FSRM: ソフトクォータと通知(85%/95%)
try {
  New-FsrmQuota -Path "E:\\Shares\\ProjectA" -Size 500GB -SoftLimit $true |
    Out-Null
  New-FsrmQuotaThreshold -Path "E:\\Shares\\ProjectA" -Threshold 85 -Notification "Email"
  New-FsrmQuotaThreshold -Path "E:\\Shares\\ProjectA" -Threshold 95 -Notification "EventLog"
} catch {
  Write-Error "クォータ設定に失敗: $($_.Exception.Message)"
}

Linuxのxfsではプロジェクトクォータでディレクトリ単位の上限を課せます⁹。オンボーディング手順にクォータ発行を組み込み、例外はチケットで記録し、履歴を資産台帳と結びつけると、棚卸しと内部統制の両方が回りやすくなります。

# xfs: プロジェクトクォータ(例)
echo 100:/srv/shares/projectA | sudo tee -a /etc/projid
echo projectA:/srv/shares/projectA | sudo tee -a /etc/projects
sudo xfs_quota -x -c "project -s projectA" /srv
sudo xfs_quota -x -c "limit -p bsoft=450g bhard=500g projectA" /srv

階層化:高価な一次ストレージから冷データを逃がす

アクセス頻度が低下したファイルは、ユーザー体験を損なわずに安価なオブジェクトストレージへ退避できます。階層化では、ローカルに「スタブ(プレースホルダー)」を残し、開かれた時だけオンデマンドで取得する方式が一般的です。WindowsではAzure File Syncのクラウド階層化を使うと、ローカルスタブ+オンデマンド取得の運用が可能です⁵。保持期間や最小空き容量のポリシーを決め、ネットワーク帯域を平準化するスロットリング設定を忘れないことが運用の勘所です。

# Azure File Sync: サーバーエンドポイント作成(クラウド階層化有効)
# 事前にSync Groupとストレージを作成済みとする
New-AzStorageSyncServerEndpoint \
  -ResourceGroupName RG \
  -StorageSyncServiceName SyncSvc \
  -SyncGroupName ShareSync \
  -ServerResourceId $server.Id \
  -ServerLocalPath "E:\\Shares" \
  -CloudTiering true \
  -VolumeFreeSpacePercent 20 \
  -TierFilesOlderThanDays 90

オブジェクトストレージ側では、さらに長期未アクセスのデータを低頻度・アーカイブ階層へ自動で落とすライフサイクルを定義します。S3互換であればJSONポリシー一枚で運用を自動化でき、コストの予見性が増します¹¹。

{
  "Rules": [{
    "ID": "cold-to-archive",
    "Filter": {"Prefix": "shares/"},
    "Status": "Enabled",
    "Transitions": [
      {"Days": 90, "StorageClass": "STANDARD_IA"},
      {"Days": 180, "StorageClass": "GLACIER"}
    ],
    "NoncurrentVersionTransitions": [{"NoncurrentDays": 30, "StorageClass": "GLACIER"}]
  }]
}

ユーザー体験では、スタブファイルの開封遅延を嫌う声が上がりがちです。対策として、部門共有やプロジェクトごとにポリシーを変え、役員やクリエイティブ系のホットデータ領域は階層化から外すと揉め事が減ります。体感速度を守って削減効果を最大化する「スイートスポット」を、ログとヒアリングで素早く見つけてください。

無停止に近い改善を可能にする移行設計と運用連携

根本施策を導入するとき、止められない共有をどう扱うかが鍵です。ネームスペース(論理的な共有パス)を抽象化し、切り替えをユーザーに気付かせないのが定石。WindowsではDFS Namespacesで論理パスを固定し、裏側で新旧ターゲットを差し替えます⁶。データ移行はrobocopyで事前同期を積み上げ、最終差分は短時間で切り替えます。

# 事前同期と最終差分(監査ビット維持、ACL含む、多重スレッド)
$src = "\\\\oldfs\\Share"; $dst = "\\\\newfs\\Share"
robocopy $src $dst /MIR /COPY:DATSOU /R:1 /W:1 /MT:32 /DCOPY:DAT /XJ /XD "~$*"
# 切替直前の差分同期(短時間で完了させる)
robocopy $src $dst /MIR /COPY:DATSOU /R:1 /W:1 /MT:32 /XO /XN /XC

近距離サイト間ならStorage Replicaでブロック単位の同期を張り、計画停止なしにフェイルオーバーの要領で切り替える設計も現実的です⁷。Linuxではrsyncの—link-destやスナップショットを併用し、差分だけを速やかに運ぶと、共有の占有時間を最小化できます¹²。切替後は監査ログとアクセスエラーのメトリクスを監視に流し、異常を早期に拾い上げます。

性能の見立ては机上では終わりません。小さなサンプルで良いので、コピーや重複排除の実効スループットを現場のディスクとネットワークで測り、所要時間を逆算します。PowerShellのMeasure-Command等でローカルコピーの秒数を取り、スループットの下限を押さえてから本番の時間窓を決めるのが安全策です。

# 簡易ベンチ: 実効スループット計測
$sw = [System.Diagnostics.Stopwatch]::StartNew()
robocopy E:\testsrc E:\testdst /E /R:0 /W:0 /MT:16 | Out-Null
$sw.Stop(); $sec = $sw.Elapsed.TotalSeconds
$bytes = (Get-ChildItem -Recurse E:\testsrc | Measure-Object Length -Sum).Sum
"Throughput(MB/s): " + [math]::Round(($bytes/1MB)/$sec,2)

バックアップと復元時間をKPIに含める

一次ストレージの削減は、バックアップの転送量や保管費にも連鎖します。重複排除はバックアップ製品側の重複排除と相互作用し、メリットが相殺される場合があります。一般論としては、一次側は圧縮主体、バックアップ側でグローバル重複排除を効かせる構成が検討に値します。いずれにしても、バックアップ時間、リストア時間、保管容量の三つをKPI(重要業績評価指標)として握り、四半期ごとにトレンドをレビューします。

KPIとROI:三カ月で効果を見える化し、合意形成を早める

経営判断を動かすには、初期投資、ランニング、削減効果を数値で語る必要があります。試算例として、使用中100TBのファイルサーバーを想定し、ホットデータ70TBに重複排除で40%の削減⁴、圧縮追加で10%の上乗せ、コールドデータ30TBのうち60%をオブジェクトへ階層化すると仮定します³。一次側の見かけ利用はホット70TB→約37.8TB、コールド30TB→12TBが残り、合計はおよそ49.8TB。単価が一次ストレージX円/TB/月、オブジェクトはその20〜30%だとすれば、月次の保管コストは大幅に低下し、バックアップ窓も短縮されます。初期の実装・検証・移行は8〜12週間の目安で、PoCとパイロットの二段構えにすると、現場の不安も抑えられます。ここでの数字はあくまで前提に依存する試算であり、実環境での計測に基づき補正してください。

現場では、節約額だけでなく、事故リスクの低下と復旧時間の改善も立派なROI(投資対効果)です。容量逼迫が原因の業務停止や、緊急増設に伴う人的コストを、過去のインシデント・チケットから積み上げると、投資対効果の議論が具体化します。一次容量の伸び率、冷データ比率、バックアップ窓、復旧時間の四指標を毎月ダッシュボード化し、全社で進捗を共有すると、施策が一過性で終わりません。

よくある落とし穴と回避策

重複排除を仮想化基盤の下でも同期的に使いすぎると、ランダムI/Oが増えて遅延を感じやすくなります。高レイテンシ下での階層化スタブは利用者体験を損なうため、帯域制御や事前フェッチのスケジュールを活用します。圧縮率を上げてCPUを枯渇させるより、ほどほどの設定で安定運用する方が、結果的に削減量は伸びます。ガバナンス面では、クォータの一律適用は強い反発を招きがちです。部門の事情に合わせた初期枠と、拡張申請の目安、アーカイブの選択肢を併記し、「拒否ではなく選択肢の提示」として説明するのが合意形成の近道です。

運用に溶け込ませる:定期ジョブとレポート

可視化は単発では意味がありません。週次でサイズの上位共有と増分をレポートし、しきい値超過をSlackやTeamsに通知します。WindowsではFSRMのストレージレポート、Linuxではduのサマリとファイル数の変化をジョブ化し、Gitにレポートをコミットしてトレンドを残すと、棚卸しの議論が建設的になります。

小さく始めて広げる:パイロット設計

最初から全社導入は目標が高すぎます。影響半径が小さく、重複や冷データの多い共有を一つ選び、重複排除、クォータ、階層化を一揃いで適用します。3週間で可視化と設計、3週間で実装と移行、2週間で効果測定と調整、のように節で区切ると、ステークホルダーの期待管理が容易です。三カ月のパイロットで、一次容量の顕著な削減やバックアップ時間の短縮が確認できれば、次の共有へ自信を持って拡張できます。

まとめ:増設の前に、設計で“軽くする”選択を

容量不足を根本から断つには、見て、減らして、制御し、逃がすという当たり前を、無停止に近い運用で回し続けることに尽きます。増設は最後のカードです。まずは実情を可視化し、重複排除と圧縮で目に見える削減を作り、クォータで将来の膨張を抑え、階層化で高価な一次ストレージから冷データを解放します。そこに、切替を意識させない移行設計と、バックアップKPIの継続監視を重ねれば、繰り返してきたトラブル対応の連鎖を断ち切れます。

次に何から始めるかは明快です。今夜の業務外時間に可視化のコマンドを一度流し、数字で現実を掴んでください。最初の小さな可視化が、三カ月後の大きな“軽さ”の起点になります。そこからチームで合意し、設計し、運用に落とし込む未来を描きましょう。

参考文献

  1. Box Japan 企業が持つ情報の90%は非構造化データ ~そこに眠る無限の価値
  2. Deccan Chronicle IDC study suggests the global datasphere could grow up to 175 zettabytes by 2025
  3. TechTargetジャパン 保管データの“実態”、「90日未アクセスが95%」は本当か
  4. Microsoft Learn Data Deduplication overview
  5. Microsoft Learn Azure File Sync cloud tiering overview
  6. Microsoft Learn DFS Namespaces overview
  7. Microsoft Learn Storage Replica overview
  8. Microsoft Learn Quota Management with File Server Resource Manager
  9. xfs_quota(8) — Linux man page
  10. btrfs Wiki Compression
  11. AWS Amazon S3 Lifecycle configuration
  12. rsync(1) — Linux man page