Amazon FSx for NetApp ONTAPのストレージキャパシティ以上のサイズのボリュームを作成すると使用量が大きく見える件

注意点を理解した上でLogical Space Reportingを有効化しよう
2022.09.26

君なんだか使用量おかしくない?

こんにちは、のんピ(@non____97)です。

まずはこれを見てください。

$ df -ht nfs4
Filesystem                                                                   Size  Used Avail Use% Mounted on
svm-0e896ca62e3b55b5f.fs-0c6a3b2f825a9c21b.fsx.us-east-1.amazonaws.com:/nfs  2.0T  1.1T  844G  57% /mnt/fsx

これは以下記事でAmazon FSx for NetApp ONTAP(以降FSx for ONTAP)のボリュームを作成をNFSでEC2インスタンスにマウントした時のdfコマンドの実行結果です。

こちらの記事をご覧になった方は気づくと思います。

「何も書き込んでいないのにUsedが1.1TBだ」

こちらはFSx for ONTAPファイルシステムに設定したストレージキャパシティ以上のサイズのボリュームを作成した際に発生しました。

もしかしたら、こちらが影響しているかも知れませんね。

実際は1.1TBも使っていないのに1.1TB消費していると判断されると、どの程度書き込んで良いか判断が付かず困りますね。

今回はこちらの事象について色々検証してみたので、紹介します。

いきなりまとめ

  • デフォルトではクライアントから確認できるボリュームの空き容量はプライマリストレージの空き容量
    • キャパシティプールストレージを含むボリュームの論理的な空き容量ではない
  • プライマリストレージとキャパシティプールストレージの使用量を加味した空き容量、使用量を表示するには、Logical Space Reportingを有効化する必要がある
  • Logical Space Reportingを有効化すると、Storage Efficiencyによって圧縮、重複排除されたサイズを無視して表示されるので注意が必要
    • 10GBのデータを圧縮して物理的には1GBしか使用していないくても、クライアントからは10GB使用したように見えるようになる
  • Logical Space Reportingを有効化すると、空き容量が論理的なサイズになるため、空きがあるからといって大量に書き込みをすると、プライマリストレージの空き容量不足になる可能性がある
    • プライマリストレージの空き容量は常に気を配る必要がある

検証環境

検証環境は以下の通りです。

構成図

ボリュームのサイズを変更すると、NFSのクライアントのEC2インスタンスからは使用量や空き容量がどのように表示されるのか確認していきます。

リソースは全てAWS CDKでデプロイします。リポジトリはこちらです。

現在の使用量を確認する

それでは、現在の使用量を確認します。

$ df -ht nfs4
Filesystem                                                                      Size  Used Avail Use% Mounted on
svm-0ff2a18a60db90a67.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com:/volume   95G  256K   95G   1% /mnt/fsx

$ ls -la /mnt/fsx
total 4
drwxr-xr-x 2 nobody nobody 4096 Sep 26 06:17 .
drwxr-xr-x 3 root   root     17 Sep 26 06:17 ..

$ ls -la /mnt/fsx/.snapshot
total 8
drwxrwxrwx 2 nobody nobody 4096 Sep 26 06:17 .
drwxr-xr-x 2 nobody nobody 4096 Sep 26 06:17 ..

何も書き込んでいないので、256KBでした。

試しに10GB程度のファイルを書き込んでみて、その後の使用量を確認してみましょう。

$ sudo dd if=/dev/urandom of=/mnt/fsx/testfile_1 bs=1M count=10240
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB) copied, 81.4856 s, 132 MB/s

$ df -ht nfs4
Filesystem                                                                      Size  Used Avail Use% Mounted on
svm-0ff2a18a60db90a67.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com:/volume   95G   11G   85G  11% /mnt/fsx

$ ls -la /mnt/fsx
total 10527056
drwxr-xr-x 2 nobody nobody        4096 Sep 26 06:22 .
drwxr-xr-x 3 root   root            17 Sep 26 06:17 ..
-rw-r--r-- 1 nobody nobody 10737418240 Sep 26 06:23 testfile_1

11GB書き込んだので、使用量(Used)は11GBになっていますね。

FSx for ONTAPファイルシステムにSSHで接続して、ONTAP CLIからも確認してみます。

$ ssh fsxadmin@management.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com
The authenticity of host 'management.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com (10.0.1.47)' can't be established.
ECDSA key fingerprint is SHA256:2cpT8Wh7c5HRqVJqUJpspsY1Tn+XS255D3NHUwe3hcQ.
ECDSA key fingerprint is MD5:de:4b:79:7d:e4:1b:91:e7:96:c5:07:3f:5d:70:d4:e9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'management.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com,10.0.1.47' (ECDSA) to the list of known hosts.
Password:

