summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lgc/lgc.go70
-rw-r--r--rpm/rpm.go16
2 files changed, 49 insertions, 37 deletions
diff --git a/lgc/lgc.go b/lgc/lgc.go
index 1f6332d..59b623d 100644
--- a/lgc/lgc.go
+++ b/lgc/lgc.go
@@ -34,22 +34,25 @@ import (
type LoadGeneratingConnection interface {
Start(context.Context, debug.DebugLevel) bool
- Transferred() uint64
+ TransferredInInterval() (uint64, time.Duration)
Client() *http.Client
IsValid() bool
ClientId() uint64
}
type LoadGeneratingConnectionDownload struct {
- Path string
- downloaded uint64
- client *http.Client
- debug debug.DebugLevel
- valid bool
- KeyLogger io.Writer
- clientId uint64
- tracer *httptrace.ClientTrace
- stats stats.TraceStats
+ Path string
+ downloaded uint64
+ downloadStartTime time.Time
+ lastDownloaded uint64
+ lastIntervalEnd int64
+ client *http.Client
+ debug debug.DebugLevel
+ valid bool
+ KeyLogger io.Writer
+ clientId uint64
+ tracer *httptrace.ClientTrace
+ stats stats.TraceStats
}
func (lgd *LoadGeneratingConnectionDownload) SetDnsStartTimeInfo(
@@ -204,12 +207,15 @@ func (lgd *LoadGeneratingConnectionDownload) ClientId() uint64 {
return lgd.clientId
}
-func (lgd *LoadGeneratingConnectionDownload) Transferred() uint64 {
- transferred := atomic.LoadUint64(&lgd.downloaded)
+func (lgd *LoadGeneratingConnectionDownload) TransferredInInterval() (uint64, time.Duration) {
+ transferred := atomic.SwapUint64(&lgd.downloaded, 0)
+ newIntervalEnd := (time.Now().Sub(lgd.downloadStartTime)).Nanoseconds()
+ previousIntervalEnd := atomic.SwapInt64(&lgd.lastIntervalEnd, newIntervalEnd)
+ intervalLength := time.Duration(newIntervalEnd - previousIntervalEnd)
if debug.IsDebug(lgd.debug) {
- fmt.Printf("download: Transferred: %v\n", transferred)
+ fmt.Printf("download: Transferred: %v bytes in %v.\n", transferred, intervalLength)
}
- return transferred
+ return transferred, intervalLength
}
func (lgd *LoadGeneratingConnectionDownload) Client() *http.Client {
@@ -291,6 +297,9 @@ func (lbd *LoadGeneratingConnectionDownload) doDownload(ctx context.Context) {
return
}
+ lbd.downloadStartTime = time.Now()
+ lbd.lastIntervalEnd = 0
+
if get, err = lbd.client.Do(request); err != nil {
lbd.valid = false
return
@@ -304,25 +313,31 @@ func (lbd *LoadGeneratingConnectionDownload) doDownload(ctx context.Context) {
}
type LoadGeneratingConnectionUpload struct {
- Path string
- uploaded uint64
- client *http.Client
- debug debug.DebugLevel
- valid bool
- KeyLogger io.Writer
- clientId uint64
+ Path string
+ uploaded uint64
+ uploadStartTime time.Time
+ lastUploaded uint64
+ lastIntervalEnd int64
+ client *http.Client
+ debug debug.DebugLevel
+ valid bool
+ KeyLogger io.Writer
+ clientId uint64
}
func (lgu *LoadGeneratingConnectionUpload) ClientId() uint64 {
return lgu.clientId
}
-func (lgu *LoadGeneratingConnectionUpload) Transferred() uint64 {
- transferred := atomic.LoadUint64(&lgu.uploaded)
- if debug.IsDebug(lgu.debug) {
- fmt.Printf("upload: Transferred: %v\n", transferred)
+func (lgd *LoadGeneratingConnectionUpload) TransferredInInterval() (uint64, time.Duration) {
+ transferred := atomic.SwapUint64(&lgd.uploaded, 0)
+ newIntervalEnd := (time.Now().Sub(lgd.uploadStartTime)).Nanoseconds()
+ previousIntervalEnd := atomic.SwapInt64(&lgd.lastIntervalEnd, newIntervalEnd)
+ intervalLength := time.Duration(newIntervalEnd - previousIntervalEnd)
+ if debug.IsDebug(lgd.debug) {
+ fmt.Printf("upload: Transferred: %v bytes in %v.\n", transferred, intervalLength)
}
- return transferred
+ return transferred, intervalLength
}
func (lgu *LoadGeneratingConnectionUpload) Client() *http.Client {
@@ -355,6 +370,9 @@ func (lgu *LoadGeneratingConnectionUpload) doUpload(ctx context.Context) bool {
var resp *http.Response = nil
var err error
+ lgu.uploadStartTime = time.Now()
+ lgu.lastIntervalEnd = 0
+
if resp, err = lgu.client.Post(lgu.Path, "application/octet-stream", s); err != nil {
lgu.valid = false
return false
diff --git a/rpm/rpm.go b/rpm/rpm.go
index 8956509..3425566 100644
--- a/rpm/rpm.go
+++ b/rpm/rpm.go
@@ -23,13 +23,11 @@ func addFlows(
ctx context.Context,
toAdd uint64,
lgcs *[]lgc.LoadGeneratingConnection,
- lgcsPreviousTransferred *[]uint64,
lgcGenerator func() lgc.LoadGeneratingConnection,
debug debug.DebugLevel,
) {
for i := uint64(0); i < toAdd; i++ {
*lgcs = append(*lgcs, lgcGenerator())
- *lgcsPreviousTransferred = append(*lgcsPreviousTransferred, 0)
if !(*lgcs)[len(*lgcs)-1].Start(ctx, debug) {
fmt.Printf(
"Error starting lgc with id %d!\n",
@@ -55,13 +53,11 @@ func Saturate(
go func() {
lgcs := make([]lgc.LoadGeneratingConnection, 0)
- lgcsPreviousTransferred := make([]uint64, 0)
addFlows(
saturationCtx,
constants.StartingNumberOfLoadGeneratingConnections,
&lgcs,
- &lgcsPreviousTransferred,
lgcGenerator,
debugging.Level,
)
@@ -116,7 +112,7 @@ func Saturate(
// Compute "instantaneous aggregate" goodput which is the number of
// bytes transferred within the last second.
- totalTransfer := uint64(0)
+ var totalTransfer float64 = 0
allInvalid := true
for i := range lgcs {
if !lgcs[i].IsValid() {
@@ -130,11 +126,10 @@ func Saturate(
continue
}
allInvalid = false
- previousTransferred := lgcsPreviousTransferred[i]
- currentTransferred := lgcs[i].Transferred()
- instantaneousTransferred := currentTransferred - previousTransferred
+ currentTransferred, currentInterval := lgcs[i].TransferredInInterval()
+ // normalize to a second-long interval!
+ instantaneousTransferred := float64(currentTransferred) / float64(currentInterval.Seconds())
totalTransfer += instantaneousTransferred
- lgcsPreviousTransferred[i] = currentTransferred
}
// For some reason, all the lgcs are invalid. This likely means that
@@ -208,7 +203,6 @@ func Saturate(
saturationCtx,
constants.AdditiveNumberOfLoadGeneratingConnections,
&lgcs,
- &lgcsPreviousTransferred,
lgcGenerator,
debugging.Level,
)
@@ -234,7 +228,7 @@ func Saturate(
if debug.IsDebug(debugging.Level) {
fmt.Printf("%v: New flows to add to try to increase our saturation!\n", debugging)
}
- addFlows(saturationCtx, constants.AdditiveNumberOfLoadGeneratingConnections, &lgcs, &lgcsPreviousTransferred, lgcGenerator, debugging.Level)
+ addFlows(saturationCtx, constants.AdditiveNumberOfLoadGeneratingConnections, &lgcs, lgcGenerator, debugging.Level)
previousFlowIncreaseInterval = currentInterval
}
}