Amazon FSx for NetApp ONTAPやAmazon EFS上のファイルにアクセスしただけでatimeが更新されるか確認してみた

Amazon FSx for NetApp ONTAPやAmazon EFS上のファイルにアクセスしただけでatimeが更新されるか確認してみた

FSxNならSMB経由でファイルにアクセスした際にatimeを更新できる
Clock Icon2024.08.16

AWSマネージドサービスでもファイルにアクセスしただけでatimeが更新されるのか

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

皆さんはAWSマネージドサービスでもファイルにアクセスしただけでatimeが更新されるのか気になったことはありますか? 私はあります。

世の中にはファイルの最終アクセス日時(atime)をベースに分析や整理を行う製品があります。昨日の例としては、atimeが1年以上経過しているファイルはアーカイブストレージに移動するなどです。

ふと、AWSのマネージドサービスでもファイルにアクセスしただけでatimeが更新されるのかどうか気になりました。

以下で紹介されているとおり、WindowsではNtfsDisableLastAccessUpdateというレジストリの値によってatimeの更新有無が変わります。

https://answers.microsoft.com/ja-jp/windows/forum/windows_10-performance/windows-10/ec6995c7-d9e3-4564-9be8-ec07fe04bffc

デフォルトではatimeの更新は無効になっているようですね。それではレジストリを変更できないAmazon FSx for Windows File Server(以降FSxW)ではどうなのでしょうか。

せっかくなので、EFSとAmazon FSx for NetApp ONTAP(以降FSxN)と併せて確認してみました。

なお、atimeの更新を無効にすることによってディスクIOが削減し、パフォーマンスが向上するとされています。Microsoft公式ドキュメントにはログ更新の影響が軽減されると紹介されていました。

disablelastaccess パラメーターを使用すると、ファイルおよびディレクトリの最終アクセス時刻スタンプへのログ更新の影響が軽減されます。 最終アクセス時刻機能を無効にすると、ファイルとディレクトリへのアクセス速度が向上します。 このパラメーターは、HKLM\SYSTEM\CurrentControlSet\Control\FileSystem\NtfsDisableLastAccessUpdate レジストリ キーを更新します。

注:

  • ディスク上の値がすべては最新でない場合でも、ファイルベースの最終アクセス時刻のクエリは正確です。 正確な値はメモリに格納されるので、NTFS はクエリの正しい値を返します。
  • 1 時間は、NTFS がディスク上の最終アクセス時刻の更新を延期できる最長時間です。 NTFS が最終変更時刻などの他のファイル属性を更新し、最終アクセス時刻の更新が保留になっている場合、NTFS は、パフォーマンスに影響を与えることなく、他の更新で最終アクセス時刻を更新します。
  • disablelastaccess パラメータは、この機能に依存するバックアップやリモート ストレージなどのプログラムに影響を与える可能性があります。

fsutil behavior | Microsoft Learn

いきなりまとめ

  • EFS
    • relatime、strictatimeのいずれのオプションもアクセスしただけではatimeは更新されない
    • relatime、strictatimeのいずれのオプションも追記をして、約1分後にatimeが更新される
  • FSxW
    • アクセスしてもatimeは更新されない
    • 追記をしてもatimeは更新されない
  • FSxN
    • ボリュームのデフォルトでatime-updateが有効
    • EFS
      • relatime、strictatimeのいずれのオプションもアクセスしただけではatimeは更新されない
      • strictatimeは追記をした場合もatimeは更新されない
    • SMB
      • アクセスをすると約10秒後にatimeが更新される

EFSの場合

relatimeでマウントした場合

まず、EFSから確認します。

適当にEFSとAmazon Linux 2023のEC2インスタンスを用意し、NFSでマウントします。

$ uname -r
6.1.55-75.123.amzn2023.x86_64

$ sudo mount fs-0e211df86678573e6.efs.us-east-1.amazonaws.com:/ /mnt/efs
$ mount | grep /mnt/efs
fs-0e211df86678573e6.efs.us-east-1.amazonaws.com:/ on /mnt/efs type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.31.81.82,local_lock=none,addr=172.31.92.184)

relatimeでマウントされていますね。

mountのマニュアルからrelatimeの詳細を確認しましょう。

$ man mount

MOUNT(8)                                                                                          System Administration                                                                                         MOUNT(8)

NAME
       mount - mount a filesystem

