diff --git a/nfs/nfs.go b/nfs/nfs.go index 729210295..c0d3a1183 100644 --- a/nfs/nfs.go +++ b/nfs/nfs.go @@ -201,51 +201,56 @@ type ServerV4Stats struct { // V4Ops models the "proc4ops" line: NFSv4 operations // Variable list. // See: -// - v4.0 https://tools.ietf.org/html/rfc3010 (38 operations) +// - v4.0 https://tools.ietf.org/html/rfc3010 (38/39 operations) +// - nfs == v2.5.x 38 field : https://elixir.bootlin.com/linux/v2.5.75/source/include/linux/nfs4.h#L52 +// - nfs >= v2.6.x 39 field : https://elixir.bootlin.com/linux/v2.6.39.4/source/include/linux/nfs4.h#L233 +// // - v4.1 https://tools.ietf.org/html/rfc5661 (58 operations) // - v4.2 https://tools.ietf.org/html/draft-ietf-nfsv4-minorversion2-41 (71 operations) // //nolint:godot type V4Ops struct { //Values uint64 // Variable depending on v4.x sub-version. TODO: Will this always at least include the fields in this struct? - Op0Unused uint64 - Op1Unused uint64 - Op2Future uint64 - Access uint64 - Close uint64 - Commit uint64 - Create uint64 - DelegPurge uint64 - DelegReturn uint64 - GetAttr uint64 - GetFH uint64 - Link uint64 - Lock uint64 - Lockt uint64 - Locku uint64 - Lookup uint64 - LookupRoot uint64 - Nverify uint64 - Open uint64 - OpenAttr uint64 - OpenConfirm uint64 - OpenDgrd uint64 - PutFH uint64 - PutPubFH uint64 - PutRootFH uint64 - Read uint64 - ReadDir uint64 - ReadLink uint64 - Remove uint64 - Rename uint64 - Renew uint64 - RestoreFH uint64 - SaveFH uint64 - SecInfo uint64 - SetAttr uint64 - Verify uint64 - Write uint64 - RelLockOwner uint64 + Op0Unused uint64 + Op1Unused uint64 + Op2Future uint64 + Access uint64 + Close uint64 + Commit uint64 + Create uint64 + DelegPurge uint64 + DelegReturn uint64 + GetAttr uint64 + GetFH uint64 + Link uint64 + Lock uint64 + Lockt uint64 + Locku uint64 + Lookup uint64 + LookupRoot uint64 + Nverify uint64 + Open uint64 + OpenAttr uint64 + OpenConfirm uint64 + OpenDgrd uint64 + PutFH uint64 + PutPubFH uint64 + PutRootFH uint64 + Read uint64 + ReadDir uint64 + ReadLink uint64 + Remove uint64 + Rename uint64 + Renew uint64 + RestoreFH uint64 + SaveFH uint64 + SecInfo uint64 + SetAttr uint64 + SetClientId uint64 + SetClientIdConfirm uint64 + Verify uint64 + Write uint64 + RelLockOwner uint64 } // ClientRPCStats models all stats from /proc/net/rpc/nfs. diff --git a/nfs/parse.go b/nfs/parse.go index 5e78c5443..15f8c3562 100644 --- a/nfs/parse.go +++ b/nfs/parse.go @@ -272,45 +272,53 @@ func parseV4Ops(v []uint64) (V4Ops, error) { return V4Ops{}, fmt.Errorf("invalid V4Ops line %q", v) } + // nfs v2.5.x 39field and >=v2.6.x 40 field; + v40 := uint64(0) + if values > 39 { + v40 = v[40] + } + stats := V4Ops{ - Op0Unused: v[1], - Op1Unused: v[2], - Op2Future: v[3], - Access: v[4], - Close: v[5], - Commit: v[6], - Create: v[7], - DelegPurge: v[8], - DelegReturn: v[9], - GetAttr: v[10], - GetFH: v[11], - Link: v[12], - Lock: v[13], - Lockt: v[14], - Locku: v[15], - Lookup: v[16], - LookupRoot: v[17], - Nverify: v[18], - Open: v[19], - OpenAttr: v[20], - OpenConfirm: v[21], - OpenDgrd: v[22], - PutFH: v[23], - PutPubFH: v[24], - PutRootFH: v[25], - Read: v[26], - ReadDir: v[27], - ReadLink: v[28], - Remove: v[29], - Rename: v[30], - Renew: v[31], - RestoreFH: v[32], - SaveFH: v[33], - SecInfo: v[34], - SetAttr: v[35], - Verify: v[36], - Write: v[37], - RelLockOwner: v[38], + Op0Unused: v[1], + Op1Unused: v[2], + Op2Future: v[3], + Access: v[4], + Close: v[5], + Commit: v[6], + Create: v[7], + DelegPurge: v[8], + DelegReturn: v[9], + GetAttr: v[10], + GetFH: v[11], + Link: v[12], + Lock: v[13], + Lockt: v[14], + Locku: v[15], + Lookup: v[16], + LookupRoot: v[17], + Nverify: v[18], + Open: v[19], + OpenAttr: v[20], + OpenConfirm: v[21], + OpenDgrd: v[22], + PutFH: v[23], + PutPubFH: v[24], + PutRootFH: v[25], + Read: v[26], + ReadDir: v[27], + ReadLink: v[28], + Remove: v[29], + Rename: v[30], + Renew: v[31], + RestoreFH: v[32], + SaveFH: v[33], + SecInfo: v[34], + SetAttr: v[35], + SetClientId: v[36], + SetClientIdConfirm: v[37], + Verify: v[38], + Write: v[39], + RelLockOwner: v40, } return stats, nil diff --git a/nfs/parse_nfsd_test.go b/nfs/parse_nfsd_test.go index b09b3b580..449eba2d4 100644 --- a/nfs/parse_nfsd_test.go +++ b/nfs/parse_nfsd_test.go @@ -33,7 +33,7 @@ func TestNewNFSdServerRPCStats(t *testing.T) { content: "invalid", invalid: true, }, { - name: "good file", + name: "good file, proc4ops 72", content: `rc 0 6 18622 fh 0 0 0 0 0 io 157286400 0 @@ -134,44 +134,476 @@ proc4ops 72 0 0 0 1098 2 0 0 0 0 8179 5896 0 0 0 0 5900 0 0 2 0 2 0 9609 0 2 150 Compound: 10853, }, V4Ops: nfs.V4Ops{ - Op0Unused: 0, - Op1Unused: 0, - Op2Future: 0, - Access: 1098, - Close: 2, - Commit: 0, - Create: 0, - DelegPurge: 0, - DelegReturn: 0, - GetAttr: 8179, - GetFH: 5896, - Link: 0, - Lock: 0, - Lockt: 0, - Locku: 0, - Lookup: 5900, - LookupRoot: 0, - Nverify: 0, - Open: 2, - OpenAttr: 0, - OpenConfirm: 2, - OpenDgrd: 0, - PutFH: 9609, - PutPubFH: 0, - PutRootFH: 2, - Read: 150, - ReadDir: 1272, - ReadLink: 0, - Remove: 0, - Rename: 0, - Renew: 1236, - RestoreFH: 0, - SaveFH: 0, - SecInfo: 0, - SetAttr: 0, - Verify: 3, - Write: 3, - RelLockOwner: 0, + Op0Unused: 0, + Op1Unused: 0, + Op2Future: 0, + Access: 1098, + Close: 2, + Commit: 0, + Create: 0, + DelegPurge: 0, + DelegReturn: 0, + GetAttr: 8179, + GetFH: 5896, + Link: 0, + Lock: 0, + Lockt: 0, + Locku: 0, + Lookup: 5900, + LookupRoot: 0, + Nverify: 0, + Open: 2, + OpenAttr: 0, + OpenConfirm: 2, + OpenDgrd: 0, + PutFH: 9609, + PutPubFH: 0, + PutRootFH: 2, + Read: 150, + ReadDir: 1272, + ReadLink: 0, + Remove: 0, + Rename: 0, + Renew: 1236, + RestoreFH: 0, + SaveFH: 0, + SecInfo: 0, + SetAttr: 0, + SetClientId: 3, + SetClientIdConfirm: 3, + Verify: 0, + Write: 0, + RelLockOwner: 0, + }, + }, + }, { + name: "good file, proc4ops 40", + content: `rc 0 25020854 19157796 +fh 276 0 0 0 0 +io 899844043 2470085989 +th 1024 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 +ra 2048 4250593 118232 55926 31504 20253 13815 9875 7028 5546 3991 171551 +net 44179842 1 44179026 3092 +rpc 44177753 0 0 0 0 +proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +proc3 22 747 7259760 1383711 1570520 3464939 8436 4688207 21668847 1173194 6457 2127 172 213538 1253 556401 14950 1101 56245 90790 742 367 1989658 +proc4 2 0 0 +proc4ops 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0`, + stats: &nfs.ServerRPCStats{ + ReplyCache: nfs.ReplyCache{ + Hits: 0, + Misses: 25020854, + NoCache: 19157796, + }, + FileHandles: nfs.FileHandles{ + Stale: 276, + TotalLookups: 0, + AnonLookups: 0, + DirNoCache: 0, + NoDirNoCache: 0, + }, + InputOutput: nfs.InputOutput{ + Read: 899844043, + Write: 2470085989, + }, + Threads: nfs.Threads{ + Threads: 1024, + FullCnt: 0, + }, + ReadAheadCache: nfs.ReadAheadCache{ + CacheSize: 2048, + CacheHistogram: []uint64{4250593, 118232, 55926, 31504, 20253, 13815, 9875, 7028, 5546, 3991}, + NotFound: 171551, + }, + Network: nfs.Network{ + NetCount: 44179842, + UDPCount: 1, + TCPCount: 44179026, + TCPConnect: 3092, + }, + ServerRPC: nfs.ServerRPC{ + RPCCount: 44177753, + BadCnt: 0, + BadFmt: 0, + BadAuth: 0, + BadcInt: 0, + }, + V2Stats: nfs.V2Stats{ + Null: 0, + GetAttr: 0, + SetAttr: 0, + Root: 0, + Lookup: 0, + ReadLink: 0, + Read: 0, + WrCache: 0, + Write: 0, + Create: 0, + Remove: 0, + Rename: 0, + Link: 0, + SymLink: 0, + MkDir: 0, + RmDir: 0, + ReadDir: 0, + FsStat: 0, + }, + V3Stats: nfs.V3Stats{ + Null: 747, + GetAttr: 7259760, + SetAttr: 1383711, + Lookup: 1570520, + Access: 3464939, + ReadLink: 8436, + Read: 4688207, + Write: 21668847, + Create: 1173194, + MkDir: 6457, + SymLink: 2127, + MkNod: 172, + Remove: 213538, + RmDir: 1253, + Rename: 556401, + Link: 14950, + ReadDir: 1101, + ReadDirPlus: 56245, + FsStat: 90790, + FsInfo: 742, + PathConf: 367, + Commit: 1989658, + }, + ServerV4Stats: nfs.ServerV4Stats{ + Null: 0, + Compound: 0, + }, + V4Ops: nfs.V4Ops{ + Op0Unused: 0, + Op1Unused: 0, + Op2Future: 0, + Access: 0, + Close: 0, + Commit: 0, + Create: 0, + DelegPurge: 0, + DelegReturn: 0, + GetAttr: 0, + GetFH: 0, + Link: 0, + Lock: 0, + Lockt: 0, + Locku: 0, + Lookup: 0, + LookupRoot: 0, + Nverify: 0, + Open: 0, + OpenAttr: 0, + OpenConfirm: 0, + OpenDgrd: 0, + PutFH: 0, + PutPubFH: 0, + PutRootFH: 0, + Read: 0, + ReadDir: 0, + ReadLink: 0, + Remove: 0, + Rename: 0, + Renew: 0, + RestoreFH: 0, + SaveFH: 0, + SecInfo: 0, + SetAttr: 0, + SetClientId: 0, + SetClientIdConfirm: 0, + Verify: 0, + Write: 0, + RelLockOwner: 0, + }, + }, + }, + { + name: "good file, proc4ops 59", + content: `rc 0 268 742119 +fh 0 0 0 0 0 +io 2476981939 0 +th 8 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 +ra 32 30104 0 0 0 0 0 0 0 0 0 71174 +net 742701 314 742393 10103960 +rpc 742406 310 310 0 0 +proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +proc3 22 105 71158 0 175642 184711 17103 101277 0 0 0 0 0 0 0 0 0 0 8916 102 202 0 0 +proc4 2 101 182991 +proc4ops 59 0 0 0 18112 8341 0 0 0 3239 71595 11834 0 0 0 0 107097 0 0 8344 0 5100 0 181968 0 235 5735 4406 0 0 0 652 8342 8344 0 0 134 134 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0`, + stats: &nfs.ServerRPCStats{ + ReplyCache: nfs.ReplyCache{ + Hits: 0, + Misses: 268, + NoCache: 742119, + }, + FileHandles: nfs.FileHandles{ + Stale: 0, + TotalLookups: 0, + AnonLookups: 0, + DirNoCache: 0, + NoDirNoCache: 0, + }, + InputOutput: nfs.InputOutput{ + Read: 2476981939, + Write: 0, + }, + Threads: nfs.Threads{ + Threads: 8, + FullCnt: 0, + }, + ReadAheadCache: nfs.ReadAheadCache{ + CacheSize: 32, + CacheHistogram: []uint64{30104, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + NotFound: 71174, + }, + Network: nfs.Network{ + NetCount: 742701, + UDPCount: 314, + TCPCount: 742393, + TCPConnect: 10103960, + }, + ServerRPC: nfs.ServerRPC{ + RPCCount: 742406, + BadCnt: 310, + BadFmt: 310, + BadAuth: 0, + BadcInt: 0, + }, + V2Stats: nfs.V2Stats{ + Null: 0, + GetAttr: 0, + SetAttr: 0, + Root: 0, + Lookup: 0, + ReadLink: 0, + Read: 0, + WrCache: 0, + Write: 0, + Create: 0, + Remove: 0, + Rename: 0, + Link: 0, + SymLink: 0, + MkDir: 0, + RmDir: 0, + ReadDir: 0, + FsStat: 0, + }, + V3Stats: nfs.V3Stats{ + Null: 105, + GetAttr: 71158, + SetAttr: 0, + Lookup: 175642, + Access: 184711, + ReadLink: 17103, + Read: 101277, + Write: 0, + Create: 0, + MkDir: 0, + SymLink: 0, + MkNod: 0, + Remove: 0, + RmDir: 0, + Rename: 0, + Link: 0, + ReadDir: 0, + ReadDirPlus: 8916, + FsStat: 102, + FsInfo: 202, + PathConf: 0, + Commit: 0, + }, + ServerV4Stats: nfs.ServerV4Stats{ + Null: 101, + Compound: 182991, + }, + V4Ops: nfs.V4Ops{ + Op0Unused: 0, + Op1Unused: 0, + Op2Future: 0, + Access: 18112, + Close: 8341, + Commit: 0, + Create: 0, + DelegPurge: 0, + DelegReturn: 3239, + GetAttr: 71595, + GetFH: 11834, + Link: 0, + Lock: 0, + Lockt: 0, + Locku: 0, + Lookup: 107097, + LookupRoot: 0, + Nverify: 0, + Open: 8344, + OpenAttr: 0, + OpenConfirm: 5100, + OpenDgrd: 0, + PutFH: 181968, + PutPubFH: 0, + PutRootFH: 235, + Read: 5735, + ReadDir: 4406, + ReadLink: 0, + Remove: 0, + Rename: 0, + Renew: 652, + RestoreFH: 8342, + SaveFH: 8344, + SecInfo: 0, + SetAttr: 0, + SetClientId: 134, + SetClientIdConfirm: 134, + Verify: 0, + Write: 0, + RelLockOwner: 0, + }, + }, + }, { + name: "good file, proc4ops 39", + content: `rc 0 25020854 19157796 +fh 276 0 0 0 0 +io 899844043 2470085989 +th 1024 0 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 +ra 2048 4250593 118232 55926 31504 20253 13815 9875 7028 5546 3991 171551 +net 44179842 1 44179026 3092 +rpc 44177753 0 0 0 0 +proc2 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +proc3 22 747 7259760 1383711 1570520 3464939 8436 4688207 21668847 1173194 6457 2127 172 213538 1253 556401 14950 1101 56245 90790 742 367 1989658 +proc4 2 0 0 +proc4ops 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39`, + stats: &nfs.ServerRPCStats{ + ReplyCache: nfs.ReplyCache{ + Hits: 0, + Misses: 25020854, + NoCache: 19157796, + }, + FileHandles: nfs.FileHandles{ + Stale: 276, + TotalLookups: 0, + AnonLookups: 0, + DirNoCache: 0, + NoDirNoCache: 0, + }, + InputOutput: nfs.InputOutput{ + Read: 899844043, + Write: 2470085989, + }, + Threads: nfs.Threads{ + Threads: 1024, + FullCnt: 0, + }, + ReadAheadCache: nfs.ReadAheadCache{ + CacheSize: 2048, + CacheHistogram: []uint64{4250593, 118232, 55926, 31504, 20253, 13815, 9875, 7028, 5546, 3991}, + NotFound: 171551, + }, + Network: nfs.Network{ + NetCount: 44179842, + UDPCount: 1, + TCPCount: 44179026, + TCPConnect: 3092, + }, + ServerRPC: nfs.ServerRPC{ + RPCCount: 44177753, + BadCnt: 0, + BadFmt: 0, + BadAuth: 0, + BadcInt: 0, + }, + V2Stats: nfs.V2Stats{ + Null: 0, + GetAttr: 0, + SetAttr: 0, + Root: 0, + Lookup: 0, + ReadLink: 0, + Read: 0, + WrCache: 0, + Write: 0, + Create: 0, + Remove: 0, + Rename: 0, + Link: 0, + SymLink: 0, + MkDir: 0, + RmDir: 0, + ReadDir: 0, + FsStat: 0, + }, + V3Stats: nfs.V3Stats{ + Null: 747, + GetAttr: 7259760, + SetAttr: 1383711, + Lookup: 1570520, + Access: 3464939, + ReadLink: 8436, + Read: 4688207, + Write: 21668847, + Create: 1173194, + MkDir: 6457, + SymLink: 2127, + MkNod: 172, + Remove: 213538, + RmDir: 1253, + Rename: 556401, + Link: 14950, + ReadDir: 1101, + ReadDirPlus: 56245, + FsStat: 90790, + FsInfo: 742, + PathConf: 367, + Commit: 1989658, + }, + ServerV4Stats: nfs.ServerV4Stats{ + Null: 0, + Compound: 0, + }, + V4Ops: nfs.V4Ops{ + Op0Unused: 0, + Op1Unused: 0, + Op2Future: 0, + Access: 0, + Close: 0, + Commit: 0, + Create: 0, + DelegPurge: 0, + DelegReturn: 0, + GetAttr: 0, + GetFH: 0, + Link: 0, + Lock: 0, + Lockt: 0, + Locku: 0, + Lookup: 0, + LookupRoot: 0, + Nverify: 0, + Open: 0, + OpenAttr: 0, + OpenConfirm: 0, + OpenDgrd: 0, + PutFH: 0, + PutPubFH: 0, + PutRootFH: 0, + Read: 0, + ReadDir: 0, + ReadLink: 0, + Remove: 0, + Rename: 0, + Renew: 0, + RestoreFH: 0, + SaveFH: 0, + SecInfo: 0, + SetAttr: 0, + SetClientId: 0, + SetClientIdConfirm: 0, + Verify: 0, + Write: 39, + RelLockOwner: 0, }, }, },