仔细分析您的环境,无论是从客户端还是服务器端来看,都是获得最佳 NFS 性能的必要第一步。第一部分将讨论通常对客户端重要的问题。稍后(第 5.3 节 及之后),将讨论服务器端问题。在这两种情况下,这些问题都不会完全局限于一方或另一方,但是为了更清楚地了解因果关系,将两者分开是有用的。
除了常规的网络配置——适当的网络容量、更快的 NIC、全双工设置以减少冲突、交换机和集线器之间网络速度的一致性等——最重要的客户端优化设置之一是 NFS 数据传输缓冲区大小,由 mount 命令选项指定rsize和wsize.
所有 2.4 客户端当前都支持高达 32K 的块传输大小,允许从其他服务器(如 Solaris)跨 NFS 挂载进行标准的 32K 块传输,而无需客户端修改。
默认值可能太大或太小,具体取决于硬件和内核的特定组合。一方面,某些 Linux 内核和网卡的组合(主要在较旧的机器上)无法处理如此大的块。另一方面,如果它们可以处理更大的块,则更大的尺寸可能会更快。
以下命令中的第一个命令从特殊文件传输 16384 个 16k 的块/dev/zero(如果您读取它,它会非常快速地吐出零)到挂载的分区。我们将计时以查看需要多长时间。因此,从客户端机器,键入
# time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384 |
# time dd if=/mnt/home/testfile of=/dev/null bs=16k |
重复几次并平均所需时间。务必每次都卸载并重新挂载文件系统(客户端和服务器本地也要卸载和重新挂载,如果您很热衷的话),这应该会清除任何缓存。
记住编辑/etc/fstab以反映您发现最理想的rsize/wsize。
如果您的结果看起来不一致或可疑,您可能需要在更改rsize和wsize值的同时更广泛地分析您的网络。在这种情况下,以下是一些可能有用的基准测试的指针
Bonnie++ http://www.coker.com.au/bonnie++/
IOzone 文件系统基准测试 http://www.iozone.org/
官方 NFS 基准测试,SPECsfs97 http://www.spec.org/osg/sfs97/
最简单且覆盖范围最广的基准测试,包括广泛的文件大小和 IO 类型——读取、写入、重读和重写、随机访问等——似乎是 IOzone。IOzone 的推荐调用(您必须具有 root 权限)包括卸载和重新挂载被测目录,以便清除测试之间的缓存,并将文件关闭时间包括在测量中。假设您已经从服务器/tmp导出到所有人foo,并且您已在本地目录中安装了 IOzone,则这应该可以工作
# echo "foo:/tmp /mnt/foo nfs rw,hard,intr,rsize=8192,wsize=8192 0 0" >> /etc/fstab # mkdir /mnt/foo # mount /mnt/foo # ./iozone -a -R -c -U /mnt/foo -f /mnt/foo/testfile > logfile |
基准测试最多应花费 2-3 小时,但当然您需要为每个感兴趣的 rsize 和 wsize 值运行它。网站提供了参数的完整文档,但上面使用的特定选项是
-a完全自动模式,它使用 4K 到 16M 的记录大小测试 64K 到 512M 的文件大小
-R以 excel 电子表格形式生成报告(图形的“曲面图”选项最佳)
-c在测试中包含文件关闭时间,这将拾取 NFS 版本 3 提交时间
-U在测试之间使用给定的挂载点来卸载和重新挂载;它清除缓存
-f当使用卸载时,您必须在挂载的文件系统中找到测试文件
虽然许多 Linux 网卡驱动程序都很出色,但有些却相当糟糕,包括一些相当标准的网卡的驱动程序。值得直接使用您的网卡进行实验,以找出它如何才能最好地处理流量。
此外,netstat -s 将提供针对所有受支持协议的流量收集的统计信息。您也可以查看/proc/net/snmp以获取有关当前网络行为的信息;有关更多详细信息,请参阅下一节。
如果您已经遇到过多的重传(请参阅 nfsstat 命令的输出),或者想要在不遇到超时和重传的情况下增加块传输大小,您可能需要调整这些值。具体调整将取决于您的环境,在大多数情况下,当前的默认值是合适的。
NFS 基准测试 SPECsfs 的几个已发布运行结果指定了读写值集[rw]mem_default和[rw]mem_max的更高值用法。您可以考虑将这些值增加到至少 256k。读写限制在 proc 文件系统中设置,例如使用文件/proc/sys/net/core/rmem_default和/proc/sys/net/core/rmem_max。rmem_default值可以通过三个步骤增加;以下方法有点 hack,但应该有效且不会引起任何问题
增加文件中列出的大小
# echo 262144 > /proc/sys/net/core/rmem_default # echo 262144 > /proc/sys/net/core/rmem_max |
重启 NFS。例如,在 Red Hat 系统上,
# /etc/rc.d/init.d/nfs restart |
如果其他内核系统依赖于它,您可能会将大小限制恢复为正常大小
# echo 65536 > /proc/sys/net/core/rmem_default # echo 65536 > /proc/sys/net/core/rmem_max |
最后一步可能是必要的,因为据报告,如果这些值长时间保持更改状态,机器会崩溃。
# /usr/sbin/exportfs -o rw,sync *:/usr/local # /usr/sbin/exportfs -o rw *:/tmp |
# /usr/sbin/exportfs -v /usr/local *(rw) /tmp *(rw,async) |
如果您的内核是使用/proc文件系统编译的,则文件/proc/fs/nfs/exports也将显示完整的导出选项列表。
但是,如果使用旧的默认async行为,则O_SYNC选项在任何版本的 NFS 中都完全无效,因为服务器将在不等待写入完成的情况下回复客户端。在这种情况下,版本之间的性能差异也将消失。
一般来说,服务器性能和服务器磁盘访问速度将对 NFS 性能产生重要影响。提供有关设置运行良好的文件服务器的一般指南超出了本文档的范围,但以下一些提示可能值得一提
如果您可以访问 RAID 阵列,请使用 RAID 1/0 以获得写入速度和冗余;RAID 5 提供良好的读取速度,但写入速度很差。
在系统崩溃的情况下,日志文件系统将大大缩短您的重启时间。目前,ext3 将与 NFS 版本 3 正确配合使用。此外,Reiserfs 版本 3.6 将在 2.4.7 或更高版本的内核上与 NFS 版本 3 配合使用(早期内核的补丁可用)。早期版本的 Reiserfs 不包括 inode 中的生成编号空间,这暴露了服务器重启期间未检测到的数据损坏的可能性。
此外,日志文件系统可以配置为通过利用日志更新是数据保护所必需的全部内容来最大化性能。一个例子是使用 ext3 和data=journal,以便所有更新首先转到日志,然后再转到主文件系统。一旦日志更新,NFS 服务器就可以安全地向客户端发出回复,并且主文件系统更新可以在服务器空闲时进行。
日志文件系统中的日志也可能驻留在单独的设备上,例如闪存卡,这样日志更新通常不需要寻道。仅旋转延迟会带来成本,这提供了相当好的同步 IO 性能。请注意,ext3 当前支持日志重定位,ReiserFS 将很快(正式)支持它。在 ftp://ftp.namesys.com/pub/reiserfsprogs/reiserfsprogs-3.x.0k.tar.gz 找到的 Reiserfs 工具包包含 reiserfstune 工具,该工具将允许日志重定位。但是,它确实需要一个内核补丁,截至 2002 年 1 月,该补丁尚未正式发布。
如果您在机器上交叉挂载文件(无论是有意还是疏忽),并且其中一台机器出现故障,则使用自动挂载器(例如 autofs 或 amd)可以防止挂起。有关详细信息,请参阅 Automount Mini-HOWTO。
一些制造商(Network Appliance、Hewlett Packard 和其他公司)以非易失性 RAM 的形式提供 NFS 加速器。NVRAM 将稳定存储的访问速度提高到相当于async访问。