我有一个非常愚蠢的问题。当执行读取操作时,我是否也在执行写入操作?我正在考虑在日志区域中写入,因为我的元数据已更改,例如 mac 时间。我的想法错了吗?我想得出结论,在我的 ext4 文件系统中启用写入屏障是否不能对读取操作性能产生显着差异。
答案1
您说得对,写入操作通常与读取操作相关联。但是它们之间还是存在一些差异。如果禁用访问时间更新,则不会发生写入,如果文件系统是只读的,则显然也不会发生写入。此外,这些写入是异步的,缓冲在内存中,并实际上定期刷新到磁盘上,从而减少了对性能的影响。
根据工作负载,您可以使用noatime
mount 选项或一个选项来提高 I/O 的性能relatime
,后者是现代内核的默认选项。
答案2
默认情况下,Linux 对所有文件系统使用“relatime”挂载选项,该选项仅在 atime 字段过期超过 24 小时或 atime < mtime 时才更新 atime 字段(因为某些邮件阅读器会使用此选项来确定 /var/mail/XXXX 文件中是否有三封未读邮件)。这大大减少了元数据写入的次数。还有“noatime”挂载选项,该选项完全禁用写入。relatime 和 noatime 字段在技术上违反了 POSIX 合规性,尽管现在大多数人并不关心严格的 POSIX 合规性。
在 Linux 4.2 及更新的内核中,还有“lazytime”挂载选项,它将在系统运行时更新内存中的所有时间戳字段(因此它始终是准确的)。磁盘上的时间戳会在以下情况下更新:(a) 文件系统卸载时;(b) 如果时间戳过时超过 24 小时;(c) 如果该 inode 中的其他 inode 字段需要更新 --- 例如,i_size、i_blocks、i_mode、i_uid 等 ----;或者 (d)(仅限 ext4 优化),同一 inode 表块中有一个相邻的 inode 正在磁盘上更新。
因此,lazytime 的优势在于您可以恢复 POSIX 合规性,并且它还可以抑制对文件进行非分配随机写入的 mtime 更新(例如,在企业数据库表空间文件的情况下,例如 Oracle 或 DB2 可能使用的文件)。但是,使用 lazytime,系统运行时可能会有一个时间戳值,如果您崩溃(而不是干净地卸载文件系统),则重新启动后会得到不同的时间戳值。这是 POSIX 允许的,它仅在 fsync(2) 或 umount(2) 之后做出一致性保证,但这可能会让某些应用程序感到惊讶。