SYNOPSIS
       mount [-h|-V]

       mount [-l] [-t fstype]

       mount -a [-fFnrsvw] [-t fstype] [-O optlist]

       mount [-fnrsvw] [-o options] device|mountpoint

       mount [-fnrsvw] [-t fstype] [-o options] device mountpoint

       mount --bind|--rbind|--move olddir newdir

       mount --make-[shared|slave|private|unbindable|rshared|rslave|rprivate|runbindable] mountpoint

DESCRIPTION
.
.
(中略)
.
.
      relatime
           Update inode access times relative to modify or change time. Access time is only updated if the previous access time was earlier than the current modify or change time. (Similar to noatime, but it doesn’t
           break mutt(1) or other applications that need to know if a file has been read since the last time it was modified.)

           Since Linux 2.6.30, the kernel defaults to the behavior provided by this option (unless noatime was specified), and the strictatime option is required to obtain traditional semantics. In addition, since
           Linux 2.6.30, the file’s last access time is always updated if it is more than 1 day old.

       norelatime
           Do not use the relatime feature. See also the strictatime mount option.

       strictatime
           Allows to explicitly request full atime updates. This makes it possible for the kernel to default to relatime or noatime but still allow userspace to override it. For more details about the default system
           mount options see /proc/mounts.

       nostrictatime
           Use the kernel’s default behavior for inode access time updates.

要するに以下です。

  • 前回のアクセス時間(atime)が現在の更新時間(mtime)や変更時間(ctime)よりも古い場合のみ、アクセス時間を更新する
  • Linux 2.6.30以降、ファイルの最終アクセス時間が1日以上経過している場合は常に更新される
  • Linux 2.6.30以降、カーネルはデフォルトでこのオプションが動作
  • relatimeはnoatimeほどではないが、strictatimeよりもディスクI/Oを削減できる

実際にアクセスしてもatimeが更新されないことを確認しましょう。

適当にファイルを作成し、catでアクセスします。

$ sudo touch /mnt/efs/test
$ stat /mnt/efs/test
  File: /mnt/efs/test
  Size: 0               Blocks: 8          IO Block: 1048576 regular empty file
Device: 31h/49d Inode: 6908783714939271760  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-08-15 08:56:39.923000000 +0000
Modify: 2024-08-15 08:56:39.923000000 +0000
Change: 2024-08-15 08:56:39.923000000 +0000
 Birth: -

$ cat /mnt/efs/test
$ stat /mnt/efs/test
  File: /mnt/efs/test
  Size: 0               Blocks: 0          IO Block: 1048576 regular empty file
Device: 31h/49d Inode: 6908783714939271760  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-08-15 08:56:39.923000000 +0000
Modify: 2024-08-15 08:56:39.923000000 +0000
Change: 2024-08-15 08:56:39.923000000 +0000
 Birth: -

atimeは更新されていませんね。1分ほど待ちましたが、特に変わりませんでした。

追記をした場合はatimeが更新されることを確認します。

$ echo test | sudo tee -a /mnt/efs/test > /dev/null
$ stat /mnt/efs/test
  File: /mnt/efs/test
  Size: 5               Blocks: 8          IO Block: 1048576 regular file
Device: 31h/49d Inode: 6908783714939271760  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-08-15 08:56:39.923000000 +0000
Modify: 2024-08-15 08:59:08.617000000 +0000
Change: 2024-08-15 08:59:08.617000000 +0000
 Birth: -

# 数分後
$ stat /mnt/efs/test
  File: /mnt/efs/test
  Size: 5               Blocks: 8          IO Block: 1048576 regular file
Device: 31h/49d Inode: 6908783714939271760  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-08-15 08:59:08.617000000 +0000
Modify: 2024-08-15 08:59:08.617000000 +0000
Change: 2024-08-15 08:59:08.617000000 +0000
 Birth: -

数分後にatimeが更新され、ctimeとmtimeと同じ時刻になりました。

atimeが更新される具体的なタイミングをチェックしましょう。ファイル追記後1秒間隔でatimeの更新有無をチェックします。

$ echo test2 | sudo tee -a /mnt/efs/test > /dev/null
$ while true; do
  echo "======================================================"
  date
  stat /mnt/efs/test | grep "2024-08-15"
  sleep 1
