跳过导航链接 | |
退出打印视图 | |
系统管理指南:网络服务 Oracle Solaris 10 8/11 Information Library (简体中文) |
这些命令在解决 NFS 问题时会非常有用。
可以使用此命令来收集有关 NFS 和 RPC 连接的统计信息。该命令的语法如下:
nfsstat [ -cmnrsz ]
显示客户端信息
显示每个已挂载 NFS 文件系统的统计信息
指定要同时显示在客户端和服务器端的 NFS 信息
显示 RPC 统计信息
显示服务器端信息
指定应将统计信息设置为零
如果未在命令行中提供任何选项,则使用 -cnrs 选项。
向计算环境中添加新的软件或硬件时,收集服务器端统计信息对于调试问题非常重要。每周最少运行一次此命令并存储运行结果可以保留以前执行情况的完整历史记录。
请参阅以下示例:
# nfsstat -s Server rpc: Connection oriented: calls badcalls nullrecv badlen xdrcall dupchecks dupreqs 719949194 0 0 0 0 58478624 33 Connectionless: calls badcalls nullrecv badlen xdrcall dupchecks dupreqs 73753609 0 0 0 0 987278 7254 Server nfs: calls badcalls 787783794 3516 Version 2: (746607 calls) null getattr setattr root lookup readlink read 883 0% 60 0% 45 0% 0 0% 177446 23% 1489 0% 537366 71% wrcache write create remove rename link symlink 0 0% 1105 0% 47 0% 59 0% 28 0% 10 0% 9 0% mkdir rmdir readdir statfs 26 0% 0 0% 27926 3% 108 0% Version 3: (728863853 calls) null getattr setattr lookup access 1365467 0% 496667075 68% 8864191 1% 66510206 9% 19131659 2% readlink read write create mkdir 414705 0% 80123469 10% 18740690 2% 4135195 0% 327059 0% symlink mknod remove rmdir rename 101415 0% 9605 0% 6533288 0% 111810 0% 366267 0% link readdir readdirplus fsstat fsinfo 2572965 0% 519346 0% 2726631 0% 13320640 1% 60161 0% pathconf commit 13181 0% 6248828 0% Version 4: (54871870 calls) null compound 266963 0% 54604907 99% Version 4: (167573814 operations) reserved access close commit 0 0% 2663957 1% 2692328 1% 1166001 0% create delegpurge delegreturn getattr 167423 0% 0 0% 1802019 1% 26405254 15% getfh link lock lockt 11534581 6% 113212 0% 207723 0% 265 0% locku lookup lookupp nverify 230430 0% 11059722 6% 423514 0% 21386866 12% open openattr open_confirm open_downgrade 2835459 1% 4138 0% 18959 0% 3106 0% putfh putpubfh putrootfh read 52606920 31% 0 0% 35776 0% 4325432 2% readdir readlink remove rename 606651 0% 38043 0% 560797 0% 248990 0% renew restorefh savefh secinfo 2330092 1% 8711358 5% 11639329 6% 19384 0% setattr setclientid setclientid_confirm verify 453126 0% 16349 0% 16356 0% 2484 0% write release_lockowner illegal 3247770 1% 0 0% 0 0% Server nfs_acl: Version 2: (694979 calls) null getacl setacl getattr access getxattrdir 0 0% 42358 6% 0 0% 584553 84% 68068 9% 0 0% Version 3: (2465011 calls) null getacl setacl getxattrdir 0 0% 1293312 52% 1131 0% 1170568 47%
以上列出的是 NFS 服务器统计信息的示例。前五行与 RPC 有关,其余行则报告 NFS 活动。在两组统计信息中,了解 badcalls 或 calls 的平均数以及每周的调用次数有助于确定问题。badcalls 值报告来自客户机的错误消息数。该值可以表明网络硬件问题。
某些连接会在磁盘上生成写入活动。这些统计信息的突然增加可能表明出现了问题,应该对这一现象进行调查。对于 NFS 版本 2 的统计信息,要注意的连接包括 setattr、write、create、remove、rename、link、symlink、mkdir 和 rmdir。对于 NFS 版本 3 和版本 4 的统计信息,要注意 commit 的值。如果 commit 在某台 NFS 服务器中的级别高于在另一台几乎相同的服务器中的级别,请检查 NFS 客户机是否具有足够的内存。客户机没有可用资源时,服务器上的 commit 操作数将增加。
此命令可显示每个进程的栈跟踪。pstack 命令必须由相应进程的所有者或 root 运行。可以使用 pstack 来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的 PID。请参见 proc(1) 手册页。
以下示例检查正在运行的 nfsd 进程。
# /usr/bin/pgrep nfsd 243 # /usr/bin/pstack 243 243: /usr/lib/nfs/nfsd -a 16 ef675c04 poll (24d50, 2, ffffffff) 000115dc ???????? (24000, 132c4, 276d8, 1329c, 276d8, 0) 00011390 main (3, efffff14, 0, 0, ffffffff, 400) + 3c8 00010fb0 _start (0, 0, 0, 0, 0, 0) + 5c
此示例显示进程正在等待新的连接请求,这是正常响应。如果栈显示在发出请求之后进程仍在轮询,则此进程可能被挂起。请遵照如何重新启动 NFS 服务中的说明来解决此问题。请查看NFS 故障排除过程中的说明来充分验证问题是否是程序已挂起。
此命令可生成有关系统上正在运行的 RPC 服务的信息。另外,还可以使用此命令来更改 RPC 服务。许多选项都可用于此命令。请参见 rpcinfo(1M) 手册页。以下是可用于此命令的某些选项的简短概要。
rpcinfo [ -m | -s ] [ hostname ]
rpcinfo -T transport hostname [ progname ]
rpcinfo [ -t | -u ] [ hostname ] [ progname ]
显示 rpcbind 操作的统计信息表
显示所有已注册的 RPC 程序的简明列表
显示有关使用特定传输或协议的服务的信息
探测使用 TCP 的 RPC 程序
探测使用 UDP 的 RPC 程序
为服务选择传输或协议
选择需要其中信息的服务器的主机名
选择收集有关其信息的 RPC 程序
如果未指定 hostname 的值,则使用本地主机名。可以将 progname 替换为 RPC 程序编号,但是很多用户可能会记住名称而记不住编号。可以在不运行 NFS 版本 3 软件的系统上使用 -p 选项(而非 -s 选项)。
此命令生成的数据可包括以下内容:
RPC 程序编号
特定程序的版本号
正在使用的传输协议
RPC 服务的名称
RPC 服务的所有者
以下示例收集有关正在服务器上运行的 RPC 服务的信息。此命令生成的文本将通过 sort 命令过滤,以便使输出更具可读性。多个列出 RPC 服务的行已从本示例中删除。
% rpcinfo -s bee |sort -n program version(s) netid(s) service owner 100000 2,3,4 udp6,tcp6,udp,tcp,ticlts,ticotsord,ticots rpcbind superuser 100001 4,3,2 ticlts,udp,udp6 rstatd superuser 100002 3,2 ticots,ticotsord,tcp,tcp6,ticlts,udp,udp6 rusersd superuser 100003 3,2 tcp,udp,tcp6,udp6 nfs superuser 100005 3,2,1 ticots,ticotsord,tcp,tcp6,ticlts,udp,udp6 mountd superuser 100007 1,2,3 ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 ypbind superuser 100008 1 ticlts,udp,udp6 walld superuser 100011 1 ticlts,udp,udp6 rquotad superuser 100012 1 ticlts,udp,udp6 sprayd superuser 100021 4,3,2,1 tcp,udp,tcp6,udp6 nlockmgr superuser 100024 1 ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 status superuser 100029 3,2,1 ticots,ticotsord,ticlts keyserv superuser 100068 5 tcp,udp cmsd superuser 100083 1 tcp,tcp6 ttdbserverd superuser 100099 3 ticotsord autofs superuser 100133 1 ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 - superuser 100134 1 ticotsord tokenring superuser 100155 1 ticots,ticotsord,tcp,tcp6 smserverd superuser 100221 1 tcp,tcp6 - superuser 100227 3,2 tcp,udp,tcp6,udp6 nfs_acl superuser 100229 1 tcp,tcp6 metad superuser 100230 1 tcp,tcp6 metamhd superuser 100231 1 ticots,ticotsord,ticlts - superuser 100234 1 ticotsord gssd superuser 100235 1 tcp,tcp6 - superuser 100242 1 tcp,tcp6 metamedd superuser 100249 1 ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 - superuser 300326 4 tcp,tcp6 - superuser 300598 1 ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 - superuser 390113 1 tcp - unknown 805306368 1 ticots,ticotsord,ticlts,tcp,udp,tcp6,udp6 - superuser 1289637086 1,5 tcp - 26069
以下两个示例说明如何通过在服务器上选择特定的传输来收集有关特定 RPC 服务的信息。第一个示例检查通过 TCP 运行的 mountd 服务。第二个示例检查通过 UDP 运行的 NFS 服务。
% rpcinfo -t bee mountd program 100005 version 1 ready and waiting program 100005 version 2 ready and waiting program 100005 version 3 ready and waiting % rpcinfo -u bee nfs program 100003 version 2 ready and waiting program 100003 version 3 ready and waiting
此命令通常用于查看网络中的包。必须以 root 身份运行 snoop 命令。使用此命令是一种确保网络硬件在客户机和服务器上都正常运行的好方法。可以使用许多选项。请参见 snoop(1M) 手册页。以下是此命令的简短概要:
snoop [ -d device ] [ -o filename ] [ host hostname ]
指定本地网络接口
将所有捕获到的包存储在已命名的文件中
显示仅进出特定主机的包
-d device 选项在具有多个网络接口的服务器上非常有用。除了设置主机之外,还可以使用许多表达式。命令表达式与 grep 的组合通常可以生成极其有用的数据。
排除故障时,请确保包进出相应的主机。另外,还应查找错误消息。将包保存到文件中可以简化查看数据的过程。
使用此命令可以检查某个进程是否已被挂起。truss 命令必须由相应进程的所有者或由 root 运行。可以将许多选项用于此命令。请参见 truss(1) 手册页。以下是此命令的简短语法。
truss [ -t syscall ] -p pid
选择要跟踪的系统调用
指明要跟踪的进程的 PID
syscall 可以是要跟踪的系统调用的列表,各系统调用之间以逗号分隔。另外,在 syscall 前面添加 ! 可选择不跟踪所列出的系统调用。
本示例说明进程正在等待来自新客户机的另一个连接请求。
# /usr/bin/truss -p 243 poll(0x00024D50, 2, -1) (sleeping...)
以上示例表示一个正常响应。如果在发出新连接请求之后该响应未发生更改,则此进程可能会被挂起。请遵照如何重新启动 NFS 服务中的说明来修复被挂起的程序。请查看NFS 故障排除过程中的说明来充分验证问题是否是程序已挂起。