This is your first recorded login.
FsxId0c1219addee1f505e::> volume show -volume fsx_for_ontap_volume
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
fsx-for-ontap-svm
          fsx_for_ontap_volume
                       aggr1        online     RW        100GB    84.86GB   10%

100GBの10%使用されたと記載されているので、こちらも10GB使用していると認識されていますね。

なお、階層化ポリシーはAUTOでボリュームを作成したので、全てプライマリストレージに書き込まれています。

FsxId0c1219addee1f505e::> volume show-footprint -volume fsx_for_ontap_volume

      Vserver : fsx-for-ontap-svm
      Volume  : fsx_for_ontap_volume

      Feature                                          Used    Used%
      --------------------------------           ----------    -----
      Volume Data Footprint                         10.14GB       1%
             Footprint in Performance Tier
                                                    10.15GB     100%
             Footprint in FSxFabricpoolObjectStore
                                                         0B       0%
      Volume Guarantee                                   0B       0%
      Flexible Volume Metadata                      107.5MB       0%
      Delayed Frees                                  8.25MB       0%

      Total Footprint                               10.25GB       1%

ボリュームサイズを5TBに変えた時の使用量を確認してみる

次にボリュームサイズを100GBから5TBに変更してみて、その時の使用量を確認してみます。

ボリュームサイズの変更もAWS CDKから行います。

./lib/fsx-for-ontap-stack.ts

// FSX for ONTAP volume
const volumeName = "fsx_for_ontap_volume";
const junctionPath = "/volume";
new fsx.CfnVolume(this, "Volume", {
  name: volumeName,
  ontapConfiguration: {
    junctionPath,
    sizeInMegabytes: "5242880",
    storageEfficiencyEnabled: "true",
    storageVirtualMachineId: svm.ref,
    securityStyle: "UNIX",
    tieringPolicy: {
      coolingPeriod: 31,
      name: "AUTO",
    },
  },
  tags: [
    {
      key: "Name",
      value: volumeName,
    },
  ],
  volumeType: "ONTAP",
});

デプロイ後、EC2インスタンスからdfコマンドを叩いて、ボリュームの使用量を確認してみます。

$ df -ht nfs4
Filesystem                                                                      Size  Used Avail Use% Mounted on
svm-0ff2a18a60db90a67.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com:/volume  4.8T  4.0T  851G  83% /mnt/fsx

$ du -sh /mnt/fsx
11G     /mnt/fsx

使用量が4.0TBになってしまいました。なお、マウントポイント配下の使用量は変わらず11GBです。

これは謎ですね。

ONTAP CLIから確認すると、以下のようにUsedが80%みたいなことにはなっていませんでした。

FsxId0c1219addee1f505e::> volume show -volume fsx_for_ontap_volume
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
fsx-for-ontap-svm
          fsx_for_ontap_volume
                       aggr1        online     RW          5TB    850.5GB    0%

FsxId0c1219addee1f505e::> volume show-footprint -volume fsx_for_ontap_volume

      Vserver : fsx-for-ontap-svm
      Volume  : fsx_for_ontap_volume

      Feature                                          Used    Used%
      --------------------------------           ----------    -----
      Volume Data Footprint                         10.14GB       1%
             Footprint in Performance Tier
                                                    10.15GB     100%
             Footprint in FSxFabricpoolObjectStore
                                                         0B       0%
      Volume Guarantee                                   0B       0%
      Flexible Volume Metadata                      107.5MB       0%
      Delayed Frees                                  8.56MB       0%

      Total Footprint                               10.25GB       1%

再度10GB程度のファイルを書き込んでみて使用量の推移を確認してみます。

$ sudo dd if=/dev/urandom of=/mnt/fsx/testfile_2 bs=1M count=10240
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB) copied, 81.3091 s, 132 MB/s

$ df -ht nfs4
Filesystem                                                                      Size  Used Avail Use% Mounted on
svm-0ff2a18a60db90a67.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com:/volume  4.8T  4.0T  841G  83% /mnt/fsx

$ du -sh /mnt/fsx
21G     /mnt/fsx

書き込んだ分、空き容量(Avail)が851GBから841GBに減りました。

ボリュームサイズを2TBに変えた時の使用量を確認してみる

もう少し試してみましょう5TBのボリュームを2TBに減らしてみます。

./lib/fsx-for-ontap-stack.ts