done
======================================================
Thu Aug 15 09:04:17 UTC 2024
Access: 2024-08-15 08:59:08.617000000 +0000
Modify: 2024-08-15 09:04:17.875000000 +0000
Change: 2024-08-15 09:04:17.875000000 +0000
======================================================
Thu Aug 15 09:04:18 UTC 2024
Access: 2024-08-15 08:59:08.617000000 +0000
Modify: 2024-08-15 09:04:17.875000000 +0000
Change: 2024-08-15 09:04:17.875000000 +0000
======================================================
Thu Aug 15 09:04:19 UTC 2024
Access: 2024-08-15 08:59:08.617000000 +0000
Modify: 2024-08-15 09:04:17.875000000 +0000
Change: 2024-08-15 09:04:17.875000000 +0000
.
.
(中略)
.
.
======================================================
Thu Aug 15 09:05:16 UTC 2024
Access: 2024-08-15 08:59:08.617000000 +0000
Modify: 2024-08-15 09:04:17.875000000 +0000
Change: 2024-08-15 09:04:17.875000000 +0000
======================================================
Thu Aug 15 09:05:17 UTC 2024
Access: 2024-08-15 08:59:08.617000000 +0000
Modify: 2024-08-15 09:04:17.875000000 +0000
Change: 2024-08-15 09:04:17.875000000 +0000
======================================================
Thu Aug 15 09:05:18 UTC 2024
Access: 2024-08-15 09:04:17.875000000 +0000
Modify: 2024-08-15 09:04:17.875000000 +0000
Change: 2024-08-15 09:04:17.875000000 +0000
======================================================
Thu Aug 15 09:05:19 UTC 2024
Access: 2024-08-15 09:04:17.875000000 +0000
Modify: 2024-08-15 09:04:17.875000000 +0000
Change: 2024-08-15 09:04:17.875000000 +0000

おおよそ1分でatimeが更新されました。

strictatimeでマウントした場合

次にstrictatimeでマウントした場合を確認します。

strictatimeでマウントします。

$ sudo mkdir -p /mnt/efs2
$ sudo mount fs-0e211df86678573e6.efs.us-east-1.amazonaws.com:/ /mnt/efs2 -o strictatime
$ mount | grep /mnt/efs
fs-0e211df86678573e6.efs.us-east-1.amazonaws.com:/ on /mnt/efs type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.31.81.82,local_lock=none,addr=172.31.92.184)
fs-0e211df86678573e6.efs.us-east-1.amazonaws.com:/ on /mnt/efs2 type nfs4 (rw,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.31.81.82,local_lock=none,addr=172.31.92.184)

適当にファイルを作成し、catでアクセスします。

$ sudo touch /mnt/efs2/test2
$ stat /mnt/efs2/test2
  File: /mnt/efs2/test2
  Size: 0               Blocks: 8          IO Block: 1048576 regular empty file
Device: 31h/49d Inode: 1090044723387877415  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-08-15 09:13:27.994000000 +0000
Modify: 2024-08-15 09:13:27.994000000 +0000
Change: 2024-08-15 09:13:27.994000000 +0000
 Birth: -

# 10分後
$ cat /mnt/efs2/test2
$ stat /mnt/efs2/test2
  File: /mnt/efs2/test2
  Size: 0               Blocks: 0          IO Block: 1048576 regular empty file
Device: 31h/49d Inode: 1090044723387877415  Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-08-15 09:13:27.994000000 +0000
Modify: 2024-08-15 09:13:27.994000000 +0000
Change: 2024-08-15 09:13:27.994000000 +0000
 Birth: -

特に変わりません。EFSの場合はstrictatimeでも読み込みしただけではatimeを更新してくれないようです。

ちなみに追記後の場合は、relatimeと同様に追記して1分後にatimeが更新されました。

FSxWの場合

FSxWの場合も検証しましょう。

まず、Amazon FSx CLIでFSxWファイルシステムにて、atime更新に関するコマンドレットがないことを確認します。

