change window calculation, bandwidth calculation

This commit is contained in:
ffdfgdfg 2020-01-04 20:49:17 +08:00
parent f5fce6d1f4
commit 6bbe276b18
2 changed files with 65 additions and 9 deletions

View File

@ -202,7 +202,7 @@ type ReceiveWindow struct {
bufQueue ReceiveWindowQueue bufQueue ReceiveWindowQueue
element *common.ListElement element *common.ListElement
count int8 count int8
bw *bandwidth bw *writeBandwidth
once sync.Once once sync.Once
// receive window send the current max size and read size to send window // receive window send the current max size and read size to send window
// means done size actually store the size receive window has read // means done size actually store the size receive window has read
@ -215,7 +215,7 @@ func (Self *ReceiveWindow) New(mux *Mux) {
Self.maxSizeDone = Self.pack(common.MAXIMUM_SEGMENT_SIZE*30, 0, false) Self.maxSizeDone = Self.pack(common.MAXIMUM_SEGMENT_SIZE*30, 0, false)
Self.mux = mux Self.mux = mux
Self.window.New() Self.window.New()
Self.bw = NewBandwidth(nil) Self.bw = NewWriteBandwidth()
} }
func (Self *ReceiveWindow) remainingSize(maxSize uint32, delta uint16) (n uint32) { func (Self *ReceiveWindow) remainingSize(maxSize uint32, delta uint16) (n uint32) {
@ -232,9 +232,15 @@ func (Self *ReceiveWindow) calcSize() {
// calculating maximum receive window size // calculating maximum receive window size
if Self.count == 0 { if Self.count == 0 {
//logs.Warn("ping, bw", Self.mux.latency, Self.bw.Get()) //logs.Warn("ping, bw", Self.mux.latency, Self.bw.Get())
conns := Self.mux.connMap.Size() //conns := Self.mux.connMap.Size()
n := uint32(math.Float64frombits(atomic.LoadUint64(&Self.mux.latency)) * muxBw := Self.mux.bw.Get()
(Self.mux.bw.Get() + Self.bw.Get())) connBw := Self.bw.Get()
//logs.Warn("muxbw connbw", muxBw, connBw)
var n uint32
if connBw > 0 && muxBw > 0 {
n = uint32(math.Float64frombits(atomic.LoadUint64(&Self.mux.latency)) *
(muxBw + connBw))
}
//logs.Warn(n) //logs.Warn(n)
if n < common.MAXIMUM_SEGMENT_SIZE*30 { if n < common.MAXIMUM_SEGMENT_SIZE*30 {
//logs.Warn("window small", n, Self.mux.bw.Get(), Self.bw.Get()) //logs.Warn("window small", n, Self.mux.bw.Get(), Self.bw.Get())
@ -252,9 +258,12 @@ func (Self *ReceiveWindow) calcSize() {
n = 2 * size n = 2 * size
// twice grow // twice grow
} }
if n > (common.MAXIMUM_WINDOW_SIZE / uint32(conns)) { if connBw > 0 && muxBw > 0 {
logs.Warn("window too large, calculated:", n, "limit:", common.MAXIMUM_WINDOW_SIZE/uint32(conns)) limit := uint32(common.MAXIMUM_WINDOW_SIZE * (connBw / (muxBw + connBw)))
n = common.MAXIMUM_WINDOW_SIZE / uint32(conns) if n > limit {
logs.Warn("window too large, calculated:", n, "limit:", limit, connBw, muxBw)
n = limit
}
} }
// set the maximum size // set the maximum size
//logs.Warn("n", n) //logs.Warn("n", n)
@ -664,3 +673,50 @@ func (Self *SendWindow) SetTimeOut(t time.Time) {
// waiting for receive a receive window size // waiting for receive a receive window size
Self.timeout = t Self.timeout = t
} }
type writeBandwidth struct {
writeBW uint64 // store in bits, but it's float64
readEnd time.Time
duration float64
bufLength uint32
}
const writeCalcThreshold uint32 = 5 * 1024 * 1024
func NewWriteBandwidth() *writeBandwidth {
return &writeBandwidth{}
}
func (Self *writeBandwidth) StartRead() {
if Self.readEnd.IsZero() {
Self.readEnd = time.Now()
}
Self.duration += time.Now().Sub(Self.readEnd).Seconds()
if Self.bufLength >= writeCalcThreshold {
Self.calcBandWidth()
}
}
func (Self *writeBandwidth) SetCopySize(n uint16) {
Self.bufLength += uint32(n)
Self.endRead()
}
func (Self *writeBandwidth) endRead() {
Self.readEnd = time.Now()
}
func (Self *writeBandwidth) calcBandWidth() {
atomic.StoreUint64(&Self.writeBW, math.Float64bits(float64(Self.bufLength)/Self.duration))
Self.bufLength = 0
Self.duration = 0
}
func (Self *writeBandwidth) Get() (bw float64) {
// The zero value, 0 for numeric types
bw = math.Float64frombits(atomic.LoadUint64(&Self.writeBW))
if bw <= 0 {
bw = 0
}
return
}

View File

@ -443,7 +443,7 @@ func (Self *bandwidth) Get() (bw float64) {
// The zero value, 0 for numeric types // The zero value, 0 for numeric types
bw = math.Float64frombits(atomic.LoadUint64(&Self.readBandwidth)) bw = math.Float64frombits(atomic.LoadUint64(&Self.readBandwidth))
if bw <= 0 { if bw <= 0 {
bw = 100 bw = 0
} }
//logs.Warn(bw) //logs.Warn(bw)
return return