NFS 性能分析
NFS 收集各类 NFS 操作执行情况的统计信息,会同出错信息和性能指标。您可以使用以下命令来识别网络问题和观察在您的系统上进行的各类 NFS 操作。
nfsstat 命令
:NONE.nfsstat 命令显示有关 NFS 和 RPC 接口到客户机和服务器内核的统计信息。这个命令还可以用来重新初始化这些统计信息的计数器(nfsstat -z)。考虑到性能上的问题,RPC 统计信息(-r 选项)是首先需要察看的。NFS 统计信息向您展示了应用程序使用 NFS 的情况。
RPC 统计信息
:NONE.nfsstat 命令显示了有关 RPC 调用的统计信息,例如:
- 已接收或已拒绝的 RPC 调用的总数
- 从服务器发出的或被服务器拒绝的 RPC 调用的总数
- 试图接收而无法收到 RPC 包的次数
- 长度过短或存在残缺头信息的包数
- 某个调用不得不被重新发送的次数
- 应答与调用不匹配的次数
- 某个调用超时的次数
- 某个调用在客户机句柄繁忙时等待的次数
- 认证信息不得不被刷新的次数
:NONE.nfsstat 命令输出的 NFS 统计信息部分被分为 NFS V2 和 NFS V3 两部分。而 RPC 统计信息部分被分为面向连接(TCP)和无连接 (UDP)两部分。
NFS 服务器信息
对于已接收的 NFS 调用(calls)和由于认证未通过而被拒绝的调用(badcalls)NFS 服务器显示它们的数目,同时也能显示其他很多种类已发生调用的数目和百分比。
下例展示了 nfsstat 命令带 -s 参数选项时输出的服务器部分,如下:
# nfsstat -s
Server rpc:
Connection oriented:
calls badcalls nullrecv badlen xdrcall dupchecks dupreqs
15835 0 0 0 0 772 0
Connectionless:
calls badcalls nullrecv badlen xdrcall dupchecks dupreqs
0 0 0 0 0 0 0
Server nfs:
calls badcalls public_v2 public_v3
15835 0 0 0
Version 2: (0 calls)
null getattr setattr root lookup readlink read
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
wrcache write create remove rename link symlink
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
mkdir rmdir readdir statfs
0 0% 0 0% 0 0% 0 0%
Version 3: (15835 calls)
null getattr setattr lookup access readlink read
7 0% 3033 19% 55 0% 1008 6% 1542 9% 20 0% 9000 56%
write create mkdir symlink mknod remove rmdir
175 1% 185 1% 0 0% 0 0% 0 0% 120 0% 0 0%
rename link readdir readdir+ fsstat fsinfo pathconf
87 0% 0 0% 1 0% 150 0% 348 2% 7 0% 0 0%
commit
97 0%
RPC 输出的服务器部分(-s)包括下列各项:
-
calls
- 从客户机接收到的 RPC 调用总数 badcalls
- 被 RPC 层拒绝的调用总数 nullrecv
- 被认为应该接收到而事实上没有捕获可用 RPC 调用的次数 badlen
- 包截断或包损坏(长度小于最小 RPC 调用标准长度的 RPC 调用数) xdrcall
- 报头无法由扩展数据表示(XDR)解码的 RPC 调用数 dupchecks
- 重复请求高速缓存中已查找过的 RPC 调用数 dupreqs
- 已发现的重复 RPC 调用数
输出结果中还同时显示了各类调用的数目和各自的百分比。
重复性检查是为那些不能在两次执行中返回同一结果的操作而提供的。这方面经典的例子是 rm 命令。第一个 rm 命令也许成功了,但是如果应答丢失了,客户机将会重发这个命令。我们希望这样的重复请求能获得成功,此时重复高速缓存被查询,如果发现是一个重复请求则相同的(成功的)结果被作为第二个重复请求的结果返回,就好像是由第一个请求所产生的结果一样。
通过查看不同类型操作调用的百分比(如 getattr()、read()、write()、readdir()),您可以决定要用哪一类的调优。例如:如果 getattr() 调用的百分比非常高的话,则调优属性高速缓存是可能会有效果的;如果 write() 调用的百分比过高的话,则磁盘和 LVM 调优就显得重要了;又如果 read() 调用百分比过高,则使用更多的内存用以缓冲文件就能提高性能。
NFS 客户机信息
NFS 客户机显示了已发送和被拒绝的调用数,同时显示已接收客户机句柄的次数(clgets)和各类调用的数目以及各自的百分比。
下例展示了 nfsstat 命令带 -c 参数选项时输出的客户机本分,如下:
# nfsstat -c
Client rpc:
Connection oriented
calls badcalls badxids timeouts newcreds badverfs timers
0 0 0 0 0 0 0
nomem cantconn interrupts
0 0 0
Connectionless
calls badcalls retrans badxids timeouts newcreds badverfs
6553 0 0 0 0 0 0
timers nomem cantsend
0 0 0
Client nfs:
calls badcalls clgets cltoomany
6541 0 0 0
Version 2: (6541 calls)
null getattr setattr root lookup readlink read
0 0% 590 9% 414 6% 0 0% 2308 35% 0 0% 0 0%
wrcache write create remove rename link symlink
0 0% 2482 37% 276 4% 277 4% 147 2% 0 0% 0 0%
mkdir rmdir readdir statfs
6 0% 6 0% 30 0% 5 0%
Version 3: (0 calls)
null getattr setattr lookup access readlink read
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
write create mkdir symlink mknod remove rmdir
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
rename link readdir readdir+ fsstat fsinfo pathconf
0 0% 0 0% 0 0% 0 0% 0 0% 0 0% 0 0%
commit
0 0%
RPC 输出的客户机部分(-c)包括下列各项:
-
calls
- 从客户机向 NFS 发出的调用总数。 badcalls
- 被 RPC 层拒绝的调用总数。 retrans
- 由于等待服务器响应而超时重发调用的次数。这仅适用于无连接传输中的 RPC 调用。 badxid
- 从服务器接收到响应但是没有任何一个未完成调用与之匹配的次数。这意味着服务器可能用了过多的时间来应答。 timeouts
- 由于等待服务器响应而使调用超时的次数。 newcreds
- 认证信息不得不被刷新的次数。 badverfs
- 由于响应中不正确的校验(verifier)而导致调用失败的次数。 timers
- 调用的超时时长大于或等于指定的最小调用超时值的次数。 nomem
- 由于内存分配失败而导致调用失败的次数。 cantconn
- 由于无法连接到服务器而导致调用失败的次数。 interrupts
- 调用在完成前被某个信号中断的次数。 cantsend
- 由于无法连接到客户机而导致发送失败的次数。
输出结果中还同时显示了各类调用的数目和各自的百分比。
考虑到性能监视上的问题,nfsstat -c 命令提供信息用以显示网络上是否存在丢弃 UDP 数据包的现象。如果一个网络无法处理某个包,则可能会丢弃它。数据包被丢弃可由以下因素引起:网络硬件的响应时间、网络软件的响应时间或服务器上超负载的 CPU。被丢弃的包并没有真正的丢失,因为一个替代请求会为其发送。
RPC 统计信息中的 retrans 列显示了由于等待响应而超时重发的请求数。这种情形就与丢弃 UDP 包有关。如果 retrans 这一项中的数目持续地超过第一列中调用总数的百分之五时,就表明存在问题,服务器已经不再能满足需求了。可在服务器上使用 vmstat、netpmon和 iostat 命令检查负载。
很大的 badxid 数目意味着请求被发到不同的 NFS 服务器上,但是服务器由于负载过重而没有能够在客户机的 RPC 调用超时重发之前给予响应。每当已发送的请求接收到一个重复的响应时 badxid 值就递增一(每个 RPC 请求在整个传输生命期内都保留有自己的 XID)。过多的重发请求对服务器产生了额外的压力,进一步使响应时间延长。如果 badxid 和 timeouts 的数目超过了总调用数的百分之五,可以用 smitty chnfsmnt 命令加大 NFS-mount 选项中的 timeo 参数。如果 badxid 是 0,is 0, 但 retrans 和 timeouts 相当大,可以尝试减少 NFS 缓冲区的大小(使用 mount 命令中的 rsize 和 wsize 选项)。
如果服务器是 CPU 绑定的(CPU-bound),NFS 和 它的守护进程会受到影响。要在这种情形下提高性能,服务器必须调优、升级或者用户可以让应用程序文件放置在本机上。如果服务器是 I/O 绑定的(I/O-bound),服务器文件系统可以被重新组织或者可以使用本地化的文件。
如果重发和超时的数目接近于同一个值时,可以确定包正在被丢弃。包很少在客户机端被丢弃。通常,包要么是在网络上被丢弃,要么是在服务器上被丢弃。 服务器可能在以下两种情况下丢弃包:当包从服务器接口驱动程序的发送队列中溢出时,或者当服务器的用户数据报协议(UDP)套接字缓冲区溢出时(nfs_socketsize)。如果在服务器上没有出现套接字缓冲区溢出 或 Oerrs ,同时客户机上又有许多的重发和超时,那么包可能就是在网络上被丢弃的。问题也许是出在传播媒介和网络设备上,比如路由器、桥接器或集线器。网络检漏器(network sniffer)以及其他的工具可被用来调试诊断这些问题。更详细的讨论请参见丢弃的包 :NONE.
在某些场合下,应用程序或用户经历了很差的性能,然而在用 nfsstat -c 命令检查时输出结果却显示超时和重发数目等于零或很少。这说明客户机从服务器接收响应的速度与请求的速度是一样快的。这时,首先要检查在客户机上运行的 biod 守护进程的数目是否适当的。该检查当一个应用程序正在锁定远程文件时仍然可测。当远程文件锁加在一个正服务于 NFS 的文件上时,客户机将关闭所有该文件在高速缓存上的数据和属性而转入一种完全同步的操作方式。结果就导致很慢的执行性能,不幸的是这种情况还十分的普遍。 包的锁定可以从 ipreport 的输出结果中通过查找 NLM 请求来识别。
nfsstat -m
:NONE.nfsstat -m 命令显示服务器名、服务器地址、mount(挂载)标志、当前读写大小、重发次数和每个客户机上 NFS mount 的动态重发次数,如下:
# nfsstat -m
/SAVE from /SAVE:itsorus.austin.ibm.com
Flags: vers=2,proto=udp,auth=unix,soft,intr,dynamic,rsize=8192,wsize=8192,retrans=5
Lookups: srtt=27 (67ms), dev=17 (85ms), cur=11 (220ms)
Reads: srtt=16 (40ms), dev=7 (35ms), cur=5 (100ms)
Writes: srtt=42 (105ms), dev=14 (70ms), cur=12 (240ms)
All: srtt=27 (67ms), dev=17 (85ms), cur=11 (220ms)
上例输出结果中圆括号内的数字是实际时间,单位是毫秒。其他的值是操作系统内核保留维护的无单位的值。您可以忽略这些无单位的值。上例分别显示出了查找、读、写和所有这些操作组合在一起(All)的响应时间。输出中用到的其他定义如下:
-
srtt
- 平滑往返时间(smoothed round-trip time) dev
- 估计偏差(estimated deviation) cur
- 当前补偿超时值(current backed-off timeout value)
netpmon 命令
有关该命令及其输出的讨论请参见 netpmon 命令。
nfso 命令
:NONE.nfso 命令用来配置 NFS 属性。可以设置或显示当前运行内核的网络选项。因此,这个命令必须在每个系统启动或网络配置后才能运行。
:NONE.nfso 的参数和各自的取值可以用 nfso -a 命令显示,如下:
(tremor:) # nfso -a
portcheck= 0
udpchecksum= 1
nfs_socketsize= 60000
nfs_tcp_socketsize= 60000
nfs_setattr_error= 0
nfs_gather_threshold= 4096
nfs_repeat_messages= 0
nfs_udp_duplicate_cache_size= 5000
nfs_tcp_duplicate_cache_size= 5000
nfs_server_base_priority= 0
nfs_dynamic_retrans= 1
nfs_iopace_pages= 0
nfs_max_connections= 1024
nfs_max_threads= 128
nfs_use_reserved_ports= 0
nfs_device_specific_bufs= 1
nfs_server_clread= 1
nfs_rfc1323= 1
nfs_max_write_size= 0
nfs_max_read_size= 0
nfs_allow_all_signals= 0
nfs_v2_pdts= 1
nfs_v3_pdts= 1
nfs_v2_vm_bufs= 1000
nfs_v3_vm_bufs= 1000
nfs_securenfs_authtimeout= 0
nfs_v3_server_readdirplus= 1
如果需要查阅有关这些属性的描述,请参见网络可调优参数。许多 NFS 属性是运行时属性(run-time attributes),它们是可以在任何时间被修改的。而要修改负载时属性(load time attributes),如 nfs_socketsize,就需要 NFS 先停下来而后再重新启动。
要显示或者修改一个指定的参数,可使用 nfso -o 命令,如下:
# nfso -o portcheck
portcheck= 0
# nfso -o portcheck=1
参数还可以重新设置成它们的缺省值,使用 -d 选项,如下:
# nfso -d portcheck
# nfso -o portcheck
portcheck= 0
NFS 参考
以下是与 NFS 有关的文件、命令、守护进程和子程序的摘要。需要详细信息,请参见 《AIX 5L V5.2 系统管理指南:通信与网络》 和 《AIX 5L V5.2 命令参考大全》。
网络文件系统(NFS)文件列表
以下是 NFS 文件列表,包括配置信息:
-
bootparams
- 列出了可以用来启动的无磁盘客户机 exports
- 列出了可以导出到 NFS 客户机的目录 networks
- 包含了因特网上的网络信息 pcnfsd.conf
- 为 rpc.pcnfsd 守护进程提供配置选项 rpc
- 包含了为远程过程调用(RPC)提供的数据库信息 xtab
- 列出了当前已经导出的目录 /etc/filesystems
- 列出了试图在系统重新启动时被 mount 的所有文件系统
NFS 命令列表
以下是 NFS 命令列表:
-
chnfs
- 启动指定数目的 biod 和 nfsd 守护进程 mknfs
- 配置系统使其运行 NFS 并且启动 NFS 守护进程 nfso
- 配置 NFS 网络选项 automount
- 自动 mount NFS 文件系统 chnfsexp
- 修改 NFS 导出(NFS-exported)目录的属性 chnfsmnt
- 修改 NFS 挂载(NFS-mounted)目录的属性 exportfs
- 导出目录到 NFS 客户机以及回收(unexport)目录 lsnfsexp
- 显示由 NFS 导出的目录特征 lsnfsmnt
- 显示已挂载(mounted)NFS 系统的特征 mknfsexp
- 使用 NFS 导出一个目录 mknfsmnt
- 使用 NFS 挂载一个目录 rmnfs
- 停止 NFS 守护进程 rmnfsexp
- 从服务器导出列表中删除 NFS 导出(NFS-exported)目录 rmnfsmnt
- 从客户机挂载列表中删除 NFS 挂载(NFS-mounted)文件系统
NFS 守护进程列表
以下是 NFC 锁定守护进程列表:
-
lockd
- 通过 RPC 包来处理锁定请求 statd
- 为 NFS 上的锁定服务提供崩溃恢复(crash-and-recovery)功能
以下是网络服务守护进程和实用工具的列表:
-
biod
- 发送客户机的读写请求至服务器 mountd
- 应答来自客户机的对文件系统的 mount 请求 nfsd
- 启动用以处理客户机对文件操作请求的守护进程 pcnfsd
- 处理来自 PC-NFS 客户机的服务请求 nfsstat
- 显示机器接收调用的性能信息 on
- 在远程机器上执行命令 portmap
- 将 RPC 程序端口号映射为因特网端口号 rexd
- 接收运行远程机器上程序的请求 rpcgen
- 生成 C 代码以实现一个 RPC 协议 rpcinfo
- 报告 RPC 服务器的状态 rstatd
- 返回从内核获得的性能统计信息 rup
- 显示本地网络上的一个远程主机的状态 rusers
- 报告已登录到远程机器上的用户列表 rusersd
- 响应 rusers 命令的请求 rwall
- 发送消息至网络上的所有用户 rwalld
- 处理 rwall 命令的请求 showmount
- 显示所有已挂载远程文件系统的客户机列表 spray
- 发送指定数目的包到一个主机 sprayd
- 接收由 spray 命令发来的包
以下是网络安全守护进程和实用工具列表:
-
chkey
- 修改用户的加密密钥(encryption key) keyenvoy
- 提供用户进程与密钥服务器之间的中介 keylogin
- 解密并存储用户的密钥(secret key) keyserv
- 存储公有和私有密钥 mkkeyserv
- 启动 keyserv 守护进程并将 /etc/rc.nfs 文件中适当的注释项改为非注释的 newkey
- 在公有密钥文件中创建一个新的密钥 rmkeyserv
- 停止 keyserv 守护进程并注释掉 /etc/rc。nfs 文件中为 keyserv 守护进程而设的项 ypupdated
- 更新网络信息服务(NIS)映象中的信息
以下是无磁盘客户机支持配置文件:
-
bootparamd
- 提供无磁盘客户机启动所需的信息
以下是 NFS 子程序列表:
-
cbc_crypt()、des_setparity() 或 ecb_crypt()
- 实现数据加密标准(DES)例行程序。