> enter-pssession -ComputerName amznfsxufc2edpv.corp.non-97.net -ConfigurationName FsxRemoteAdmin
[amznfsxufc2edpv.corp.non-97.net]: PS>Get-Command

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Block-FSxSmbShareAccess                            1.0        FSxRemoteAdmin
Function        Clear-Host
Function        Close-FSxSmbOpenFile                               1.0        FSxRemoteAdmin
Function        Close-FSxSmbSession                                1.0        FSxRemoteAdmin
Function        Disable-FSxDedup                                   1.0        FSxRemoteAdmin
Function        Disable-FSxUserQuotas                              1.0        FSxRemoteAdmin
Function        Enable-FSxDedup                                    1.0        FSxRemoteAdmin
Function        Enable-FSxUserQuotas                               1.0        FSxRemoteAdmin
Function        Exit-PSSession
Function        Get-Command
Function        Get-FormatData
Function        Get-FSxDedupConfiguration                          1.0        FSxRemoteAdmin
Function        Get-FSxDedupJob                                    1.0        FSxRemoteAdmin
Function        Get-FSxDedupMetadata                               1.0        FSxRemoteAdmin
Function        Get-FSxDedupSchedule                               1.0        FSxRemoteAdmin
Function        Get-FSxDedupStatus                                 1.0        FSxRemoteAdmin
Function        Get-FSxShadowCopies                                1.0        FSxRemoteAdmin
Function        Get-FSxShadowCopySchedule                          1.0        FSxRemoteAdmin
Function        Get-FSxShadowStorage                               1.0        FSxRemoteAdmin
Function        Get-FSxSmbOpenFile                                 1.0        FSxRemoteAdmin
Function        Get-FSxSmbServerConfiguration                      1.0        FSxRemoteAdmin
Function        Get-FSxSmbSession                                  1.0        FSxRemoteAdmin
Function        Get-FSxSmbShare                                    1.0        FSxRemoteAdmin
Function        Get-FSxSmbShareAccess                              1.0        FSxRemoteAdmin
Function        Get-FSxUserQuotaEntries                            1.0        FSxRemoteAdmin
Function        Get-FSxUserQuotaSettings                           1.0        FSxRemoteAdmin
Function        Get-Help
Function        Grant-FSxSmbShareAccess                            1.0        FSxRemoteAdmin
Function        Measure-FSxDedupFileMetadata                       1.0        FSxRemoteAdmin
Function        Measure-Object
Function        New-FSxDedupSchedule                               1.0        FSxRemoteAdmin
Function        New-FSxShadowCopy                                  1.0        FSxRemoteAdmin
Function        New-FSxSmbShare                                    1.0        FSxRemoteAdmin
Function        Out-Default
Function        Remove-FSxDedupSchedule                            1.0        FSxRemoteAdmin
Function        Remove-FSxShadowCopies                             1.0        FSxRemoteAdmin
Function        Remove-FSxShadowCopySchedule                       1.0        FSxRemoteAdmin
Function        Remove-FSxShadowStorage                            1.0        FSxRemoteAdmin
Function        Remove-FSxSmbShare                                 1.0        FSxRemoteAdmin
Function        Revoke-FSxSmbShareAccess                           1.0        FSxRemoteAdmin
Function        Select-Object
Function        Set-FSxDedupConfiguration                          1.0        FSxRemoteAdmin
Function        Set-FSxDedupSchedule                               1.0        FSxRemoteAdmin
Function        Set-FSxShadowCopySchedule                          1.0        FSxRemoteAdmin
Function        Set-FSxShadowStorage                               1.0        FSxRemoteAdmin
Function        Set-FSxSmbServerConfiguration                      1.0        FSxRemoteAdmin
Function        Set-FSxSmbShare                                    1.0        FSxRemoteAdmin
Function        Set-FSxUserQuotas                                  1.0        FSxRemoteAdmin
Function        Stop-FSxDedupJob                                   1.0        FSxRemoteAdmin
Function        Unblock-FSxSmbShareAccess                          1.0        FSxRemoteAdmin
Function        Update-FSxDedupStatus                              1.0        FSxRemoteAdmin

ちなみに、クライアントであるWindows Server 2022ではDisableLastAccessは無効化されています。元のレジストリ名NtfsDisableLastAccessUpdateとNTFSファイルシステムに効果があるものであり、マウント先のSMBサーバーには効力は無いと思いますが、念の為確認しました。

> systeminfo | findstr /B /C:"OS Name" /B /C:"OS Version"
OS Name:                   Microsoft Windows Server 2022 Datacenter
OS Version:                10.0.20348 N/A Build 20348

> FsUtil behavior query disablelastaccess
DisableLastAccess = 3  (System Managed, Last Access Time Updates DISABLED)

SMBでファイル共有をマウントし、適当にファイルを作成します。

> New-PSDrive -Name "Z" -PSProvider FileSystem -Root "\\amznfsxvythbz6q.corp.non-97.net\share" -Persist

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
Z                   0.09         31.91 FileSystem    \\amznfsxvythbz6q.corp.non-97.ne...

> echo test > Z:\test.txt

> Get-ItemProperty -Path "Z:\\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List

LastAccessTime : 8/16/2024 5:30:57 AM
CreationTime   : 8/16/2024 5:30:57 AM
LastWriteTime  : 8/16/2024 5:30:57 AM

10分ほど待ってファイルを読み込みます。

> cat "Z:\\test.txt"
> Get-ItemProperty -Path "Z:\\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List

LastAccessTime : 8/16/2024 5:30:57 AM
CreationTime   : 8/16/2024 5:30:57 AM
LastWriteTime  : 8/16/2024 5:30:57 AM