// FSX for ONTAP volume
const volumeName = "fsx_for_ontap_volume";
const junctionPath = "/volume";
new fsx.CfnVolume(this, "Volume", {
  name: volumeName,
  ontapConfiguration: {
    junctionPath,
    sizeInMegabytes: "2097152",
    storageEfficiencyEnabled: "true",
    storageVirtualMachineId: svm.ref,
    securityStyle: "UNIX",
    tieringPolicy: {
      coolingPeriod: 31,
      name: "AUTO",
    },
  },
  tags: [
    {
      key: "Name",
      value: volumeName,
    },
  ],
  volumeType: "ONTAP",
});

デプロイ後、EC2インスタンスからdfコマンドを叩いて、ボリュームの使用量を確認してみます。

$ df -ht nfs4
Filesystem                                                                      Size  Used Avail Use% Mounted on
svm-0ff2a18a60db90a67.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com:/volume  2.0T  1.1T  841G  57% /mnt/fsx

$ du -sh /mnt/fsx
21G     /mnt/fsx

使用量が4.0から1.1TBに変わりましたね。

ONTAP CLIから確認すると、使用量は特に変わりありませんでした。

FsxId0c1219addee1f505e::> volume show -volume fsx_for_ontap_volume
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
fsx-for-ontap-svm
          fsx_for_ontap_volume
                       aggr1        online     RW          2TB    840.2GB    1%

FsxId0c1219addee1f505e::> volume show-footprint -volume fsx_for_ontap_volume

      Vserver : fsx-for-ontap-svm
      Volume  : fsx_for_ontap_volume

      Feature                                          Used    Used%
      --------------------------------           ----------    -----
      Volume Data Footprint                         20.28GB       2%
             Footprint in Performance Tier
                                                    20.30GB     100%
             Footprint in FSxFabricpoolObjectStore
                                                         0B       0%
      Volume Guarantee                                   0B       0%
      Flexible Volume Metadata                      214.9MB       0%
      Delayed Frees                                 16.28MB       0%

      Total Footprint                               20.51GB       2%

ボリュームの階層化ポリシーをALLに変えた時の使用量を確認してみる

ボリュームの階層化ポリシーをALLに変えて、データをキャパシティプールに移動させた時の使用量を確認してみましょう。

AWS CDKから階層化ポリシーをAUTOからALLに変更します。

./lib/fsx-for-ontap-stack.ts

// FSX for ONTAP volume
const volumeName = "fsx_for_ontap_volume";
const junctionPath = "/volume";
new fsx.CfnVolume(this, "Volume", {
  name: volumeName,
  ontapConfiguration: {
    junctionPath,
    sizeInMegabytes: "2097152",
    storageEfficiencyEnabled: "true",
    storageVirtualMachineId: svm.ref,
    securityStyle: "UNIX",
    tieringPolicy: {
      name: "ALL",
    },
  },
  tags: [
    {
      key: "Name",
      value: volumeName,
    },
  ],
  volumeType: "ONTAP",
});

デプロイ後、EC2インスタンスからdfコマンドを叩いて、ボリュームの使用量を確認してみます。

$ df -ht nfs4
Filesystem                                                                      Size  Used Avail Use% Mounted on
svm-0ff2a18a60db90a67.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com:/volume  2.0T  1.1T  861G  56% /mnt/fsx

$ du -sh /mnt/fsx
21G     /mnt/fsx

空き容量(Avail)が841GBから861GBに減りました。

ONTAP CLIから確認すると、以下のように20GBがキャパシティプールストレージに移動されています。

FsxId0c1219addee1f505e::> volume show -volume fsx_for_ontap_volume
Vserver   Volume       Aggregate    State      Type       Size  Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
fsx-for-ontap-svm
          fsx_for_ontap_volume
                       aggr1        online     RW          2TB    860.1GB    1%

FsxId0c1219addee1f505e::> volume show-footprint -volume fsx_for_ontap_volume

      Vserver : fsx-for-ontap-svm
      Volume  : fsx_for_ontap_volume

      Feature                                          Used    Used%
      --------------------------------           ----------    -----
      Volume Data Footprint                         20.28GB       2%
             Footprint in Performance Tier
                                                    317.4MB       2%
             Footprint in FSxFabricpoolObjectStore
                                                       20GB      98%
      Volume Guarantee                                   0B       0%
      Flexible Volume Metadata                      214.9MB       0%
      Delayed Frees                                 27.27MB       0%

      Total Footprint                               20.52GB       2%

以上のことからクライアントから認識できる空き容量はプライマリストレージの空き容量のようですね。使用量(Used)はプライマリストレージの空き容量(Avail)になるようには計算されていそうです。

論理スペースを表示するよう設定変更する

プライマリストレージの空き容量が見えるのはそれはそれで便利ですが、実際にそのボリュームにどの程度書き込んだのかが分からないのは不便です。

プライマリストレージとキャパシティプールストレージの合算した空き容量、使用量がクライアントからも認識されるようにしたいです。

