我正在尝试为一个系统设置一个文件共享系统,在这个系统中,用户可以访问临时虚拟机来处理读取/写入大量小文件的项目。例如,一个新项目可能为 200MB,包含 12,000 多个文件。我希望减少创建新项目所需的时间,但我认为所有这些文件的请求产生的 RTT 开销会造成瓶颈。
目前,我正在使用以下 mount 命令挂载 NFS 共享。
sudo mount -t nfs -o nfsvers=3,nconnect=16,hard,async,fsc,noatime,nodiratime,relatime <drive>:/fsx /share
此外,NFS 服务器还配置了rw,async
确保我们实际上使用异步写入。
经过几天的调整和使用nfsstat
和nfsiostat
,这给了我最快的结果。我还cachefilesd
配置了读取缓存以加快这些操作。不幸的是,在项目创建期间,我仍然得到 ~20kb/s 的写入速度。写入一个大型单个文件会产生 >250MB/s
的吞吐量,并且nfsiostat
表明每个请求的延迟约为 1ms,因此这似乎不是吞吐量或网络问题。
这些文件很少将被文件共享所有者以外的任何人访问,但应用程序规范要求所有这些文件在文件共享上都采用可读格式,因此在本地磁盘上创建这些项目并tar
在会话结束时将它们添加到文件共享不幸的是不是一种选择。
有没有其他方法可以加快许多小文件的写入操作?如果新文件可以在本地写入并在有时间时同步到 NFS 共享,那就太好了。我不是系统管理员,所以只是寻求指导,并想知道是否有任何新的看法。
答案1
我最终找到了一个对我来说很有效的解决方案,因此想为任何试图解决这个解决方案的人发布后续信息。
我在尝试优化 NFS 连接时没有成功,因为它似乎主要受到调用的瓶颈,而这些调用并不一定能通过async
客户端/服务端的标志得到加速。
相反,我决定使用覆盖文件系统readonly
为我的 NFS 数据设置一个层,并read/write
在本地磁盘上设置一个层。这样我就可以公开一个安装点,让用户可以查看共享中的所有数据,但在实际处理文件时实现高 RW 性能。实现此目的的脚本看起来有点像这样。
sudo mkdir -p /application/nfs
sudo mkdir -p /application/overlay
sudo mkdir -p /application/local
sudo mkdir -p /application/workdir
sudo mount -t nfs -o nfsvers=3,actimeo=60,nconnect=16,hard,rsize=1048576,wsize=1048576,async,fsc <endpoint>:/<share_name> /application/nfs
sudo mount -t overlay -o volatile,lowerdir=/application/nfs,upperdir=/application/local,workdir=/application/work none /application/overlay
/application/overlay
这为您提供了一个具有更好读写性能的挂载点,可用于新工作项目。此外,您可以使用以下方法加快所有速度:缓存文件并在 NFS 共享挂载上启用该-fsc
标志。这会将您的 NFS 文件缓存到磁盘,并允许更快地读取通过网络传输的数据。
在用户会话结束时,我只需将rsync
文件从 同步到 NFS 共享/application/local
即可/application/nfs
将本地磁盘状态的更改同步到 NFS 共享。此系统并不适合所有人,具体取决于您的应用程序要求,但它非常适合我需要它做的事情。