Take the cable zero from the shortest delay seen rather than a flag

This commit is contained in:
flamingcow
2026-07-26 09:43:03 -07:00
parent e77574712d
commit 4d102f377e
2 changed files with 18 additions and 16 deletions
+5 -7
View File
@@ -539,7 +539,6 @@ type config struct {
streams int streams int
batch int batch int
probeEther uint16 probeEther uint16
zeroNS float64
nsPerM float64 nsPerM float64
} }
@@ -550,13 +549,13 @@ func main() {
sizesArg = flag.String("sizes", "64,128,256,512,1024,1280,1514", "frame sizes in bytes, excluding FCS, cycled per packet") sizesArg = flag.String("sizes", "64,128,256,512,1024,1280,1514", "frame sizes in bytes, excluding FCS, cycled per packet")
streams = flag.Int("streams", 7, "independent streams per direction, capped by rx rings; each gets its own ethertype, steered by a flow rule to its own rx queue") streams = flag.Int("streams", 7, "independent streams per direction, capped by rx rings; each gets its own ethertype, steered by a flow rule to its own rx queue")
batch = flag.Int("batch", 64, "frames per sendmmsg/recvmmsg call") batch = flag.Int("batch", 64, "frames per sendmmsg/recvmmsg call")
zeroNS = flag.Float64("zero-ns", 2163.77, "mean of both directions at zero cable length; belongs to the media adapters, recalibrate when they change")
nsPerM = flag.Float64("ns-per-m", 5.4545, "mean of both directions, per metre of cable") nsPerM = flag.Float64("ns-per-m", 5.3, "mean of both directions, per metre of cable")
) )
flag.Parse() flag.Parse()
if err := run(*aName, *bName, *sizesArg, if err := run(*aName, *bName, *sizesArg,
*streams, *batch, *zeroNS, *nsPerM); err != nil { *streams, *batch, *nsPerM); err != nil {
fmt.Fprintln(os.Stderr, "error:", err) fmt.Fprintln(os.Stderr, "error:", err)
os.Exit(1) os.Exit(1)
} }
@@ -574,7 +573,7 @@ const (
) )
func run(aName, bName, sizesArg string, func run(aName, bName, sizesArg string,
nStreams, batch int, zeroNS, nsPerM float64) error { nStreams, batch int, nsPerM float64) error {
if aName == "" || bName == "" { if aName == "" || bName == "" {
return fmt.Errorf("both -a and -b are required") return fmt.Errorf("both -a and -b are required")
@@ -629,7 +628,6 @@ func run(aName, bName, sizesArg string,
streams: nStreams, streams: nStreams,
batch: batch, batch: batch,
probeEther: uint16(etherBase + nStreams), probeEther: uint16(etherBase + nStreams),
zeroNS: zeroNS,
nsPerM: nsPerM, nsPerM: nsPerM,
} }
@@ -674,7 +672,7 @@ func run(aName, bName, sizesArg string,
nStreams, ethertypes[0], ethertypes[len(ethertypes)-1])}, nStreams, ethertypes[0], ethertypes[len(ethertypes)-1])},
{"probe", fmt.Sprintf("ethertype 0x%04x every %s", cfg.probeEther, probeInterval)}, {"probe", fmt.Sprintf("ethertype 0x%04x every %s", cfg.probeEther, probeInterval)},
{"batch", fmt.Sprintf("%d frames per syscall", batch)}, {"batch", fmt.Sprintf("%d frames per syscall", batch)},
{"calibration", fmt.Sprintf("%g ns at zero length, %g ns/m", zeroNS, nsPerM)}, {"calibration", fmt.Sprintf("%g ns/m, zero taken from the shortest delay seen so far", nsPerM)},
{"buffers", fmt.Sprintf("sndbuf %s, rcvbuf %s", {"buffers", fmt.Sprintf("sndbuf %s, rcvbuf %s",
humanBytes(uint64(sockBufSize(dirs[0].txFDs[0], unix.SO_SNDBUF))), humanBytes(uint64(sockBufSize(dirs[0].txFDs[0], unix.SO_SNDBUF))),
humanBytes(uint64(sockBufSize(dirs[0].rxFDs[0], unix.SO_RCVBUF))))}, humanBytes(uint64(sockBufSize(dirs[0].rxFDs[0], unix.SO_RCVBUF))))},
+13 -9
View File
@@ -34,18 +34,20 @@ type cableStats struct {
mu sync.Mutex mu sync.Mutex
min int64 min int64
samples uint64 samples uint64
floor int64
txPend map[uint64]int64 txPend map[uint64]int64
rxPend map[uint64]int64 rxPend map[uint64]int64
} }
type cableView struct { type cableView struct {
min int64 min int64
samples uint64 floor int64
ok bool
} }
func (v cableView) minText() string { func (v cableView) minText() string {
if v.samples == 0 { if !v.ok {
return "-" return "-"
} }
return commasInt(v.min) return commasInt(v.min)
@@ -57,15 +59,14 @@ func (c config) cableMetres(views []view) (float64, bool) {
if len(views) == 0 { if len(views) == 0 {
return 0, false return 0, false
} }
var sum float64 var excess float64
for _, v := range views { for _, v := range views {
if v.cable.samples == 0 { if !v.cable.ok {
return 0, false return 0, false
} }
sum += float64(v.cable.min) excess += float64(v.cable.min - v.cable.floor)
} }
mean := sum / float64(len(views)) return excess / float64(len(views)) / c.nsPerM, true
return (mean - c.zeroNS) / c.nsPerM, true
} }
func (c config) cableText(views []view) string { func (c config) cableText(views []view) string {
@@ -114,13 +115,16 @@ func (c *cableStats) put(seq uint64, ts int64, tx bool) {
if c.samples == 0 || delta < c.min { if c.samples == 0 || delta < c.min {
c.min = delta c.min = delta
} }
if c.floor == 0 || delta < c.floor {
c.floor = delta
}
c.samples++ c.samples++
} }
func (c *cableStats) view() cableView { func (c *cableStats) view() cableView {
c.mu.Lock() c.mu.Lock()
defer c.mu.Unlock() defer c.mu.Unlock()
return cableView{c.min, c.samples} return cableView{c.min, c.floor, c.samples > 0}
} }
func (c *cableStats) reset() { func (c *cableStats) reset() {