Amazon FSx for NetApp ONTAPやAmazon EFS上のファイルにアクセスしただけでatimeが更新されるか確認してみた
AWSマネージドサービスでもファイルにアクセスしただけでatimeが更新されるのか
こんにちは、のんピ(@non____97)です。
皆さんはAWSマネージドサービスでもファイルにアクセスしただけでatimeが更新されるのか気になったことはありますか? 私はあります。
世の中にはファイルの最終アクセス日時(atime)をベースに分析や整理を行う製品があります。昨日の例としては、atimeが1年以上経過しているファイルはアーカイブストレージに移動するなどです。
ふと、AWSのマネージドサービスでもファイルにアクセスしただけでatimeが更新されるのかどうか気になりました。
以下で紹介されているとおり、WindowsではNtfsDisableLastAccessUpdate
というレジストリの値によってatimeの更新有無が変わります。
デフォルトでは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 パラメータは、この機能に依存するバックアップやリモート ストレージなどのプログラムに影響を与える可能性があります。
いきなりまとめ
- 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 時間遅らせられます。
ということで、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に設定されています。
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.
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を有効にする必要はありません。
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は更新されませんでした。
その後cat
やless
でアクセスしても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)でした!