PR

 atime(access time)とは,LinuxなどのUNIX系OSがファイルに記録する時刻情報の1つです。atimeには,文字通り,ファイルにアクセスした時刻が記録されます。より厳密には,ファイルの実データが読み込まれた際に,その時刻が記録されます。ファイルの管理情報(メタデータ)だけを読み込んだ場合になどには更新されません。
 atime情報を各ファイルが保持することにより,「最近アクセスされていないファイルを消す」といったアクセス時刻に基づいた処理を簡単に実現できます。実際に,/tmpディレクトリのファイルを整理するコマンド「tmpwatch」などが,atimeを使った処理をします。
 その一方,atimeはパフォーマンスを低下させる原因でもあります。ファイルにアクセスするたびにatime情報を更新する必要があるためです。書き込み処理は,一般に読み出しよりも処理時間がかかりますし,atime情報を格納するメタデータ位置を探し出すためのシーク時間も余分にかかります。また,最近利用されることが多いフラッシュ・メモリーのような書き込み回数に制限があるメディアでは,atime更新作業によってメディアの寿命が低下してしまう問題もあります。
 実際のところ,前述のtmpwatchなどの限られたアプリケーション以外では,atime情報はほとんど利用されません。そこで,ファイル・システムのマウント時に「noatime」というオプションを付加し,atimeを更新しない設定にするチューニングが良く使われていました。効果は劇的で,たったこれだけで,数割から2倍程度の処理速度改善が見られることもあります。
 しかし,noatimeオプションを使った場合,atimeはまったく更新されません。これでは,少数ながら存在する,atimeを参照するアプリケーションが正常に動作しなくなります。そこで最近のLinux(カーネル2.6.20以降)には,「relatime」というオプションが用意されています。同オプションを指定すると,「ファイル・データの変更時刻」(mtime)または「ファイル状態の変更時刻」(ctime)のどちらかよりもatimeが古い場合にだけ,atimeを更新します。これならば,データの書き込みや状態変化が発生するファイルでは,atime更新頻度を減らしつつ,atimeに基づいた処理が概ね上手くいきます。
 ただし,書き込みや状態変化を伴わず,読み出しだけがなされるファイルでは,atimeがまったく更新されませんので問題が発生する可能性があります。そこでカーネル2.6.30以降ではrelatimeを拡張し,一定時間経過した後のファイルであれば,mtimeやctimeとは無関係にatimeを更新するように改良しています。カーネル2.6.30の標準設定では1日ごとにatimeが更新されます。
 またこの拡張に合わせて,カーネル2.6.30以降では,「relatime」が標準のマウント・オプションに採用されました。従来通り,アクセスのたびにatimeを更新させる場合には「strictatime」というオプションを付けてファイル・システムをマウントする必要があります。