我有一个NFS3服务器与多个客户端。 每个客户端都依次读取不同的大文件,性能非常差。
以下是我在iostat服务器上观察文件所在磁盘的情况:
设备:rrqm / s wrqm / sr / sw / 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最终以小块读取文件,在不同文件之间大量交织块。 这反过来导致大量的磁盘查找,性能下降。
你会说证据certificate这个结论是正确的吗?
你会推荐什么来解决这个问题? 我可以更改阅读应用程序,并可以调整服务器和客户端上的NFS设置。 我使用内核2.6.18的RedHat 5.6, 我相信限制rsize到32KB(我很乐意在这方面被certificate是错误的)。
编辑:当只有一个客户端读取单个文件时,情况如何:
设备:rrqm / s wrqm / sr / sw / 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服务器与您的工作集有多less内存? 你的工作集是否适合caching?
什么是后端存储? 你说它的吞吐量〜180-360MB /秒,但是它对随机I / O的性能如何呢? 我build议使用类似fio的东西来获得一个想法。 seekwatcher也很有趣,可视化的I / O。 但是,如果你能避免更好地击中磁盘。