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