我们有一台存储服务器,其中包含 12 个磁盘 RAID-6 池,容量为 100 TB。它通过 NFS 供多个客户端计算节点使用,主要用于运行深度学习训练(大量图像 ~100 KB,以随机顺序加载)。
为了加快文件访问速度,我们使用缓存文件在计算节点上。这种方法效果很好,因为工作负载使得每个训练作业通常反复读取相同的 10-100 GB,而这些内容可以很好地缓存在本地 SSD 上。
现在假设除了常规的培训工作之外,另一种类型的工作量也启动了(一个繁重的读取作业)。这个作业不能很好地缓存,因为它只读取一次大量数据(需要很长时间),而不是通常的训练作业的重复行为。这个作业总是需要从实际磁盘进行深度读取。
我们面临的问题是,尽管常规训练作业可以从本地缓存中读取,但元数据读取成为瓶颈。也就是说,cachefilesd 需要确保缓存仍然是最新的,因此它会询问 NFS 服务器文件自缓存以来是否被修改过。因此,cachefilesd 会请求读取的每个文件的修改属性 (mtime)。但是,由于存储服务器正忙于处理繁重的读取作业,因此它没有足够的时间以足够高的速率响应来自计算节点的这些 getattr 请求,从而导致瓶颈。
有没有什么方法可以调整服务器,使得这些 getattr 请求得到非常快速的响应(因此常规训练作业运行得很快),同时可能会延迟读取繁重的读取作业的实际文件内容数据的读取?
答案1
元数据密集型操作不是 NFS 工作负载的最佳用例。如果目录内容没有变化,或者客户端无法立即看到这些变化,您可以通过调整actimeo
挂载选项来增加客户端属性缓存的生命周期。查看man nfs
更多详细信息。