noatime和nodiratime的設定問題

小亮520cl發表於2015-08-10
相信對效能、最佳化這些關鍵字有興趣的朋友都知道在 Linux 下面掛載檔案系統的時候設定 noatime 可以顯著提高檔案系統的效能。預設情況下,Linux ext2/ext3 檔案系統在檔案被訪問、建立、修改等的時候記錄下了檔案的一些時間戳,比如:檔案建立時間、最近一次修改時間和最近一次訪問時間。因為系統執行的時候要訪問大量檔案,如果能減少一些動作(比如減少時間戳的記錄次數等)將會顯著提高磁碟 IO 的效率、提升檔案系統的效能。Linux 提供了 noatime 這個引數來禁止記錄最近一次訪問時間戳。

給檔案系統掛載的時候加上 noatime 引數能大幅提高檔案系統效能:
 
# vi /etc/fstab
 
/dev/sda1        /             ext3     defaults,noatime,nodiratime 0 0
devpts           /dev/pts      devpts   gid=5,mode=620             0 0
proc             /proc         proc     defaults                   0 0
/dev/sda2        swap          swap     defaults,noatime           0 0
修改設定後只需要重新掛載檔案系統、不需要重啟就可以應用新設定:
# mount -o remount /
 
# mount
/dev/sda1 on / type ext3 (rw,noatime,nodiratime)
proc on /proc type proc (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
網上很多資料都提到要同時設定 noatime 和 nodiratime,不知道這個結論來自哪裡,其實不需要像設定 noatime 那樣設定 nodiratime,最可靠的資料應該是原始碼,VPSee 查了一下原始碼,發現在核心原始碼 linux-2.6.33/fs/inode.c 檔案裡有一個 touch_atime 函式,可以看出如果 inode 的標記位是 NOATIME 的話就直接返回了,根本就走不到 NODIRATIME 那裡去,所以只設定 noatime 就可以了,不必再設定 nodiratime.
 
void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
1405{
1406        struct inode *inode = dentry->d_inode;
1407        struct timespec now;
1408
1409        if (inode->i_flags & S_NOATIME)
1410                return;
1411        if (IS_NOATIME(inode))
1412                return;
1413        if ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))
1414                return;
1415
1416        if (mnt->mnt_flags & MNT_NOATIME)
1417                return;
1418        if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode))
1419                return;
...
1435}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-1767069/,如需轉載,請註明出處,否則將追究法律責任。

相關文章