forked from usnistgov/ndn-dpdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcounters.go
116 lines (98 loc) · 3.12 KB
/
counters.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package tgconsumer
import (
"fmt"
"strconv"
"time"
"unsafe"
"github.com/usnistgov/ndn-dpdk/core/runningstat"
"github.com/usnistgov/ndn-dpdk/dpdk/eal"
)
func formatRttCounters(cnt runningstat.Snapshot) string {
const ratio = 1.0 / float64(time.Millisecond)
formatMinMax := func(v *uint64) string {
if v == nil {
return "none"
}
return strconv.FormatFloat(float64(*v)*ratio, 'f', 3, 64)
}
ms := cnt.Scale(ratio)
return fmt.Sprintf("%s/%0.3f/%s/%0.3fms(%dsamp)", formatMinMax(ms.Min), ms.Mean, formatMinMax(ms.Max), ms.Stdev, ms.Len)
}
// PacketCounters is a group of network layer packet counters.
type PacketCounters struct {
NInterests uint64 `json:"nInterests"`
NData uint64 `json:"nData"`
NNacks uint64 `json:"nNacks"`
}
// DataRatio returns NData/NInterests.
func (cnt PacketCounters) DataRatio() float64 {
return float64(cnt.NData) / float64(cnt.NInterests)
}
// NackRatio returns NNacks/NInterests.
func (cnt PacketCounters) NackRatio() float64 {
return float64(cnt.NNacks) / float64(cnt.NInterests)
}
func (cnt PacketCounters) String() string {
return fmt.Sprintf("%dI %dD(%0.2f%%) %dN(%0.2f%%)",
cnt.NInterests,
cnt.NData, cnt.DataRatio()*100.0,
cnt.NNacks, cnt.NackRatio()*100.0)
}
// PatternCounters contains per-pattern counters.
type PatternCounters struct {
PacketCounters
Rtt runningstat.Snapshot `json:"rtt" gqldesc:"RTT in nanoseconds."`
}
func (cnt PatternCounters) String() string {
return fmt.Sprintf("%s rtt=%s", cnt.PacketCounters, formatRttCounters(cnt.Rtt))
}
// Counters contains consumer counters.
type Counters struct {
PacketCounters
NAllocError uint64 `json:"nAllocError"`
Rtt runningstat.Snapshot `json:"rtt" gqldesc:"RTT in nanoseconds."`
PerPattern []PatternCounters `json:"perPattern"`
}
func (cnt Counters) String() string {
s := fmt.Sprintf("%s %dalloc-error rtt=%s", cnt.PacketCounters, cnt.NAllocError, formatRttCounters(cnt.Rtt))
for i, pcnt := range cnt.PerPattern {
s += fmt.Sprintf(", pattern(%d) %s", i, pcnt)
}
return s
}
// Counters retrieves counters.
func (c *Consumer) Counters() (cnt Counters) {
for i := range int(c.rxC.nPatterns) {
crP := c.rxC.pattern[i]
ctP := c.txC.pattern[i]
rtt := c.rttStat(i).Read().Scale(eal.TscNanos)
var pcnt PatternCounters
pcnt.NInterests = uint64(ctP.nInterests)
pcnt.NData = rtt.Count
pcnt.NNacks = uint64(crP.nNacks)
pcnt.Rtt = rtt
cnt.PerPattern = append(cnt.PerPattern, pcnt)
cnt.NInterests += pcnt.NInterests
cnt.NData += pcnt.NData
cnt.NNacks += pcnt.NNacks
cnt.Rtt = cnt.Rtt.Add(rtt)
}
cnt.NAllocError = uint64(c.txC.nAllocError)
return cnt
}
func (c *Consumer) rttStat(index int) *runningstat.IntStat {
return runningstat.IntFromPtr(unsafe.Pointer(&c.rxC.pattern[index].rtt))
}
// ClearCounters clears counters.
// Both RX and TX threads should be stopped before calling this, otherwise race conditions may occur.
func (c *Consumer) ClearCounters() {
for i := range int(c.rxC.nPatterns) {
c.clearCounter(i)
}
c.txC.nAllocError = 0
}
func (c *Consumer) clearCounter(index int) {
c.rxC.pattern[index].nNacks = 0
c.rttStat(index).Init(0)
c.txC.pattern[index].nInterests = 0
}