系统管理指南:网络服务

用于解决 NFS 问题的命令

这些命令在解决 NFS 问题时会非常有用。

nfsstat 命令

可以使用此命令来收集有关 NFS 和 RPC 连接的统计信息。此命令的语法如下:

nfsstat [ -cmnrsz ]

-c

显示客户端信息

-m

显示每个已挂载 NFS 文件系统的统计信息

-n

指定要同时显示在客户端和服务器端的 NFS 信息

-r

显示 RPC 统计信息

-s

显示服务器端信息

-z

指定应将统计信息设置为零

如果未在命令行中提供任何选项,则使用 -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 活动。在两组统计信息中,了解 badcallscalls 的平均数以及每周的调用次数有助于确定问题。badcalls 值报告来自客户机的错误消息数。该值可以表明网络硬件问题。

某些连接会在磁盘上执行写操作。这些统计信息的突然增加可能表明出现了问题,应该对这一现象进行调查。对于 NFS 版本 2 的统计信息,要注意的连接包括 setattrwritecreateremoverenamelinksymlinkmkdirrmdir。对于 NFS 版本 3 和版本 4 的统计信息,要注意的值为 commit。如果 commit 在一台 NFS 服务器中的级别高于在另一台几乎相同的服务器中的级别,请检查 NFS 客户机是否具有足够的内存。客户机没有可用资源时,服务器上的 commit 操作数将增加。

pstack 命令

此命令可显示每个进程的栈跟踪。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 疑难解答过程中的说明来充分验证问题是否是程序已挂起。

rpcinfo 命令

此命令可生成有关系统上正在运行的 RPC 服务的信息。另外,还可以使用此命令来更改 RPC 服务。许多选项都可用于此命令。请参见 rpcinfo(1M) 手册页。以下是可用于此命令的某些选项的简短概要。

rpcinfo [ -m | -s ] [ hostname ]

rpcinfo -T transport hostname [ progname ]

rpcinfo [ -t | -u ] [ hostname ] [ progname ]

-m

显示 rpcbind 操作的统计信息表

-s

显示所有已注册的 RPC 程序的简表

-T

显示有关使用特定传输或协议的服务的信息

-t

探测使用 TCP 的 RPC 程序

-u

探测使用 UDP 的 RPC 程序

transport

为服务选择传输或协议

hostname

选择需要其中信息的服务器的主机名

progname

选择收集有关其信息的 RPC 程序

如果未指定 hostname 的值,则使用本地主机名。可以将 progname 替换为 RPC 程序编号,但是很多用户可能会记住名称而记不住编号。可以在未运行 NFS 版本 3 软件的系统上使用 -p 选项替换 -s 选项。

此命令生成的数据可包括以下内容:

以下示例收集有关正在服务器上运行的 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

snoop 命令

此命令通常用于查看网络中的包。必须以 root 身份运行 snoop 命令。使用此命令是一种确保网络硬件在客户机和服务器上都正常运行的好方法。可以使用许多选项。请参见 snoop(1M) 手册页。以下是此命令的简短概要:

snoop [ -d device ] [ -o filename ] [ host hostname ]

-d device

指定本地网络接口

-o filename

将所有捕获到的包存储在指定的文件中

hostname

显示仅进出特定主机的包

-d device 选项在那些具有多个网络接口的服务器上非常有用。除了设置主机之外,还可以使用许多表达式。命令表达式与 grep 的组合通常可以生成极其有用的数据。

排除故障时,请确保适当的主机中有包进出。另外,还应查找错误消息。将包保存到文件中可以简化检查数据的过程。

truss 命令

使用此命令可以检查某个进程是否已被挂起。truss 命令必须由相应进程的属主或 root 运行。可以将许多选项用于此命令。请参见 truss(1) 手册页。以下是此命令的简短语法:

truss [ -t syscall ] -p pid

-t syscall

选择要跟踪的系统调用

-p pid

指明要跟踪的进程的 PID

syscall 可以列出要跟踪的系统调用,各系统调用之间以逗号分隔。另外,在 syscall 前面添加 ! 可选择不跟踪所列出的系统调用。

本示例说明进程正在等待来自新客户机的另一个连接请求。


# /usr/bin/truss -p 243

poll(0x00024D50, 2, -1)         (sleeping...)

以上示例表示一个正常响应。如果在发出新连接请求之后该响应未发生变化,则此进程可能会被挂起。请遵照如何重新启动 NFS 服务中的说明来修复被挂起的程序。请检查NFS 疑难解答过程中的说明来充分验证问题是否是程序已挂起。