特にatimeは変わりませんね。

書き込み後のatimeを確認します。

> echo test2 >> Z:\test.txt

# 10分後
> date | Out-String -Stream | ?{$_ -ne ""}
Friday, August 16, 2024 5:50:19 AM

> Get-ItemProperty -Path "Z:\\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List | 
    Out-String -Stream | ?{$_ -ne ""}
LastAccessTime : 8/16/2024 5:30:57 AM
CreationTime   : 8/16/2024 5:30:57 AM
LastWriteTime  : 8/16/2024 5:42:17 AM

特に変わりありません。

さらに読み込んでみます。

> cat Z:\\test.txt
test
test2

> date | Out-String -Stream | ?{$_ -ne ""}
Friday, August 16, 2024 5:51:10 AM

> Get-ItemProperty -Path "Z:\\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List | 
    Out-String -Stream | ?{$_ -ne ""}
LastAccessTime : 8/16/2024 5:30:57 AM
CreationTime   : 8/16/2024 5:30:57 AM
LastWriteTime  : 8/16/2024 5:42:17 AM

> date | Out-String -Stream | ?{$_ -ne ""}
Friday, August 16, 2024 5:53:40 AM

> Get-ItemProperty -Path "Z:\\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List | 
    Out-String -Stream | ?{$_ -ne ""}
LastAccessTime : 8/16/2024 5:30:57 AM
CreationTime   : 8/16/2024 5:30:57 AM
LastWriteTime  : 8/16/2024 5:42:17 AM

その後20分ほど待ちましたがatimeは更新されませんでした。また、エクスプローラーで対象ファイルをメモ帳で表示してもatimeは更新されませんでした。

以下Microsoft公式ドキュメントの記述から1時間遅延があるようです。

すべてのファイル・システムが作成時刻と最終アクセス時間を記録できるわけではありません。また、すべてのファイル・システムが同じ方法で記録するわけではありません。 たとえば、FAT での作成時間の解像度は 10 ミリ秒ですが、書き込み時間の解像度は 2 秒、アクセス時間の解像度は 1 日なので、実際にはアクセス日です。 NTFS ファイル システムは、ファイルの最終アクセス時間の更新を最後のアクセスから最大 1 時間遅らせられます。

ファイルの時刻 - Win32 apps | Microsoft Learn

ということで、1時間以上待ちました。

> date | Out-String -Stream | ?{$_ -ne ""}
Friday, August 16, 2024 7:46:25 AM

> Get-ItemProperty -Path "Z:\\test.txt" |
>>     Select-Object -Property LastAccessTime, CreationTime, LastWriteTime |
>>     Format-List |
>>     Out-String -Stream | ?{$_ -ne ""}
LastAccessTime : 8/16/2024 5:30:57 AM
CreationTime   : 8/16/2024 5:30:57 AM
LastWriteTime  : 8/16/2024 5:42:17 AM

atimeは更新されていませんね。遅延して反映される訳でもなさそうです。

FSxNの場合

volumeの設定の確認

続いて、FSxNの確認をします。

ONTAPではデフォルトではatimeを更新するオプションが有効になっているようです。

デフォルトでは、ONTAP はWindowsサーバのように動作します。
ただし atime 、は次のボリュームオプションが設定されている場合は更新されません。
::*> vol modify -vserver vserver name -volume volume name -atime-update false

**デフォルトで は、このオプションは trueに設定されています。

ネットアップのファイルサーバで最終アクセス日を更新するにはどうすればよいですか。 - NetApp

atime関連のオプションの説明は以下のとおりです。

[-atime-update {true|false}] - Access Time Update Enabled (privilege: advanced)
This optionally specifies whether the access time on inodes is updated when a file is read. The default setting is true .
.
.
(中略)
.
.
[-atime-update-period <integer>] - Access Time Update Period (Seconds) (privilege: advanced)
This parameter specifies the time period that must be elapsed in between consecutive atime update events. Note: The value of this parameter is only used if -atime-update is enabled on the volume.

volume modify

ONTAP CLIでFSxNのボリュームの設定を確認すると、いずれのボリュームもatime-updateが有効で、atime-update-periodが0になっていました。

$ ssh fsxadmin@management.fs-0480a4843e2853b1f.fsx.us-east-1.amazonaws.com
The authenticity of host 'management.fs-0480a4843e2853b1f.fsx.us-east-1.amazonaws.com (10.0.8.223)' can't be established.
ED25519 key fingerprint is SHA256:bsgg7JCnMIZoRsX1NJdoSUtqIVpjbbk3oviqDI8zeeE.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'management.fs-0480a4843e2853b1f.fsx.us-east-1.amazonaws.com' (ED25519) to the list of known hosts.
(fsxadmin@management.fs-0480a4843e2853b1f.fsx.us-east-1.amazonaws.com) Password:

This is your first recorded login.
Your privilege has changed since last login.

::> set diag

Warning: These diagnostic commands are for use by NetApp personnel only.
Do you want to continue? {y|n}: y

::*> volume show -fields security-style, atime-update, atime-update-period
vserver volume   security-style atime-update atime-update-period
------- -------- -------------- ------------ -------------------
svm     svm_root unix           true         0
svm     vol_ntfs ntfs           true         0
svm     vol_unix unix           true         0
3 entries were displayed.

なお、atime-updateの注意点は以下のとおりです。SQL ServerのAlways On FCIや可用性グループでストレージをFSxNのSMBファイル共有にする場合は注意しましょう。

-atime-update(アクセス時間の更新)は 、read、readlink、およびREADDIRを使用して読み取られたファイルおよびディレクトリのアクセス時間の更新を管理するボリュームレベルのフィールドです。

パフォーマンスに影響する可能性があるため、次のシナリオでは-atime-updateを無効にすることを推奨します。

  • 9.11.1より前のバージョンのONTAPでFlexCacheを使用する場合
  • SQLワークロードを使用する場合
  • VMware Virtualization for ONTAPを使用する場合

注: FabricPoolを使用する場合、FabricPoolはブロックレベルで機能するため、-atime-updateを有効にする必要はありません。

atime-updateを設定する際の考慮事項は何ですか。 - NetApp

NFS relatime

まず、NFSでrelatimeでマウントした場合です。

マウントします。

$ sudo mkdir -p /mnt/fsxn/vol_unix
$ sudo mount -t nfs svm-05d2c642353c1c410.fs-0480a4843e2853b1f.fsx.us-east-1.amazonaws.com:/vol_unix /mnt/fsxn/vol_unix
$ mount | grep /mnt/fsxn/vol_unix
svm-05d2c642353c1c410.fs-0480a4843e2853b1f.fsx.us-east-1.amazonaws.com:/vol_unix on /mnt/fsxn/vol_unix type nfs4 (rw,relatime,vers=4.2,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.200,local_lock=none,addr=10.0.8.12)

適当にファイルを作成し、catでアクセスします。

$ sudo touch /mnt/fsxn/vol_unix/test
$ stat /mnt/fsxn/vol_unix/test
  File: /mnt/fsxn/vol_unix/test
  Size: 0               Blocks: 0          IO Block: 65536  regular empty file
Device: 32h/50d Inode: 96          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-08-16 06:32:32.168655000 +0000
Modify: 2024-08-16 06:32:32.168655000 +0000
Change: 2024-08-16 06:32:32.168655000 +0000
 Birth: -

$ cat /mnt/fsxn/vol_unix/test
$ stat /mnt/fsxn/vol_unix/test
  File: /mnt/fsxn/vol_unix/test
  Size: 0               Blocks: 0          IO Block: 65536  regular empty file
Device: 32h/50d Inode: 96          Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:nfs_t:s0
Access: 2024-08-16 06:32:32.168655000 +0000
Modify: 2024-08-16 06:32:32.168655000 +0000
Change: 2024-08-16 06:32:32.168655000 +0000
 Birth: -

$ stat /mnt/fsxn/vol_unix/test | grep 2024-08-16
Access: 2024-08-16 06:32:32.168655000 +0000
Modify: 2024-08-16 06:32:32.168655000 +0000
Change: 2024-08-16 06:32:32.168655000 +0000

atimeは更新されていません。5分ほど待ちましたが、特に変わりませんでした。

追記するとどうでしょうか。

$ echo test2 | sudo tee -a /mnt/fsxn/vol_unix/test > /dev/null
$ while true; do
  echo "======================================================"
  date
  stat /mnt/fsxn/vol_unix/test | grep "2024-08-16"
  sleep 1
done
======================================================
Fri Aug 16 06:38:00 UTC 2024
Access: 2024-08-16 06:32:32.168655000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000
======================================================
Fri Aug 16 06:38:01 UTC 2024
Access: 2024-08-16 06:32:32.168655000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000
.
.
(中略)
.
.
======================================================
Fri Aug 16 06:44:19 UTC 2024
Access: 2024-08-16 06:32:32.168655000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000
======================================================
Fri Aug 16 06:44:20 UTC 2024
Access: 2024-08-16 06:32:32.168655000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000

