initial import
This commit is contained in:
parent
e3e0eb7656
commit
e8fb7b288e
43 changed files with 14946 additions and 0 deletions
248
md/nfs_debugging.md
Normal file
248
md/nfs_debugging.md
Normal file
|
|
@ -0,0 +1,248 @@
|
|||
# NFS Debugging
|
||||
|
||||
## Contents
|
||||
|
||||
- [Userspace Tools](#userspace-tools)
|
||||
- [Kernel Interfaces](#kernel-interfaces)
|
||||
- [NFSD debug flags](#nfsd-debug-flags)
|
||||
- [NFS debug flags](#nfs-debug-flags)
|
||||
- [NLM debug flags](#nlm-debug-flags)
|
||||
- [RPC debug flags](#rpc-debug-flags)
|
||||
- [General Notes](#general-notes)
|
||||
- [References](#references)
|
||||
- [Bugs](#bugs)
|
||||
|
||||
|
||||
## Userspace Tools
|
||||
|
||||
Using `rpcdebug` is the easiest way to manipulate the kernel interfaces in place of echoing bitmasks to `/proc`.
|
||||
|
||||
| **Option** | **Description** |
|
||||
| ----------- | --------------------------------------------- |
|
||||
| `-c` | Clear the given debug flags |
|
||||
| `-s` | Set the given debug flags |
|
||||
| `-m module` | Specify which module's flags to set or clear. |
|
||||
| `-v` | Increase the verbosity of rpcdebug's output |
|
||||
| `-h` | Print a help message and exit |
|
||||
| `-vh` | Print the available debug flags |
|
||||
|
||||
For the `-m` option, the available modules are:
|
||||
|
||||
| **Module** | **Description** |
|
||||
| ---------- | ------------------------------------------------------------- |
|
||||
| nfsd | The NFS server |
|
||||
| nfs | The NFS client |
|
||||
| nlm | The Network Lock Manager, in either an NFS client or server |
|
||||
| rpc | The Remote Procedure Call module, either NFS client or server |
|
||||
|
||||
Examples:
|
||||
|
||||
```
|
||||
rpcdebug -m rpc -s all # sets all debug flags for RPC
|
||||
rpcdebug -m rpc -c all # clears all debug flags for RPC
|
||||
|
||||
rpcdebug -m nfsd -s all # sets all debug flags for NFS Server
|
||||
rpcdebug -m nfsd -c all # clears all debug flags for NFS Server
|
||||
```
|
||||
|
||||
|
||||
## Kernel Interfaces
|
||||
|
||||
A bitmask of the debug flags can be echoed into the interface to enable output to syslog; 0 is the default:
|
||||
|
||||
```
|
||||
/proc/sys/sunrpc/nfsd_debug
|
||||
/proc/sys/sunrpc/nfs_debug
|
||||
/proc/sys/sunrpc/nlm_debug
|
||||
/proc/sys/sunrpc/rpc_debug
|
||||
```
|
||||
|
||||
Sysctl controls are registered for these interfaces, so they can be used instead of echo:
|
||||
|
||||
```
|
||||
sysctl -w sunrpc.rpc_debug=1023
|
||||
sysctl -w sunrpc.rpc_debug=0
|
||||
|
||||
sysctl -w sunrpc.nfsd_debug=1023
|
||||
sysctl -w sunrpc.nfsd_debug=0
|
||||
```
|
||||
|
||||
At runtime the server holds information that can be examined:
|
||||
|
||||
```
|
||||
grep . /proc/net/rpc/*/content
|
||||
cat /proc/fs/nfs/exports
|
||||
cat /proc/net/rpc/nfsd
|
||||
ls -l /proc/fs/nfsd
|
||||
```
|
||||
|
||||
A rundown of `/proc/net/rpc/nfsd` (the userspace tool `nfsstat` pretty-prints this info):
|
||||
|
||||
```
|
||||
/proc/net/rpc/nfsd
|
||||
|
||||
* rc (reply cache): <hits> <misses> <nocache>
|
||||
- hits: client it's retransmitting
|
||||
- misses: a operation that requires caching
|
||||
- nocache: a operation that no requires caching
|
||||
|
||||
* fh (filehandle): <stale> <total-lookups> <anonlookups> <dir-not-in-cache> <nodir-not-in-cache>
|
||||
- stale: file handle errors
|
||||
- total-lookups, anonlookups, dir-not-in-cache, nodir-not-in-cache
|
||||
. always seem to be zeros
|
||||
|
||||
* io (input/output): <bytes-read> <bytes-written>
|
||||
- bytes-read: bytes read directly from disk
|
||||
- bytes-written: bytes written to disk
|
||||
|
||||
* th (threads): <threads> <fullcnt> <10%-20%> <20%-30%> ... <90%-100%> <100%>
|
||||
- threads: number of nfsd threads
|
||||
- fullcnt: number of times that the last 10% of threads are busy
|
||||
- 10%-20%, 20%-30% ... 90%-100%: 10 numbers representing 10-20%, 20-30% to 100%
|
||||
. Counts the number of times a given interval are busy
|
||||
|
||||
* ra (read-ahead): <cache-size> <10%> <20%> ... <100%> <not-found>
|
||||
- cache-size: always the double of number threads
|
||||
- 10%, 20% ... 100%: how deep it found what was looking for
|
||||
- not-found: not found in the read-ahead cache
|
||||
|
||||
* net: <netcnt> <netudpcnt> <nettcpcnt> <nettcpconn>
|
||||
- netcnt: counts every read
|
||||
- netudpcnt: counts every UDP packet it receives
|
||||
- nettcpcnt: counts every time it receives data from a TCP connection
|
||||
- nettcpconn: count every TCP connection it receives
|
||||
|
||||
* rpc: <rpccnt> <rpcbadfmt+rpcbadauth+rpcbadclnt> <rpcbadfmt> <rpcbadauth> <rpcbadclnt>
|
||||
- rpccnt: counts all rpc operations
|
||||
- rpcbadfmt: counts if while processing a RPC it encounters the following errors:
|
||||
. err_bad_dir, err_bad_rpc, err_bad_prog, err_bad_vers, err_bad_proc, err_bad
|
||||
- rpcbadauth: bad authentication
|
||||
. does not count if you try to mount from a machine that it's not in your exports file
|
||||
- rpcbadclnt: unused
|
||||
|
||||
* procN (N = vers): <vs_nproc> <null> <getattr> <setattr> <lookup> <access> <readlink> <read> <write> <create> <mkdir> <symlink> <mknod> <remove> <rmdir> <rename> <link> <readdir> <readdirplus> <fsstat> <fsinfo> <pathconf> <commit>
|
||||
- vs_nproc: number of procedures for NFS version
|
||||
. v2: nfsproc.c, 18
|
||||
. v3: nfs3proc.c, 22
|
||||
- v4, nfs4proc.c, 2
|
||||
- statistics: generated from NFS operations at runtime
|
||||
|
||||
* proc4ops: <ops> <x..y>
|
||||
- ops: the definition of LAST_NFS4_OP, OP_RELEASE_LOCKOWNER = 39, plus 1 (so 40); defined in nfs4.h
|
||||
- x..y: the array of nfs_opcount up to LAST_NFS4_OP (nfsdstats.nfs4_opcount[i])
|
||||
```
|
||||
|
||||
|
||||
## NFSD debug flags
|
||||
|
||||
```
|
||||
/usr/include/linux/nfsd/debug.h (kernel 3.13.5)
|
||||
|
||||
/*
|
||||
* knfsd debug flags
|
||||
*/
|
||||
#define NFSDDBG_SOCK 0x0001
|
||||
#define NFSDDBG_FH 0x0002
|
||||
#define NFSDDBG_EXPORT 0x0004
|
||||
#define NFSDDBG_SVC 0x0008
|
||||
#define NFSDDBG_PROC 0x0010
|
||||
#define NFSDDBG_FILEOP 0x0020
|
||||
#define NFSDDBG_AUTH 0x0040
|
||||
#define NFSDDBG_REPCACHE 0x0080
|
||||
#define NFSDDBG_XDR 0x0100
|
||||
#define NFSDDBG_LOCKD 0x0200
|
||||
#define NFSDDBG_ALL 0x7FFF
|
||||
#define NFSDDBG_NOCHANGE 0xFFFF
|
||||
```
|
||||
|
||||
|
||||
## NFS debug flags
|
||||
|
||||
```
|
||||
/usr/include/linux/nfs_fs.h (kernel 3.13.5)
|
||||
|
||||
/*
|
||||
* NFS debug flags
|
||||
*/
|
||||
#define NFSDBG_VFS 0x0001
|
||||
#define NFSDBG_DIRCACHE 0x0002
|
||||
#define NFSDBG_LOOKUPCACHE 0x0004
|
||||
#define NFSDBG_PAGECACHE 0x0008
|
||||
#define NFSDBG_PROC 0x0010
|
||||
#define NFSDBG_XDR 0x0020
|
||||
#define NFSDBG_FILE 0x0040
|
||||
#define NFSDBG_ROOT 0x0080
|
||||
#define NFSDBG_CALLBACK 0x0100
|
||||
#define NFSDBG_CLIENT 0x0200
|
||||
#define NFSDBG_MOUNT 0x0400
|
||||
#define NFSDBG_FSCACHE 0x0800
|
||||
#define NFSDBG_PNFS 0x1000
|
||||
#define NFSDBG_PNFS_LD 0x2000
|
||||
#define NFSDBG_STATE 0x4000
|
||||
#define NFSDBG_ALL 0xFFFF
|
||||
```
|
||||
|
||||
|
||||
## NLM debug flags
|
||||
|
||||
```
|
||||
/usr/include/linux/lockd/debug.h (kernel 3.13.5)
|
||||
|
||||
/*
|
||||
* Debug flags
|
||||
*/
|
||||
#define NLMDBG_SVC 0x0001
|
||||
#define NLMDBG_CLIENT 0x0002
|
||||
#define NLMDBG_CLNTLOCK 0x0004
|
||||
#define NLMDBG_SVCLOCK 0x0008
|
||||
#define NLMDBG_MONITOR 0x0010
|
||||
#define NLMDBG_CLNTSUBS 0x0020
|
||||
#define NLMDBG_SVCSUBS 0x0040
|
||||
#define NLMDBG_HOSTCACHE 0x0080
|
||||
#define NLMDBG_XDR 0x0100
|
||||
#define NLMDBG_ALL 0x7fff
|
||||
```
|
||||
|
||||
|
||||
## RPC debug flags
|
||||
|
||||
```
|
||||
/usr/include/linux/sunrpc/debug.h (kernel 3.13.5)
|
||||
|
||||
/*
|
||||
* RPC debug facilities
|
||||
*/
|
||||
#define RPCDBG_XPRT 0x0001
|
||||
#define RPCDBG_CALL 0x0002
|
||||
#define RPCDBG_DEBUG 0x0004
|
||||
#define RPCDBG_NFS 0x0008
|
||||
#define RPCDBG_AUTH 0x0010
|
||||
#define RPCDBG_BIND 0x0020
|
||||
#define RPCDBG_SCHED 0x0040
|
||||
#define RPCDBG_TRANS 0x0080
|
||||
#define RPCDBG_SVCXPRT 0x0100
|
||||
#define RPCDBG_SVCDSP 0x0200
|
||||
#define RPCDBG_MISC 0x0400
|
||||
#define RPCDBG_CACHE 0x0800
|
||||
#define RPCDBG_ALL 0x7fff
|
||||
```
|
||||
|
||||
|
||||
## General Notes
|
||||
|
||||
- While the number of threads can be increased at runtime via an echo to `/proc/fs/nfsd/threads`, the cache size (double the threads, see the `ra` line of /proc/net/rpc/nfsd) is not dynamic. The NFS daemon must be restarted with the new thread size during initialization (`/etc/sysconfig/nfs` on RHEL and CentOS) in order for the thread cache to properly adjust.
|
||||
|
||||
|
||||
## References
|
||||
|
||||
- <https://github.com/torvalds/linux/tree/master/include/linux>
|
||||
- <http://linux.die.net/man/8/rpcdebug>
|
||||
- <http://utcc.utoronto.ca/~cks/space/blog/linux/NFSClientDebuggingBits>
|
||||
- <http://www.novell.com/support/kb/doc.php?id=7011571>
|
||||
- <http://stromberg.dnsalias.org/~strombrg/NFS-troubleshooting-2.html>
|
||||
- <http://www.opensubscriber.com/message/nfs@lists.sourceforge.net/7833588.html>
|
||||
|
||||
|
||||
## Bugs
|
||||
|
||||
- <https://bugzilla.redhat.com/show_bug.cgi?id=465412>
|
||||
Loading…
Add table
Add a link
Reference in a new issue