// DoParallelContainerStopBenchmark starts routineNumber of goroutines and let them stop containers, returns latencies // of all the stopping calls in nanoseconds. There is a global rate limit on stopping calls per second. func DoParallelContainerStopBenchmark(client *docker.Client, qps float64, routineNumber int) []int { wg := &sync.WaitGroup{} ids := GetContainerIDs(client) idTable := make([][]string, routineNumber) for i := 0; i < len(ids); i++ { idTable[i%routineNumber] = append(idTable[i%routineNumber], ids[i]) } wg.Add(routineNumber) ratelimit := ratelimit.NewBucketWithRate(qps, int64(routineNumber)) latenciesTable := make([][]int, routineNumber) for i := 0; i < routineNumber; i++ { go func(index int) { latencies := []int{} for _, id := range idTable[index] { ratelimit.Wait(1) start := time.Now() StopContainers(client, []string{id}) RemoveContainers(client, []string{id}) latencies = append(latencies, int(time.Since(start).Nanoseconds())) } latenciesTable[index] = latencies wg.Done() }(i) } wg.Wait() allLatencies := []int{} for _, latencies := range latenciesTable { allLatencies = append(allLatencies, latencies...) } return allLatencies }
// DoParallelContainerStartBenchmark starts routineNumber of goroutines and let them start containers, returns latencies // of all the starting calls in nanoseconds. There is a global rate limit on starting calls per second. func DoParallelContainerStartBenchmark(client *docker.Client, qps float64, testPeriod time.Duration, routineNumber int) []int { wg := &sync.WaitGroup{} wg.Add(routineNumber) ratelimit := ratelimit.NewBucketWithRate(qps, int64(routineNumber)) latenciesTable := make([][]int, routineNumber) for i := 0; i < routineNumber; i++ { go func(index int) { startTime := time.Now() latencies := []int{} for { ratelimit.Wait(1) start := time.Now() ids := CreateContainers(client, 1) StartContainers(client, ids) latencies = append(latencies, int(time.Since(start).Nanoseconds())) if time.Now().Sub(startTime) >= testPeriod { break } } latenciesTable[index] = latencies wg.Done() }(i) } wg.Wait() allLatencies := []int{} for _, latencies := range latenciesTable { allLatencies = append(allLatencies, latencies...) } return allLatencies }