2.9. GFS2 节点锁定
要获得最佳 GFS2 文件系统性能,则需要理解其操作的基本原理。单节点文件系统与缓存一同使用,其目的是在频繁使用请求的数据时可消除磁盘访问延迟。Linux 页面缓存(以及缓冲缓存)提供这个缓存功能。
使用 GFS2,每个节点都可有其自身的页面缓存,该缓存中包含 on-disk 数据的一部分。GFS2 使用 glocks(发音为 gee-locks)锁定机制维护节点间缓存的完整性。glock 子系统提供缓存管理功能,该功能使用分布式锁管理器(DLM)部署作为基础沟通层。
glocks 在每个内节点中为缓存提供保护,因此在每个内节点中都有一个锁定用来控制缓冲层。如果为那个 glock 赋予共享模式(DLM 锁定模式:PR),那么那个 glock 保护下的数据可同时被一个或者多个节点缓存,这样多有节点就都有到该数据的本地访问。
如果为 glock 赋予专用模式(DLM 锁定模式:EX),那么只有一个节点可缓存那个 glock 保护的数据。所有修改数据的操作(例如
write
系统调用)都使用这个模式。
如果另一个节点请求 glock,但无法立刻获得,那么 DLM 会向该节点发送一条信息,或者向目前使用 glock 并妨碍新的请求的节点发送信息,要求它们释放其锁定。释放 glock(大多数文件系统操作标准)需要很长时间。释放共享 glock 只需要使该缓存无效,相对缓冲的数据来说速度较快。
释放专用 glock 需要 log flush,并向磁盘写回所有更改的数据,之后要使每个共享的 glock 失效。
单一节点文件系统与 GFS2 之间的区别在于单一节点文件系统只有一个缓存,而 GFS2 在每个节点中都有独立的缓存。在这两种情况下,对缓冲数据访问的延迟程度类似,但如果另一个节点之前缓冲了同样的数据,GFS2 对非缓冲数据访问的延迟要大得多。
注意
Due to the way in which GFS2's caching is implemented the best performance is obtained when either of the following takes place:
- 在所有节点中都使用只读方式使用内节点。
- 只在单一节点中写入或者修改内节点。
请注意:在创建和删除文件的过程中插入和删除目录条目也算在内,因为要写入到目录内节点。
也可能不遵守这个规则,但并不常发生。过度忽略这个规则会对性能有严重影响。
如果您在 GFS2 中使用 read/write 映射
mmap
() 某个文件,但只读取它,那么这只计为读取。而在 GFS 中会将其计为写入,因此 GFS2 使用 mmap
() I/O 时更灵活。
如果您没有设定
noatime
mount
参数,那么读取也会导致写入来更新文件时间戳。文件建议所有 GFS2 用户应该使用 noatime
挂载,除非对 atime
有具体要求。