5分ほど待ちましたが、特に変わりませんでした。EFSと挙動が違うのが興味深いですね。

NFS strictatime

次にstrictatimeの場合です。

strictatimeでマウントします。

$ umount /mnt/fsxn/vol_unix
umount.nfs4: failed to prepare umount: Operation not permitted

$ sudo umount /mnt/fsxn/vol_unix
$ sudo mount -t nfs svm-05d2c642353c1c410.fs-0480a4843e2853b1f.fsx.us-east-1.amazonaws.com:/vol_unix /mnt/fsxn/vol_unix -o strictatime
$ mount | grep /mnt/fsxn/vol_unix
svm-05d2c642353c1c410.fs-0480a4843e2853b1f.fsx.us-east-1.amazonaws.com:/vol_unix on /mnt/fsxn/vol_unix type nfs4 (rw,vers=4.2,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.200,local_lock=none,addr=10.0.8.12)

ファイルにアクセスしてatimeを確認します。

$ stat /mnt/fsxn/vol_unix/test | grep "2024-08-16"
Access: 2024-08-16 06:32:32.168655000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000

$ cat /mnt/fsxn/vol_unix/test
test2
$ while true; do
  echo "======================================================"
  date
  stat /mnt/fsxn/vol_unix/test | grep "2024-08-16"
  sleep 1
done
======================================================
Fri Aug 16 06:46:28 UTC 2024
Access: 2024-08-16 06:46:28.188686000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000
======================================================
Fri Aug 16 06:46:29 UTC 2024
Access: 2024-08-16 06:46:28.188686000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000

即時更新されました。これは期待が持てます。もうアクセスしてatimeが更新されるか確認します。

$ cat /mnt/fsxn/vol_unix/test
while true; do
  echo "======================================================"
  date
  stat /mnt/fsxn/vol_unix/test | grep "2024-08-16"
  sleep 1
done
test2
======================================================
Fri Aug 16 06:48:22 UTC 2024
Access: 2024-08-16 06:46:28.188686000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000
======================================================
Fri Aug 16 06:48:23 UTC 2024
Access: 2024-08-16 06:46:28.188686000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000
.
.
(中略)
.
.
======================================================
Fri Aug 16 06:50:20 UTC 2024
Access: 2024-08-16 06:46:28.188686000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000
======================================================
Fri Aug 16 06:50:21 UTC 2024
Access: 2024-08-16 06:46:28.188686000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000

2分ほど待ちましたが、atimeは更新されませんでした。

追記した場合はどうでしょうか。

$ stat /mnt/fsxn/vol_unix/test | grep "2024-08-16"
Access: 2024-08-16 06:46:28.188686000 +0000
Modify: 2024-08-16 06:38:00.659662000 +0000
Change: 2024-08-16 06:38:00.659662000 +0000

$ echo test3 | sudo tee -a /mnt/fsxn/vol_unix/test > /dev/null
$ while true; do
  echo "======================================================"
  date
  stat /mnt/fsxn/vol_unix/test | grep "2024-08-16"
  sleep 1
done
======================================================
Fri Aug 16 06:54:45 UTC 2024
Access: 2024-08-16 06:46:28.188686000 +0000
Modify: 2024-08-16 06:54:45.649353000 +0000
Change: 2024-08-16 06:54:45.649353000 +0000
.
.
(中略)
.
.
======================================================
Fri Aug 16 08:03:31 UTC 2024
Access: 2024-08-16 06:46:28.188686000 +0000
Modify: 2024-08-16 06:54:45.649353000 +0000
Change: 2024-08-16 06:54:45.649353000 +0000

書き込んで一時間以上経過しましたが、atimeは更新されませんでした。

その後catlessでアクセスしてもatimeは更新されませんでした。

FSxNをNFSサーバーとして使用する場合、atimeをベースに何か処理させるのは避けたほうが良さそうです。

SMB

最後にSMBの場合です。

マウントして適当なファイルを作成します。

> New-PSDrive -Name "Y" -PSProvider FileSystem -Root "\\SMB-SERVER.corp.non-97.net\c$" -Persist

Name           Used (GB)     Free (GB) Provider      Root                                               CurrentLocation
----           ---------     --------- --------      ----                                               ---------------
Y                   0.00          0.95 FileSystem    \\SMB-SERVER.corp.non-97.net\c$

> echo test > Y:\vol_ntfs\test.txt

> Get-ItemProperty -Path "Y:\vol_ntfs\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List | 
    Out-String -Stream | ?{$_ -ne ""}

