我们的系统主要使用 NFS 来复制和提供来自多个节点的图像。
新图像添加的频率不高。因此写入很少见。几乎所有请求都是读取请求。
我如何优化我的系统以获得最大的读取性能(仅使用 nfs)。是否有任何快速可靠的测试来验证系统是否性能更好?
有没有更好的方法来快速提供图像?可以在 nfs 挂载之上使用 squid/缓存机制来加快速度吗?
我们已经在使用 apache 的内存缓存模块。
服务器和客户端使用 - nfs v3,全部运行 RHEL 4。
服务器硬件配置:RAM:3GB,四核 Intel(R) Xeon(TM) @ 3 Ghz。
服务器上的 cat /proc/net/rpc/nfsd" 给出:
rc 0 3584710 221921733 fh 1506 0 0 0 0 io 4274869225 1474485090 th 8 581669 39835.922 7449.989 1396.547 0.000 879.767 604.030 436.573 320.797 0.000 1362.017 ra 16 3454951 13954 4091 8186 3920 6990 6421 3003 5574 2727 2467399 net 225510008 0 225488411 41217 rpc 225506272 0 0 0 0 proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 proc3 22 57 144259928 359775 11723001 58910204 0 5977165 2145920 546253 3829 0 0 509776 3718 15256 165 21497 79725 10067 59 0 867450 proc4 2 0 0
考虑使用 rsync 将内容推送到所有图像服务节点,而不是使用 NFS 。写入可以发生在一个中心点,然后在必要时(即添加图像时)或使用 cron 作业重新同步。
这将提供更好的整体性能,并允许使用通常的文件系统缓存,而不必在 NFS 之上实现某些东西。
你没有提到你的 NFS 服务器是什么,也没有提到 nfs 客户端。我假设两者都是某种最近的 Linux 系统。
你说你正在使用apache的内存缓存。Apache 也有基于磁盘的缓存,可以在这里使用。请参阅 Apache 的缓存指南中的基于磁盘的缓存部分。这需要将一些本地磁盘空间用于图像缓存,并每隔一段时间运行一个实用程序来清理缓存。
Solaris 有一个缓存文件系统,可以用作 NFS 之上的一个层,但是您标记了 linux,所以我认为这不是您的选择。
您没有提到您是否正在考虑使用硬件来解决问题,但一种可能的缓存解决方案是NetApp FlexCache产品。它们当然不便宜,但它们正是为了解决这个问题而设计的。
在服务 NFS 阅读器的文件系统上禁用访问时间 (atime)。
基本上,默认情况下,您的硬盘驱动器正在执行写入以更新正在读取的每个文件的访问时间。禁用它可以提高读取性能。
更多关于 atime 的信息可以在这里和这里找到。
听起来像是 SSD 的完美应用。它将减少您的读取延迟。