キャパシティプールストレージにプライマリストレージの空き容量以上のデータを書き込もうとする場合は、OS、コマンド、ツールによっては空き容量不足で書き込めませんと表示する可能性があります。

そのような場合は、Logical Space Reportingを有効化します。

Logical Space Reportingを有効にすると、LinuxとWindowsクライアントから論理的な使用量と空き容量を確認することができます。

When you enable logical space reporting on a volume, your system can display the amount of logical used and available space in addition to the total space in a volume. In addition, users on Linux and Windows client systems can see logical used and available space instead of physical used and physical available space.

What logical space reporting shows

Logical Space Reportingはデフォルトでは無効化されています。

FsxId0c1219addee1f505e::> volume show -volume fsx_for_ontap_volume -fields is-space-reporting-logical, is-space-enforcement-logical
vserver           volume               is-space-reporting-logical
----------------- -------------------- --------------------------
fsx-for-ontap-svm fsx_for_ontap_volume false

それでは、Logical Space Reportingを有効化してみます。

FsxId0c1219addee1f505e::> volume modify -volume fsx_for_ontap_volume -is-space-reporting-logical true
Volume modify successful on volume fsx_for_ontap_volume of Vserver fsx-for-ontap-svm.

FsxId0c1219addee1f505e::> volume show -volume fsx_for_ontap_volume -fields is-space-reporting-logical, is-space-enforcement-logical
vserver           volume               is-space-reporting-logical
----------------- -------------------- --------------------------
fsx-for-ontap-svm fsx_for_ontap_volume true

この状態でEC2インスタンスからdfコマンドを叩いてみます。

$ df -ht nfs4
Filesystem                                                                      Size  Used Avail Use% Mounted on
svm-0ff2a18a60db90a67.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com:/volume  2.0T   21G  1.9T   2% /mnt/fsx

使用量(Used)が21GBで、空き容量(Avail)が1.9TBになりましたね。論理的なサイズが表示されるようになりました。

なお、Logical Space Reportingを有効化すると、論理的な使用量を表示するようになるので重複排除や圧縮されたデータサイズを無視して表示されるようになります。

試しに10GBのゼロデータのバイナリファイルを書き込んでみます。

$ sudo dd if=/dev/zero of=/mnt/fsx/zero_block_file bs=1M count=10240
10240+0 records in
10240+0 records out

$ df -ht nfs4
Filesystem                                                                      Size  Used Avail Use% Mounted on
svm-0ff2a18a60db90a67.fs-0c1219addee1f505e.fsx.us-east-1.amazonaws.com:/volume  2.0T   31G  1.9T   2% /mnt/fsx

10GB書き込んだので、使用量(Used)が21GBから31GBに増えていますね。

ただ、ONTAP CLIから重複排除されたデータサイズを確認すると、確かに10GB削減されたことが分かります。

FsxId0c1219addee1f505e::> volume show -volume fsx_for_ontap_volume -fields total, used, available, percent-used, sis-space-saved, sis-space-saved-percent, dedupe-space-saved, dedupe-space-saved-percent, dedupe-space-shared, compression-space-saved, compression-space-saved-percent
vserver           volume               available total  used    percent-used sis-space-saved sis-space-saved-percent dedupe-space-saved dedupe-space-saved-percent dedupe-space-shared compression-space-saved compression-space-saved-percent
----------------- -------------------- --------- ------ ------- ------------ --------------- ----------------------- ------------------ -------------------------- ------------------- ----------------------- -------------------------------
fsx-for-ontap-svm fsx_for_ontap_volume 860.0GB   1.90TB 20.32GB 1%           10GB            33%                     10GB               33%                        0B              0B                      0%

そのため、Logical Space Reportingを有効化すると、クライアントから物理的な空き容量が分からなくなるので注意が必要です。

注意点を理解した上でLogical Space Reportingを有効化しよう

Amazon FSx for NetApp ONTAPのストレージキャパシティ以上のサイズのボリュームを作成すると、実際の使用量よりも大きく見えてしまう事象を紹介しました。

Logical Space Reportingを有効化することで、プライマリストレージとキャパシティプールストレージの使用量を加味した空き容量、使用量を表示するようになります。

ただし、有効化する際は以下のポイントに注意したいですね。

  • Storage Efficiencyによって圧縮、重複排除されたサイズを無視して表示されるようになる
  • プライマリストレージの空き容量がわからなくなるので、空きがあるからといって大量に書き込みをすると、プライマリストレージの空き容量不足になる可能性がある
    • プライマリストレージの空き容量は常に気を配る必要がある

ちなみにLogical Space ReportingはSVM単位で有効化することも可能です。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!