我有一个带有多个客户端的NFS3服务器.每个客户端都按顺序读取不同的大文件,性能非常差.
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util sdX 24.33 0.00 712.67 0.00 18.41 0.00 52.91 11.95 16.91 1.40 100.00
如您所见,%util是100%.同时,聚合I / O吞吐量(rMB / s wMB / s)约为18MB / s,比磁盘容量慢10-20倍.
这个,以及rMB / s与r / s的比率,使我得出结论,不是一次读取每个文件的大块,而是NFS最终以小块的形式读取文件,在不同文件之间有大量的块交错.这反过来导致大量磁盘搜索,从而导致性能下降.
你能说证据的结论是否合理?
你会建议什么作为解决这个问题的方法?我可以更改阅读应用程序,并可以调整服务器和客户端上的NFS设置.我正在使用内核2.6.18的RedHat 5.6,其中I believe将rsize限制为32KB(我很高兴被证明是错误的).
编辑:当只有一个客户端读取单个文件时,这就是事物的样子:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util sdX 343.33 0.33 1803.33 0.67 105.78 0.00 120.09 0.91 0.50 0.31 56.47
如您所见,吞吐量要好得多,%util也要低得多.
解决方法
更快的磁盘,更多的内存.我认为你的结论是正确的 – 你是在寻求约束.
您的NFS服务器与工作集相比有多少内存?你的工作集是否适合缓存?
什么是后端存储?你说它的吞吐量大约为180-360MB /秒,但它对随机I / O的性能如何?我建议使用像fio这样的东西来获得一个想法. seekwatcher对于可视化I / O也很有趣.但是,如果你能避免更多地击中磁盘.