mount options

首先要记住这句话:
性能的提高是以数据完整性的牺牲为代价的。

下面记录了一些常见的 mount options。

1. noatime, relatime
2.6.30 以后的内核,默认都是 relatime。该标志表示如果比 mtime 的时间旧,则更新,相比 atime,对系统的写会大大的减小,不过依然存在写的可能,因此,改成 noatime 会比较合适,实践下来,这个即使没有明显的性能提高也不会降低系统的性能。有点需要注意的是,mutt 以及 tmpwatch 会使用到 atime,不过前者发现不使用 atime 也完全可以工作,后者可以修改成使用 ctime。如果出于谨慎的目的,可以使用默认的 relatime。
可以针对文件或者目录做 noatime 的设置:
# chattr +A filename
# chattr -R +A  /var/spool/

当然也可以在 fstab 文件里面针对某个分区做,加上 noatime 就好了。做完需要 remount:
# mount -o remount /mnt/
# cat /proc/mounts

2. ordered, writeback, journal
ext4 存在 3 种数据模式,writeback, ordered, journal。
* writeback 只记录 metadata,不记录 data。他是可以先写 metadata 再写 data,当机器崩溃后,会造成数据的丢失,但是不会造成数据的错乱。该模式是性能最高的一种。
* ordered  只记录 metadata,但是他提供了一种事物的模式,在有新的 metadata 需要写入前,跟其相关联的数据快会先写入。总的来说,该模式的性能比 writeback 稍低,但是比 journal 快的多。
* journal 同时记录 metadata 以及 data。此模式性能最低。

默认是 ordered,该选项只会让 metedata 被记录。根分区的设置有点特殊,需要像下面这样:
rootflags=data=writeback

3. bh, nobh
前者强制使用 buffer heads,后者避免使用。nobh 只能跟 writaback 配合使用。

4. commit
这个是 data 以及 metadata 同步的时间,默认是 5s,可以适当的增加。出现的问题也很明显,如果机器掉电或者崩溃了,那段时间间隔的 data 也就没了。

5. barrier
如果磁盘是 battery-backed 的,可以关闭 barrier=0。

如果决定使用 writeback 模式,需要通过 tun2fs 修改 "Filesystem features":
# tune2fs -o journal_data_writeback /dev/sdax
# tune2fs -O ^has_journal /dev/sdax
# e2fsck -f /dev/sdax

然后再修改 fstab。

综合来说,在生产的机器上,比较安全保守的做法是:
noatime,data=ordered,barrier=1,commit=50

如果可以要达到高吞吐,容忍一定的数据丢失,可以参考下面的:
noatime,data=writeback,barrier=0,nobh,errors=remount-ro

ref:
http://askubuntu.com/questions/2099/is-it-worth-to-tune-ext4-with-noatime
https://www.kernel.org/doc/Documentation/filesystems/ext4.txt