なぜ cat はアクセス時間を変更しないのですか?

なぜ cat はアクセス時間を変更しないのですか?

ファイルの cat の 2 回目の呼び出しでは、アクセス時間が更新されません。ファイルの内容が表示されるたびにアクセス時間が更新されることを期待していました。

Web ブラウザでファイルを開くと、同じ動作が見られます。アクセス時間が一貫して更新されません。

アクセスタイムについて誤解しているのでしょうか? 2 つのキャットコールの違いは何でしょうか?

$ タッチテスト
$ 統計テスト
  ファイル: `test'
  サイズ: 0 ブロック: 0 IO ブロック: 4096 通常の空ファイル
デバイス: 803h/2051d Inode: 152694 リンク: 1
アクセス: (0664/-rw-rw-r--) Uid: ( 1001/ aaron) Gid: ( 1001/ aaron)
アクセス: 2012-08-21 11:05:40.586020996 +0200
修正: 2012-08-21 11:05:40.586020996 +0200
変更: 2012-08-21 11:05:40.586020996 +0200
 生年月日: -

$ vimテスト
$ 統計テスト
  ファイル: `test'
  サイズ: 5 ブロック: 8 IO ブロック: 4096 通常ファイル
デバイス: 803h/2051d Inode: 152694 リンク: 1
アクセス: (0664/-rw-rw-r--) Uid: ( 1001/ aaron) Gid: ( 1001/ aaron)
アクセス: 2012-08-21 11:05:52.890021630 +0200
修正: 2012-08-21 11:06:31.606023626 +0200
変更: 2012-08-21 11:06:31.638023629 +0200
 生年月日: -

$ 猫テスト
テスト

$ 統計テスト
  ファイル: `test'
  サイズ: 5 ブロック: 8 IO ブロック: 4096 通常ファイル
デバイス: 803h/2051d Inode: 152694 リンク: 1
アクセス: (0664/-rw-rw-r--) Uid: ( 1001/ aaron) Gid: ( 1001/ aaron)
アクセス: 2012-08-21 11:06:44.662024298 +0200
修正: 2012-08-21 11:06:31.606023626 +0200
変更: 2012-08-21 11:06:31.638023629 +0200
 生年月日: -

$ 猫テスト
テスト

$ 統計テスト
  ファイル: `test'
  サイズ: 5 ブロック: 8 IO ブロック: 4096 通常ファイル
デバイス: 803h/2051d Inode: 152694 リンク: 1
アクセス: (0664/-rw-rw-r--) Uid: ( 1001/ aaron) Gid: ( 1001/ aaron)
アクセス: 2012-08-21 11:06:44.662024298 +0200
修正: 2012-08-21 11:06:31.606023626 +0200
変更: 2012-08-21 11:06:31.638023629 +0200
 生年月日: -

答え1

http://en.wikipedia.org/wiki/Stat_(システムコール)

atimeに対する批判

ファイルに書き込むと mtime と ctime が変更され、ファイルを読み取ると atime が変更されます。その結果、POSIX 準拠のシステムでは、ファイルを読み取ると書き込みが発生し、批判されてきました。この動作は通常、/etc/fstab にマウント オプションを追加することで無効にできます。

ただし、atime の更新をオフにすると、POSIX 準拠が破られ、一部のアプリケーション、特に mutt メール リーダー (一部の構成) や一部のファイル使用状況監視ユーティリティ、特に tmpwatch が破られます。最悪の場合、atime を更新しないと、一部のバックアップ プログラムがファイルのバックアップに失敗する可能性があります。

Linux カーネル開発者の Ingo Molnár 氏は、atime を「おそらく史上最も愚かな Unix 設計アイデア」と呼び、次のように付け加えています。「少し考えてみてください。『ディスクから読み取られるすべてのファイルに対して、ディスクに書き込みます。そして、すでにキャッシュされていてキャッシュから読み取られるすべてのファイルに対して、ディスクに書き込みます。』」さらに、次のようにパフォーマンスへの影響を強調しています。

atime アップデートは、現在の Linux が抱える最大の IO パフォーマンスの欠陥です。atime アップデートをなくすことで、過去 10 年間のページキャッシュの高速化よりも、日常的な Linux のパフォーマンスが向上します。組み合わせた

カーネルのデフォルトのマウント オプションが noatime か relatime かを知るにはどうすればよいでしょうか?

man mount
....
   relatime
          Update inode access times relative to  modify  or  change  time.
          Access time is only updated if the previous access time was ear‐
          lier than the current modify or change time. (Similar  to  noat‐
          ime,  but  doesn't break mutt or other applications that need to
          know if a file has been read since the last time  it  was  modi‐
          fied.)

          Since Linux 2.6.30, the kernel defaults to the behavior provided
          by this option (unless noatime was  specified), and the stricta‐
          time  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.
....

これが、その特定のパーティションがマウントされた方法であり、cat がアクセス時間を期待どおりに更新しない理由です。

関連情報