ファイルシステム atime の更新を無効化する
[履歴] (2014/11/02 12:14:50)

概要

Linuxにおいてファイル読み出しを行うと atime が更新されます。ファイル読み出し回数が非常に大きい場合 atime の更新を無効化することで若干のパフォーマンス向上が期待できます。

ファイルシステムとは

Windowsでエクスプローラを用いてフォルダやファイルを閲覧できたり、Linuxでcdやlsを用いてディレクトリ移動やファイル閲覧ができるのは、各OSがファイルシステムとよばれる機能を提供しているからです。有名なものは以下の通りです。

  • Windows: FAT (File Allocation Table) および NTFS (NT File System)
  • Mac: HFS (Hierarchical File System)
  • Unix: ext2, ext3, ext4 (extended filesystem の意味。ext2 はトランザクション毎に更新履歴の保存を行う、ジャーナリングに対応していない)

inodeとは

Unix系ファイルシステムには inode とよばれる概念があり、具体的にはファイルやディレクトリを表現しています。各 inode にはタイムスタンプ (mtime, atime等) やパーミッション情報が格納されています。

mtime および atime とは

  • mtime: "time of last modification" の意味で「ファイル書き込み」または "touch -m" を行うと更新されます。"ls -l" で確認できます
  • atime: "time of last access" の意味で「ファイル読み出し」または "touch -a" を行うと更新されます。"ls -lu" で確認できます

初期状態 (02:06)

$ ls -l test.txt
-rw-rw-r--. 1 username username 0 11月  2 02:06 2014 test.txt
$ ls -lu test.txt
-rw-rw-r--. 1 username username 0 11月  2 02:06 2014 test.txt

最終書き込み時刻を変更 (02:09)

$ touch -m test.txt
$ ls -l test.txt
-rw-rw-r--. 1 username username 0 11月  2 02:09 2014 test.txt  ← 変更された
$ ls -lu test.txt
-rw-rw-r--. 1 username username 0 11月  2 02:06 2014 test.txt

最終読み出し時刻を変更 (02:13)

$ touch -a test.txt
$ ls -l test.txt
-rw-rw-r--. 1 username username 0 11月  2 02:09 2014 test.txt
$ ls -lu test.txt
-rw-rw-r--. 1 username username 0 11月  2 02:13 2014 test.txt  ← 変更された

atime の更新を無効化

mtime と比較して atime は更新されなくても問題にならない場合が多いです。atime 更新処理を無効化することで、ファイル読み出し (書き込みではないことに注意) のパフォーマンスを向上させることができます。

無効化前の確認 (その1)

$ mount | grep " / "
/dev/mapper/VolGroup-lv_root on / type ext4 (rw)

無効化前の確認 (その2)

$ touch test.txt
$ ls -l test.txt
-rw-rw-r--. 1 username username 0 11月  2 03:08 2014 test.txt
$ ls -lu test.txt
-rw-rw-r--. 1 username username 0 11月  2 03:08 2014 test.txt
$ (しばらく待つ...)
$ perl -MIO::File -e '$fh=IO::File->new("test.txt","r"); 1 while(<$fh>)'  ← 読み出し
$ ls -l test.txt
-rw-rw-r--. 1 username username 0 11月  2 03:08 2014 test.txt
$ ls -lu test.txt
-rw-rw-r--. 1 username username 0 11月  2 03:09 2014 test.txt   ← 変更されることを確認

無効化の実行 (編集して再起動)

$ sudo vi /etc/fstab
...
#/dev/mapper/VolGroup-lv_root  /    ext4    defaults          1 1    ← コメントアウトして
/dev/mapper/VolGroup-lv_root   /    ext4    defaults,noatime  1 1    ← これを追記 (noatime)
...
$ sudo reboot

無効化後の確認 (その1)

$ mount | grep " / "
/dev/mapper/VolGroup-lv_root on / type ext4 (rw,noatime)  ← noatimeが設定されました

無効化後の確認 (その2)

$ touch test.txt
$ ls -l test.txt
-rw-rw-r--. 1 username username 0 11月  2 03:11 2014 test.txt
$ ls -lu test.txt
-rw-rw-r--. 1 username username 0 11月  2 03:11 2014 test.txt
$ (しばらく待つ...)
$ perl -MIO::File -e '$fh=IO::File->new("test.txt","r"); 1 while(<$fh>)'  ← 読み出し
$ ls -l test.txt
-rw-rw-r--. 1 username username 0 11月  2 03:11 2014 test.txt
$ ls -lu test.txt
-rw-rw-r--. 1 username username 0 11月  2 03:11 2014 test.txt   ← 変更されないことを確認
関連ページ
    概要 よく使う python ライブラリのサンプルコード集です。 JSON #!/usr/bin/python # -*- coding: utf-8 -*- import json arr = [1, 2, {'xxx': 3}] # オブジェクト ←→ JSON 文字列 jsonStr = json.dumps(arr) arr2 = json.loads(jsonStr) # オ