Windows Serverのデータ重複除去解除後のサイズを推定する方法
2018/04/22
本エントリーの目次
Windows Serverの重複除去はとっても便利!
Windows Server 2012、Windows Server 2012 R2で使用可能になったとっても便利な機能の1つに、データ重複除去機能があります。
これはデータの重複している部分(冗長部分)を排除することで、保存に必要なストレージ(データ保存用のディスクなど)の領域(容量・サイズ)を減らす機能です。
一般的なファイルサーバーでは、類似性の高いデータ、または完全に同一なファイルが多数アップロードされる傾向があるといわれています。
そしてこのデータの重複している部分(冗長部分)を排除することで、保存に必要な記憶領域を大幅に削減することが可能になる、というわけ。
そのためファイルサーバーの容量が足りない時には、この重複除去を有効にすることで、追加の記憶領域を別途調達する必要がなくなるなど、コストを低く抑えることが可能です。
またテスト段階などで、まだ大容量の高額なストレージを用意できないが、大容量のデータを扱いたい!
こんなケースでも、きっと役に立つんじゃないかと。
そんなに同じファイルをアップロードしていないし、効果は限定的では?
自分ではそのつもりでも、ファイルサーバーには意外と完全に同じファイルがアップロードされているものなんです。
特に多いのがバックアップ目的などで、オリジナルと完全に同一な複製を別の場所に保存しておく、とかでしょうか。
たしかに自分一人で使っているファイルサーバーであれば、しっかりと管理をしてさえいれば、オリジナルと完全に同一な複製はない状態を実現できるかもしれません。
ですがファイルサーバーはその特性上、複数人で使用されるケースがほとんど。
この場合では、オリジナルと完全に同一な複製が別の場所に存在するデータは1つもない、ということは考えにくいです。
そのためデータ重複除去機能を有効にすることで、たいていのファイルサーバーでは、データの保存に必要なストレージの記憶領域が減ることでしょう。
完全に同一なファイルがない場合でも、効果はあります!
もし仮にですが、ファイルサーバー上に完全に同一なファイルが一切ない場合でも、Windows Server 2012のデータ重複除去では、一定の効果が見込めます。
というのもWindows Server 2012のデータ重複除去では、チャンクと呼ばれる32~128KBの動的な単位でデータを分割。
そのチャンクごとに重複を識別し、重複しているチャンクについては、そのうちの一つだけを保持することで、データの保存に必要な記憶領域を削減します。
このような仕組みにより、ファイルサーバー上に完全に同一なファイルがまったくない場合でも効果が期待できるわけ。
また重複除去機能を有効にしたところで、ファイルにアクセスできなくなるといった問題は一切起こりません。
そのためファイルサーバーを利用するにあたり、データの保存に必要な記憶領域を減らしたい場合には、とても有効な機能です。
ちなみにどれくらいの効果があるのか、マイクロソフトさんのサイトでその目安が紹介されていたので併せてご紹介します。
(マイクロソフト – データ重複除去の展開計画より引用)
シナリオやコンテンツによって、標準的な削減効果にばらつきがありますが、30~95%という非常に高い削減効果が見込めます。
そのため、ディスクの調達費用などのコスト削減に大きく貢献することは間違いないでしょう。
尚、データ重複除去機能のより詳細な仕組みを知りたい方は、マイクロソフトさんが公開しているデータ重複除去の概要を見ていただけると良いかと。
またデータ重複除去機能を有効にする方法についても同様に、マイクロソフトさんが公開しているデータ重複除去のインストールおよび構成をご覧いただければ、分かりやすいと思います。
GUI、CUIともに設定はとても簡単なので、設定方法が分からなくて迷う、ということはないんじゃないかと。
ちなみにWindows Server 2012、Windows Server 2012 R2のデータ重複除去機能と類似の機能は他社製品でも提供されており、データ重複排除、De-duplication(deduplication)と呼ばれていることも。
データ重複除去を有効化すると、本来保存可能なデータサイズ以上にデータを保存可能になってしまう!
ここまでご紹介したとおり、とても素晴らしい機能であるWindows Server 2012、Windows Server 2012 R2のデータ重複除去機能。
ですが場合によっては、これを無効化・解除したい時も。
データ重複除去機能は、データの保存に必要な記憶領域を削減する機能です。
そのためデータ重複除去を有効化すると、本来保存可能なデータのサイズ以上の量のデータを保存可能になってしまう、といったことが起こり得ます。
この特性により、問題が起こるケースがあります。
たとえばとあるファイルサーバーが管理する2TBの保存領域を持つHDDに対して、1.8TBのデータを保存していたとします。
ここでデータ重複除去を有効化したところ、1.8TBがデータの保存に必要だった記憶領域が半分の0.9TBで済むように。
そしてその後もファイルサーバーの運用を続け、0.9TBだったデータ量は増加して1.4TBに。
この状態で何らかの理由により、データ重複除去機能を無効化・解除したくなった場合、2TBの保存領域では足りず、データ重複除去機能を無効化・解除できず困った!
といった具合です。
データ重複除去機能を無効化・解除したくなるケースはそう多くはないとは思いますが、ぱっと思いつくのは以下のようなパターンでしょうか。
データ重複除去を有効化したボリュームを認識できないOSが稼働する筐体に、ストレージを接続したい!
Windows Server 2012 R2が稼働している筐体に接続していた、データ重複除去を有効化したボリュームを持つストレージを、データ重複除去を有効化したボリュームを認識できないOSが稼働する筐体に接続した場合、当該ボリューム内のデータは認識されません。
これ、当然といえば当然の結果。
ですがこの点について気になったはるるは、念のためマイクロソフトさんに問い合わせをして教えていただいたので、間違いありません。
その時の説明では、Windows Server 2012 R2でデータ重複除去を有効化したボリュームを持つディスクを、Windows Server 2008 R2が稼働する筐体に接続した場合、当該ボリューム内のデータには正常にアクセスすることができません。
こういったケースでは、あらかじめWindows Server 2012 R2で当該ボリュームのデータ重複除去を無効化・解除してから接続する必要があります、とのこと。
データ重複除去ジョブの負荷が問題になる!
データ重複除去を有効化することのデメリットに、それなりにCPU負荷、ディスクI/Oが発生する、という点が挙げられます。
データ重複除去を有効化すると、先に軽くふれたチャンクという単位での重複除去を行うために、定期的に重複除去ジョブが実行されるようになります。
これがそれなりにCPUリソースを使用、さらに頻繁なディスクI/Oを発生させます。
ちなみにこのディスクI/O負荷が原因で、Windows Server 2012、Windows Server 2012 R2では、Windows Server バックアップによるバックアップを取得する際に、volsnap 25というエラーを発生させることがあります。
これについての詳細は、Windows Serverで不定期に発生していたvolsnap 25エラーがなおった!をご覧ください。
本番稼働環境では、このCPU負荷やディスクI/O負荷を理由に、Windows Server 2012、Windows Server 2012 R2を使っていても、データ重複除去を有効化することがためらわれるケースもあるんじゃないかと。
また一度導入してみたけれど、思いの外にCPU負荷やディスクI/O負荷が高かったため、やっぱり無効化しよう!
なんてこともあるでしょう。
データ重複除去機能を解除した場合に必要な記憶領域のサイズを調べる方法
実はこれが今回のお話のメインテーマ。
先に挙げたような理由でデータ重複除去を無効化・解除したい場合、またはサーバー機の入れ替えの際に新しいサーバー機の記憶領域のサイジングを検討するにあたって知りたいのが、重複除去機能を無効化・解除した場合にストレージに必要となる記憶領域のサイズ。
ところがWindows Server 2012、Windows Server 2012 R2では、これがパパっと簡単に分かるようなGUI上の画面やPowerShellコマンドが用意されていないんです。
GUIサーバーであれば、一応『サーバー マネージャー』の『ファイル サービスと記憶域サービス』から『ボリューム』にアクセスすれば、重複除去率や重複除去による節約量が確認可能です。
またPowerShellコマンドを使用する場合は、それぞれ以下のコマンドを実行すれば確認可能です。
1 | Get-DedupVolume |
コマンドの実行結果のSavingsRateが重複除去率のこと。
1 | Get-DedupStatus |
こちらのコマンドの実行結果では、SavedSpaceが重複除去による節約量にあたります。
これらの結果を見るかぎり、Get-DedupVolumeコマンドのSavedSpaceとSavingsRateを使用すれば、データ重複除去機能を解除した場合に追加で必要となる記憶領域のサイズを調べられそうです。
ただ本当にこれで正しいのか自信が持てず。
そこで、マイクロソフトさんに問い合わせて確認したところ、やはりこれでOKだそう。
具体的には、データ重複除去機能を解除した場合に追加で必要となる記憶領域の大まかなサイズは、SavedSpace / (SavingsRate / 100)で求められます。
ここでおおまかなサイズと書いたのは、SavingsRateでは小数部が取得できないため、正確なサイズが計算できず、概算になってしまうため。
実際に計算してみると
試しに以下のようなテスト環境下で、データ重複除去機能を解除した場合に必要な記憶領域のサイズを計算してみることに。
1 2 3 4 5 6 7 | PS C:\Users\Administrator> Get-DedupVolume Enabled UsageType SavedSpace SavingsRate Volume ------- --------- ---------- ----------- ------ True Default 211.29 GB 37 % E: True Default 408.56 GB 45 % F: True Default 809.02 GB 53 % D: |
ここでボリュームD(Dドライブ)のデータ重複除去機能を解除した場合に、追加で必要となる記憶領域のサイズを計算すると、概ね1526.453GBのサイズが必要であることが分かります。
809.02 / (53 ÷ 100) = 1526.453GB
これにすでに使用済みのボリュームDの記憶領域のサイズを加えることで、データ重複除去機能を解除した場合に必要な記憶領域のサイズを調べることが可能です。
ボリュームDのすでに使用済みの記憶領域のサイズをGB単位で取得するには、以下のPowerShellコマンドを使用します。
1 | (Get-PSDrive D).used /1GB |
このコマンドの結果が711.877…であったとします。
この場合、(711.877 + 1526.453) / 1024 ≒ 2.186より、データ重複除去機能を解除した場合に必要な記憶領域のサイズはおよそ2.186TBである、ということが分かります。
ファイルコピーにより、データ重複除去を解除した結果とサイズが違う!?
実は、データ重複除去機能を解除したい場合に必要な記憶領域の大まかなサイズの推定に使えそうな手順は、もう一つあります。
それは別途何らかの記憶領域を用意し、そこに調べたい記憶領域のデータを全部コピーしてみる、というもの。
この方法では、コピー先でデータ重複除去機能が有効化されていない環境である必要があります。
この状態でコピーを実行すれば、コピーの際に重複除去を解除した状態でコピー先に保存されます。
後はコピーが終われば、そのドライブの使用量を調べることで、データ重複除去機能を解除した場合に必要な記憶領域の大まかなサイズを推定可能、というわけ。
ただこの方法は、実はあまりあてにならないんです。
というのもはるるのテスト環境では、先ほどご紹介したGet-DedupVolumeコマンドによる推定とコピーによる推定では、数百GB単位でズレが起きていました。
これについてもマイクロソフトさんに問い合わせて確認したところ、データ重複除去機能を解除しても重複除去に使用していたチャンクが開放されるわけではない。
そのためデータ重複除去機能を解除した後に、後述する『使用しなくなったチャンクを開放する処理』を行わないと、コピーによる推定に近い数字にはなりません、とのこと。
だからデータ重複除去機能を解除・無効化しただけでは、不要になったチャンクが開放されず、一時的にコピーによる推定よりもはるかに多くの記憶領域が必要になるんだとか。
こういった仕様のため、データ重複除去機能を解除・無効化可能なだけの容量が、現在データ重複除去機能が有効状態の記憶領域に存在するかを調べる場合、コピーによる推定は不適。
そしてGet-DedupVolumeコマンドによる推定を使用すべき、というわけ。
不要になったチャンクを開放する方法
これは以前のエントリー、Windows Serverで不定期に発生していたvolsnap 25エラーがなおった!でもご紹介している、フルGCを手動実行することで行います。
重複除去のフルGCをDドライブに対して行う場合、以下のコマンドを実行します。
1 | Start-DedupJob D:\ -Type GarbageCollection -Full |
データ重複除去の無効化・解除を行う方法
最後にデータ重複除去の無効化・解除を行う方法についても、ポイントがあるので併せてご紹介します。
GUIサーバーを利用している場合、データ重複除去の無効化・解除は『サーバー マネージャー』から実行できるかのように感じられます。
具体的には、『サーバー マネージャー』の『ファイル サービスと記憶域サービス』から『ボリューム』に遷移、データ重複除去を無効化・解除したいボリュームで右クリック、『データ重複除去の構成』を選択。
表示された重複除去設定画面で『無効』を選択すれば、無効化されそうです。
ですがこの設定だけでは、データ重複除去の無効化・解除は行われません。
マイクロソフトさんによると、当該設定ではデータ重複除去のジョブが実行されなくなるだけであり、すでに重複除去された記憶領域のデータ重複除去状態が解除(非最適化)されるわけではない。
すでに重複除去された記憶領域のデータ重複除去状態を解除(非最適化)するには、以下のPowerShellコマンドを実行するように、とのこと。
1 | Start-DedupJob <volume> -type Unoptimization |
そのためボリュームDのデータ重複除去状態を解除するには、以下のPowerShellコマンドを実行する必要があります。
1 | Start-DedupJob D:\ -type Unoptimization |
このコマンドの実行にかかる時間は、負荷状況やボリュームのサイズ、重複除去されたデータ量に影響され、環境によって大きく異なります。
ただ処理中はかなりのCPU負荷とディスクI/O負荷がかかるので、それなりに時間がかかると思っておいた方が良いでしょう。
データ重複除去は負荷がかかるが、その効果は絶大!
すでに書いたとおり、Windows Server 2012、Windows Server 2012 R2の重複除去機能は、最適化中にCPU負荷とディスクI/O負荷がかかるというデメリットがあります。
その反面、ディスク使用量を節約したい状況下では、非常に有効な機能であることもまた事実。
そのため多少の負荷は許容してでも、ディスクの使用量を節約したい!
ということであれば、使用を検討されてみると良いのではないかと。