xref: /freebsd/usr.sbin/nfsdtop/nfsdtop.8 (revision 60c7313074b93adf4ea70ff44b78b3b4fc15c29f)
1*60c73130SDevin Teske.\"
2*60c73130SDevin Teske.\" SPDX-License-Identifier: BSD-2-Clause
3*60c73130SDevin Teske.\"
4*60c73130SDevin Teske.\" Copyright (c) 2020, 2026 Devin Teske <dteske@FreeBSD.org>
5*60c73130SDevin Teske.\"
6*60c73130SDevin Teske.Dd September 4, 2026
7*60c73130SDevin Teske.Dt NFSDTOP 8
8*60c73130SDevin Teske.Os
9*60c73130SDevin Teske.Sh NAME
10*60c73130SDevin Teske.Nm nfsdtop
11*60c73130SDevin Teske.Nd display top-like NFS server I/O statistics
12*60c73130SDevin Teske.Sh SYNOPSIS
13*60c73130SDevin Teske.Nm
14*60c73130SDevin Teske.Op Fl aDdhnoqRrvw
15*60c73130SDevin Teske.Op Fl b | Fl j | Fl J
16*60c73130SDevin Teske.Op Fl C Ar ip
17*60c73130SDevin Teske.Op Fl c | Fl g | Fl u
18*60c73130SDevin Teske.Op Fl G Ar group
19*60c73130SDevin Teske.Op Fl I Ar file
20*60c73130SDevin Teske.Op Fl i Ar sec
21*60c73130SDevin Teske.Op Fl N Ar num
22*60c73130SDevin Teske.Op Fl P Ar file
23*60c73130SDevin Teske.Op Fl p Ar file
24*60c73130SDevin Teske.Op Fl U Ar user
25*60c73130SDevin Teske.Sh DESCRIPTION
26*60c73130SDevin TeskeThe
27*60c73130SDevin Teske.Nm
28*60c73130SDevin Teskeutility uses
29*60c73130SDevin Teske.Xr dtrace 1
30*60c73130SDevin Tesketo display a periodically updated table of NFS
31*60c73130SDevin Teskeserver read and write activity.
32*60c73130SDevin TeskeStatistics are taken from the
33*60c73130SDevin Teske.Xr nfsd 8
34*60c73130SDevin Teskeread and write paths
35*60c73130SDevin Teske.Pq Fn nfsrvd_read , Fn nfsvno_read , Fn nfsrvd_write , and Fn nfsvno_write
36*60c73130SDevin Teskeand coalesced by a chosen
37*60c73130SDevin Teske.Em view .
38*60c73130SDevin Teske.Pp
39*60c73130SDevin TeskeOnly the root user or users with
40*60c73130SDevin Teske.Xr dtrace 1
41*60c73130SDevin Teskeprivileges can run this command.
42*60c73130SDevin Teske.Pp
43*60c73130SDevin TeskeA view selects the first column of the display.
44*60c73130SDevin TeskeThe default is the user view
45*60c73130SDevin Teske.Pq Ql Fl u ,
46*60c73130SDevin Teskewhere each row is a UID
47*60c73130SDevin Teske.Pq or user name .
48*60c73130SDevin TeskeThe group view
49*60c73130SDevin Teske.Pq Ql Fl g
50*60c73130SDevin Teskeand client view
51*60c73130SDevin Teske.Pq Ql Fl c
52*60c73130SDevin Teskeinstead coalesce by GID or IPv4 client address.
53*60c73130SDevin TeskeWithout
54*60c73130SDevin Teske.Ql Fl j ,
55*60c73130SDevin Teskethe last of
56*60c73130SDevin Teske.Ql Fl c ,
57*60c73130SDevin Teske.Ql Fl g ,
58*60c73130SDevin Teskeor
59*60c73130SDevin Teske.Ql Fl u
60*60c73130SDevin Teskewins.
61*60c73130SDevin Teske.Pp
62*60c73130SDevin TeskeUIDs, GIDs, and IPv4 addresses shown in a view are taken from NFS client
63*60c73130SDevin Teskecredentials and addresses on the
64*60c73130SDevin Teske.Xr nfsd 8
65*60c73130SDevin Teskepaths.
66*60c73130SDevin TeskeThey often cannot be resolved on the nfsd host, so
67*60c73130SDevin Teske.Nm
68*60c73130SDevin Teskedoes not use
69*60c73130SDevin Teske.Xr getent 1
70*60c73130SDevin Tesketo name them as traffic is sampled; that lookup would likely be useless.
71*60c73130SDevin TeskeThe map files described in
72*60c73130SDevin Teske.Sx FILES
73*60c73130SDevin Teskesupply those names.
74*60c73130SDevin TeskeCommand-line filters are different.
75*60c73130SDevin TeskeA name given to
76*60c73130SDevin Teske.Ql Fl U ,
77*60c73130SDevin Teske.Ql Fl G ,
78*60c73130SDevin Teskeor
79*60c73130SDevin Teske.Ql Fl C
80*60c73130SDevin Teskeis resolved once, first from the same map files and then via
81*60c73130SDevin Teske.Xr getent 1
82*60c73130SDevin Teskeor
83*60c73130SDevin Teske.Xr host 1 ,
84*60c73130SDevin Teskeso the resulting UID, GID, or address can be compiled into the
85*60c73130SDevin Teske.Xr dtrace 1
86*60c73130SDevin Teskepredicates.
87*60c73130SDevin Teske.Pp
88*60c73130SDevin TeskeEach interval prints a header followed by a
89*60c73130SDevin Teske.Ql total
90*60c73130SDevin Teskerow and per-key rows sorted by combined read and write volume.
91*60c73130SDevin TeskeColumns are the view key,
92*60c73130SDevin Teskecombined TOTAL,
93*60c73130SDevin TeskeWRITE(IN),
94*60c73130SDevin Teskean optional bar,
95*60c73130SDevin Teskeand READ(OUT).
96*60c73130SDevin TeskeValues are humanized bandwidth
97*60c73130SDevin Teske.Pq bytes per second
98*60c73130SDevin Teskeunless
99*60c73130SDevin Teske.Ql Fl b
100*60c73130SDevin Teskeis given.
101*60c73130SDevin TeskeWhen standard output is a terminal,
102*60c73130SDevin Teskethe screen is redrawn in place and
103*60c73130SDevin Teske.Dv SIGWINCH
104*60c73130SDevin Teskeresizes the layout.
105*60c73130SDevin Teske.Sh OPTIONS
106*60c73130SDevin Teske.Bl -tag -width "-I file"
107*60c73130SDevin Teske.It Fl a
108*60c73130SDevin TeskeAlways enable color,
109*60c73130SDevin Teskeeven when standard output is not a terminal.
110*60c73130SDevin Teske.It Fl b
111*60c73130SDevin TeskeShow bytes transferred during the interval instead of bandwidth.
112*60c73130SDevin TeskeCannot be combined with
113*60c73130SDevin Teske.Ql Fl j
114*60c73130SDevin Teskeor
115*60c73130SDevin Teske.Ql Fl J .
116*60c73130SDevin Teske.It Fl C Ar ip
117*60c73130SDevin TeskeClient filter.
118*60c73130SDevin TeskeOnly count I/O for the given IPv4 address or hostname
119*60c73130SDevin Teske.Pq IPv4 only .
120*60c73130SDevin TeskeA hostname given here is resolved once from the IP map
121*60c73130SDevin Teske.Pq see Fl I
122*60c73130SDevin Teskeor
123*60c73130SDevin Teske.Xr host 1 .
124*60c73130SDevin Teske.It Fl c
125*60c73130SDevin TeskeView read/write activity by client.
126*60c73130SDevin Teske.It Fl D
127*60c73130SDevin TeskeEnable debugger.
128*60c73130SDevin TeskePrint raw
129*60c73130SDevin Teske.Xr dtrace 1
130*60c73130SDevin Teskeoutput and additional post-processor diagnostics.
131*60c73130SDevin Teske.It Fl d
132*60c73130SDevin TeskeDebug.
133*60c73130SDevin TeskePrint the generated
134*60c73130SDevin Teske.Xr dtrace 1
135*60c73130SDevin Teskescript to standard output and exit.
136*60c73130SDevin Teske.It Fl G Ar group
137*60c73130SDevin TeskeGroup filter.
138*60c73130SDevin TeskeOnly count I/O for the given group name or GID.
139*60c73130SDevin TeskeA name given here is resolved once from the group map
140*60c73130SDevin Teske.Pq see Fl P
141*60c73130SDevin Teskeor
142*60c73130SDevin Teske.Xr getent 1 .
143*60c73130SDevin Teske.It Fl g
144*60c73130SDevin TeskeView read/write activity by group.
145*60c73130SDevin Teske.It Fl h
146*60c73130SDevin TeskePrint usage statement and exit.
147*60c73130SDevin Teske.It Fl I Ar file
148*60c73130SDevin TeskeIP map file for naming observed client addresses
149*60c73130SDevin Teske.Pq see DESCRIPTION .
150*60c73130SDevin TeskeDefault
151*60c73130SDevin Teske.Pa .nfsd.hosts
152*60c73130SDevin Teskein the current directory.
153*60c73130SDevin TeskeEach non-comment line is an IPv4 address followed by a hostname.
154*60c73130SDevin Teske.It Fl i Ar sec
155*60c73130SDevin TeskeSet interval seconds.
156*60c73130SDevin TeskeDefault
157*60c73130SDevin Teske.Ql 2.0 .
158*60c73130SDevin TeskeMust be at least 0.001.
159*60c73130SDevin Teske.It Fl J
160*60c73130SDevin TeskeOutput JSON for the client, group, and user views.
161*60c73130SDevin TeskeSame as
162*60c73130SDevin Teske.Ql Fl jcgu .
163*60c73130SDevin Teske.It Fl j
164*60c73130SDevin TeskeOutput JSON formatted data.
165*60c73130SDevin TeskeEach interval emits one object for the view total and one object per key.
166*60c73130SDevin TeskeObjects contain
167*60c73130SDevin Teske.Li time ,
168*60c73130SDevin Teske.Li ident ,
169*60c73130SDevin Teske.Li total_bytes ,
170*60c73130SDevin Teske.Li total_rate ,
171*60c73130SDevin Teske.Li read_bytes ,
172*60c73130SDevin Teske.Li read_rate ,
173*60c73130SDevin Teske.Li write_bytes ,
174*60c73130SDevin Teskeand
175*60c73130SDevin Teske.Li write_rate .
176*60c73130SDevin Teske.It Fl N Ar num
177*60c73130SDevin TeskePerform
178*60c73130SDevin Teske.Ar num
179*60c73130SDevin Teskesamples and exit.
180*60c73130SDevin Teske.It Fl n
181*60c73130SDevin TeskeDo not map observed UIDs, GIDs, or IPs through the map files.
182*60c73130SDevin Teske.It Fl o
183*60c73130SDevin TeskeForce non-console output.
184*60c73130SDevin TeskeDisable screen redraw and color.
185*60c73130SDevin Teske.It Fl P Ar file
186*60c73130SDevin TeskeGroup map file for naming observed GIDs
187*60c73130SDevin Teske.Pq see DESCRIPTION .
188*60c73130SDevin TeskeDefault
189*60c73130SDevin Teske.Pa .nfsd.group
190*60c73130SDevin Teskein the current directory.
191*60c73130SDevin TeskeFormat is
192*60c73130SDevin Teske.Xr group 5 .
193*60c73130SDevin Teske.It Fl p Ar file
194*60c73130SDevin TeskeUser map file for naming observed UIDs
195*60c73130SDevin Teske.Pq see DESCRIPTION .
196*60c73130SDevin TeskeDefault
197*60c73130SDevin Teske.Pa .nfsd.passwd
198*60c73130SDevin Teskein the current directory.
199*60c73130SDevin TeskeFormat is
200*60c73130SDevin Teske.Xr passwd 5 .
201*60c73130SDevin Teske.It Fl q
202*60c73130SDevin TeskeQuiet.
203*60c73130SDevin TeskeHide informational messages.
204*60c73130SDevin Teske.It Fl R
205*60c73130SDevin TeskeRedact potentially sensitive information.
206*60c73130SDevin TeskeUser, group, and client names that are not well-known system accounts are
207*60c73130SDevin Teskereplaced with random strings of the same length.
208*60c73130SDevin TeskeMay also be enabled by setting
209*60c73130SDevin Teske.Ev NFSDTOP_REDACT
210*60c73130SDevin Teskein the environment.
211*60c73130SDevin Teske.It Fl r
212*60c73130SDevin TeskeRaw view.
213*60c73130SDevin TeskeDo not format output of
214*60c73130SDevin Teske.Xr dtrace 1 .
215*60c73130SDevin Teske.It Fl U Ar user
216*60c73130SDevin TeskeUser filter.
217*60c73130SDevin TeskeOnly count I/O for the given user name or UID.
218*60c73130SDevin TeskeA name given here is resolved once from the user map
219*60c73130SDevin Teske.Pq see Fl p
220*60c73130SDevin Teskeor
221*60c73130SDevin Teske.Xr getent 1 .
222*60c73130SDevin Teske.It Fl u
223*60c73130SDevin TeskeView read/write activity by user
224*60c73130SDevin Teske.Pq default .
225*60c73130SDevin Teske.It Fl v
226*60c73130SDevin TeskePrint version and exit.
227*60c73130SDevin Teske.It Fl w
228*60c73130SDevin TeskeWide view.
229*60c73130SDevin TeskeMaximize width of the first column.
230*60c73130SDevin Teske.El
231*60c73130SDevin Teske.Sh ENVIRONMENT
232*60c73130SDevin Teske.Bl -tag -width NFSDTOP_REDACT
233*60c73130SDevin Teske.It Ev NFSDTOP_REDACT
234*60c73130SDevin TeskeIf set to a non-empty value, enable redaction as with
235*60c73130SDevin Teske.Ql Fl R .
236*60c73130SDevin Teske.El
237*60c73130SDevin Teske.Sh FILES
238*60c73130SDevin TeskeThese files map identifiers from observed NFS traffic to names.
239*60c73130SDevin Teske.Xr getent 1
240*60c73130SDevin Teskeon the nfsd host is not used for that translation.
241*60c73130SDevin Teske.Pp
242*60c73130SDevin Teske.Bl -tag -width ".nfsd.passwd" -compact
243*60c73130SDevin Teske.It Pa .nfsd.passwd
244*60c73130SDevin TeskeDefault user map
245*60c73130SDevin Teske.Pq Ql Fl p ,
246*60c73130SDevin Teskelooked up in the current directory.
247*60c73130SDevin Teske.It Pa .nfsd.group
248*60c73130SDevin TeskeDefault group map
249*60c73130SDevin Teske.Pq Ql Fl P ,
250*60c73130SDevin Teskelooked up in the current directory.
251*60c73130SDevin Teske.It Pa .nfsd.hosts
252*60c73130SDevin TeskeDefault IP map
253*60c73130SDevin Teske.Pq Ql Fl I ,
254*60c73130SDevin Teskelooked up in the current directory.
255*60c73130SDevin Teske.El
256*60c73130SDevin Teske.Sh EXIT STATUS
257*60c73130SDevin Teske.Ex -std
258*60c73130SDevin Teske.Sh EXAMPLES
259*60c73130SDevin TeskeDisplay per-user NFS
260*60c73130SDevin Teskeserver I/O, updated every two seconds:
261*60c73130SDevin Teske.Bd -literal -offset indent
262*60c73130SDevin Teskenfsdtop
263*60c73130SDevin Teske.Ed
264*60c73130SDevin Teske.Pp
265*60c73130SDevin TeskeView activity by NFS client:
266*60c73130SDevin Teske.Bd -literal -offset indent
267*60c73130SDevin Teskenfsdtop -c
268*60c73130SDevin Teske.Ed
269*60c73130SDevin Teske.Pp
270*60c73130SDevin TeskeRestrict the group view to
271*60c73130SDevin Teske.Ql wheel :
272*60c73130SDevin Teske.Bd -literal -offset indent
273*60c73130SDevin Teskenfsdtop -g -G wheel
274*60c73130SDevin Teske.Ed
275*60c73130SDevin Teske.Pp
276*60c73130SDevin TeskeCount only I/O from one client and show bytes instead of bandwidth:
277*60c73130SDevin Teske.Bd -literal -offset indent
278*60c73130SDevin Teskenfsdtop -c -C 192.0.2.10 -b
279*60c73130SDevin Teske.Ed
280*60c73130SDevin Teske.Pp
281*60c73130SDevin TeskeEmit one JSON sample for all views and exit:
282*60c73130SDevin Teske.Bd -literal -offset indent
283*60c73130SDevin Teskenfsdtop -J -N 1
284*60c73130SDevin Teske.Ed
285*60c73130SDevin Teske.Pp
286*60c73130SDevin TeskePrint the generated DTrace script without running it:
287*60c73130SDevin Teske.Bd -literal -offset indent
288*60c73130SDevin Teskenfsdtop -d
289*60c73130SDevin Teske.Ed
290*60c73130SDevin Teske.Sh SEE ALSO
291*60c73130SDevin Teske.Xr dtrace 1 ,
292*60c73130SDevin Teske.Xr dwatch 1 ,
293*60c73130SDevin Teske.Xr getent 1 ,
294*60c73130SDevin Teske.Xr nfsstat 1 ,
295*60c73130SDevin Teske.Xr group 5 ,
296*60c73130SDevin Teske.Xr passwd 5 ,
297*60c73130SDevin Teske.Xr gstat 8 ,
298*60c73130SDevin Teske.Xr iostat 8 ,
299*60c73130SDevin Teske.Xr nfsd 8
300*60c73130SDevin Teske.Sh HISTORY
301*60c73130SDevin TeskeThe
302*60c73130SDevin Teske.Nm
303*60c73130SDevin Teskeutility first appeared in
304*60c73130SDevin Teske.Fx 16.0 .
305*60c73130SDevin Teske.Sh AUTHORS
306*60c73130SDevin Teske.An Devin Teske Aq Mt dteske@FreeBSD.org
307*60c73130SDevin Teske.Sh BUGS
308*60c73130SDevin TeskeThe client view and
309*60c73130SDevin Teske.Ql Fl C
310*60c73130SDevin Teskefilter support IPv4 only.
311