我们的系统面临一个有趣的扩展问题。我对解决方案有一些想法,但在开始解决方案之前,我希望您能就此问题提出建议。
我们有多个服务处理通过 NFS 服务器共享的文件。每个文件大约 2GB,每个服务一次最多可以处理约 15 个文件。服务器通过 10 Gbps 网络连接,NFS 建立在支持 1000MB/s 吞吐量的 RAID 10 之上。服务的本质是它们在文件上创建线程锁,直到进程完成,并且进程仅并行处理少数数据块。
因此,我们的服务数量正在增加。最近,我们开始观察到进程中存在显著的延迟。所谓显著,是指延迟达到 3-4 倍。通过分析服务,我们发现大部分时间都花在了文件 IO 上,而不是处理本身。因此,我的第一直觉是,延迟是由于以下几点造成的:
- 集体访问数据会最大化带宽
- 进程必须等待每次迭代时加载数据块,这会给 IO 编排带来开销。
- 服务对文件具有的线程锁
我认为可行的方法是,每个服务将数据复制到该服务,并在处理后将结果复制回 NFS。使用这种方法,我不确定我们是否可以解决带宽问题,但其他问题应该可以解决。由于在多个服务中实施此解决方案需要付出很多努力,所以我想确定它是否有效。你们觉得怎么样?请告诉我。
编辑
- Debian GNU/Linux 10 上的 NFS 客户端版本为 4.2,内核版本为 4.15.0-118-generic
- Cent OS 7 上的 NFS 服务器版本为 4,内核版本为 3.10.0-1127.el7.x86_64
- 使用的挂载选项是 hard,async,rsize=1048576,wsize=1048576,proto=tcp,namelen=1000