LastAccessTime : 8/16/2024 6:58:24 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM

作成したファイルにアクセスします。

> cat Y:\vol_ntfs\test.txt
test

> date | Out-String -Stream | ?{$_ -ne ""}
Friday, August 16, 2024 7:00:01 AM

> Get-ItemProperty -Path "Y:\vol_ntfs\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List | 
    Out-String -Stream | ?{$_ -ne ""}

LastAccessTime : 8/16/2024 6:58:24 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM
.
.
(中略)
.
.
> date | Out-String -Stream | ?{$_ -ne ""}
Friday, August 16, 2024 7:00:10 AM

> Get-ItemProperty -Path "Y:\vol_ntfs\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List | 
    Out-String -Stream | ?{$_ -ne ""}

LastAccessTime : 8/16/2024 6:58:24 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM

> date | Out-String -Stream | ?{$_ -ne ""}
Friday, August 16, 2024 7:00:12 AM

> Get-ItemProperty -Path "Y:\vol_ntfs\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List | 
    Out-String -Stream | ?{$_ -ne ""}

LastAccessTime : 8/16/2024 7:00:01 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM

アクセスしておおよそ10秒ほどでatimeが更新されました。

念の為、もう一度ファイルにアクセスします。

> date | Out-String -Stream | ?{$_ -ne ""}
Friday, August 16, 2024 7:06:36 AM

> Get-ItemProperty -Path "Y:\vol_ntfs\test.txt" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List | 
    Out-String -Stream | ?{$_ -ne ""}
LastAccessTime : 8/16/2024 7:00:01 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM

> cat Y:\vol_ntfs\test.txt
test

> while (1) {
  echo "======================================================"
  date | Out-String -Stream | ?{$_ -ne ""}
  Get-ItemProperty -Path "Y:\vol_ntfs\test.txt" | 
      Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
      Format-List | 
      Out-String -Stream | ?{$_ -ne ""}
  sleep 1
}
======================================================
Friday, August 16, 2024 7:06:36 AM
LastAccessTime : 8/16/2024 7:00:01 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM
======================================================
Friday, August 16, 2024 7:06:37 AM
LastAccessTime : 8/16/2024 7:00:01 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM
.
.
(中略)
.
.
======================================================
Friday, August 16, 2024 7:06:45 AM
LastAccessTime : 8/16/2024 7:00:01 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM
======================================================
Friday, August 16, 2024 7:06:46 AM
LastAccessTime : 8/16/2024 7:06:36 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM
======================================================
Friday, August 16, 2024 7:06:47 AM
LastAccessTime : 8/16/2024 7:06:36 AM
CreationTime   : 8/16/2024 6:58:24 AM
LastWriteTime  : 8/16/2024 6:58:24 AM

ちょうど10秒後にatimeが更新されました。

SMBサーバー上にatimeを使用して何か処理をさせたい場合は、FSxNを採用すれば良さそうです。

ちなみにフォルダもlsするだけでatimeが更新されました。

> date | Out-String -Stream | ?{$_ -ne ""}
Friday, August 16, 2024 8:53:49 AM

> Get-ItemProperty -Path "Y:\vol_ntfs" | 
    Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
    Format-List | 
    Out-String -Stream | ?{$_ -ne ""}
LastAccessTime : 8/16/2024 6:22:53 AM
CreationTime   : 8/16/2024 6:22:53 AM
LastWriteTime  : 8/16/2024 6:58:24 AM

> ls Y:\vol_ntfs

    Directory: Y:\vol_ntfs

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         8/16/2024   6:58 AM             14 test.txt

> while (1) {
  echo "======================================================"
  date | Out-String -Stream | ?{$_ -ne ""}
  Get-ItemProperty -Path "Y:\vol_ntfs" | 
      Select-Object -Property LastAccessTime, CreationTime, LastWriteTime | 
      Format-List | 
      Out-String -Stream | ?{$_ -ne ""}
  sleep 1
}
======================================================
Friday, August 16, 2024 8:53:49 AM
LastAccessTime : 8/16/2024 8:53:49 AM
CreationTime   : 8/16/2024 6:22:53 AM
LastWriteTime  : 8/16/2024 6:58:24 AM

FSxNならSMB経由でファイルにアクセスした際にatimeを更新できる

FSxNやFSxW、EFS上のファイルにアクセスしただけでatimeが更新されるか確認してみました。

FSxWはやはりレジストリを変更できないため、atimeの更新はできませんでした。どうしてもSMBサーバーでatimeベースの処理をしたい場合はFSxNを選択しましょう。

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

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

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.