本文介绍 FSX 客户端文件读写、文件、目录、数据缓存的语义,帮助您更好的使用 FSX 客户端。
应用程序可以通过 FSX 客户端访问 TOS 桶内的整个对象或者指定偏移读取某一部分数据。FSX 客户端针对大文件顺序读场景进行了优化,会自动的向 TOS 并发预读数据,以提高顺序读场景的吞吐带宽。默认场景下, FSX 客户端不会将文件下载到本地目录,也不会占用本地空间,只有配置读缓存挂载参数后,才会将数据缓存在读缓存目录。
对于写操作,应用程序必须从文件的起始位置写入,而且只支持顺序写,不支持随机写。FSX 客户端默认会先写入到本地临时文件目录,临时文件目录可以在挂载时指定 temp_dir
参数进行配置,默认在 /tmp/
下创建临时目录作为临时文件目录。如果您对性能敏感,可以在挂载时指定 tmpfs
作为写临时文件目录。写满一个段大小(part_size)后,FSX 会异步的将这部分数据上传到 TOS 服务端,并通过并发上传的方式优化写入吞吐。
应用程序只有 close 或 fsync 后,该文件才能对其他客户端可见,且不允许再在此文件上继续写入。对于覆盖已存在的文件场景,应用程序打开文件(open)时需要设置 O_TRUNC 标志,代表需要截断(truncate) 该文件。
注意
由于写操作首先会将数据写入临时文件目录,因此需要确保临时文件目录有足够的空间来暂存写入数据。临时文件目录空间至少需要保证 1024*分段数据 的大小,对于默认分段数据大小为 8M 的场景,即需要 8GiB 的空间。
目录对文件系统来说至关重要,FSX 客户端会将对象名称中的 / 解释成目录的分隔符,从而自动推断 TOS 存储桶的目录结构。例如桶内存在名为 dir1/dir2/file 的对象,其中的 dir1/、dir2/ 将被解释成目录,file 被解释成文件,这三者的文件系统架构为 dir1/、dir1/dir2/、dir1/dir2/file。
对于目录和文件同名场景,保证目录优先级高于文件的原则,因此会忽略文件。例如同时存在对象 a/b 和 a/b/c,在 a/b 中会将 b 解释成文件,在 a/b/c 中会将 b 解释成目录,映射时会忽略掉对象 a/b。如果后续 a/b/c 被删除,b 不存在重名的问题,a/b 将再次可见。
FSX 客户端支持本地数据缓存功能,此功能适用于小数据量频繁读取某一批文件场景。通过开启数据缓存,从同一计算实例对同一批数据读取时,可以有效减少对 TOS 的请求访问,降低成本的同时,也可以提升读取性能。
注意
使用数据缓存功能,会影响数据的一致性和有效性,可能会读取过期的数据,对于数据实时性、一致性要求较高的场景,不建议使用数据缓存功能。
对于文件一次性读取场景,使用数据缓存会对性能和成本无提升作用,不建议启用数据缓存功能。
开启数据缓存功能后,需要指定缓存目录和缓存空间大小。FSX 客户端会在挂载时指定的缓存目录下创建一个新的子目录,并且在挂载和卸载时删除该子目录下的任何文件和目录。缓存的数据达到设置的缓存空间大小后,FSX 客户端会主动从缓存目录中清理最近最少使用的数据块。