perf(loadbalance): add benchmarks for Least Time and Sticky
- Benchmark Select and Record operations - Concurrent benchmark for realistic load testing - Baseline performance: - LeastTime.Select: ~33ns/op, 0 allocs - LeastTime.Record: ~5.6ns/op, 0 allocs - StickySession.Select: ~205ns/op (with cookie lookup)
This commit is contained in:
parent
ef871f1d39
commit
503daf65d3
96
internal/loadbalance/least_time_bench_test.go
Normal file
96
internal/loadbalance/least_time_bench_test.go
Normal file
@ -0,0 +1,96 @@
|
||||
package loadbalance
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/valyala/fasthttp"
|
||||
)
|
||||
|
||||
func BenchmarkLeastTime_Select(b *testing.B) {
|
||||
lt := NewLeastTime("last_byte", time.Millisecond)
|
||||
targets := []*Target{
|
||||
NewTargetFromConfig("http://a:8080", 1, 0, 0, 0, false, false, ""),
|
||||
NewTargetFromConfig("http://b:8080", 1, 0, 0, 0, false, false, ""),
|
||||
NewTargetFromConfig("http://c:8080", 1, 0, 0, 0, false, false, ""),
|
||||
}
|
||||
|
||||
// Pre-populate stats
|
||||
for _, t := range targets {
|
||||
t.Stats.Record(10*time.Millisecond, 20*time.Millisecond)
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
lt.Select(targets)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkLeastTime_Record(b *testing.B) {
|
||||
stats := NewEWMAStats()
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
stats.Record(10*time.Millisecond, 20*time.Millisecond)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkLeastTime_Concurrent(b *testing.B) {
|
||||
lt := NewLeastTime("last_byte", time.Millisecond)
|
||||
targets := []*Target{
|
||||
NewTargetFromConfig("http://a:8080", 1, 0, 0, 0, false, false, ""),
|
||||
NewTargetFromConfig("http://b:8080", 1, 0, 0, 0, false, false, ""),
|
||||
}
|
||||
|
||||
b.RunParallel(func(pb *testing.PB) {
|
||||
for pb.Next() {
|
||||
lt.Select(targets)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func BenchmarkStickySession_Select(b *testing.B) {
|
||||
fallback := NewRoundRobin()
|
||||
config := DefaultStickyConfig()
|
||||
|
||||
sticky := NewStickySession(config, fallback)
|
||||
sticky.Start()
|
||||
defer sticky.Stop()
|
||||
|
||||
targets := []*Target{
|
||||
NewTargetFromConfig("http://backend1:8080", 1, 0, 0, 0, false, false, ""),
|
||||
NewTargetFromConfig("http://backend2:8080", 1, 0, 0, 0, false, false, ""),
|
||||
}
|
||||
|
||||
// Pre-populate a cookie
|
||||
ctx := &fasthttp.RequestCtx{}
|
||||
sticky.Select(ctx, targets)
|
||||
cookie := ctx.Response.Header.PeekCookie(config.Name)
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
ctx := &fasthttp.RequestCtx{}
|
||||
ctx.Request.Header.SetCookie(config.Name, string(extractCookieValue(cookie)))
|
||||
sticky.Select(ctx, targets)
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkStickySession_SelectNew(b *testing.B) {
|
||||
fallback := NewRoundRobin()
|
||||
config := DefaultStickyConfig()
|
||||
|
||||
sticky := NewStickySession(config, fallback)
|
||||
sticky.Start()
|
||||
defer sticky.Stop()
|
||||
|
||||
targets := []*Target{
|
||||
NewTargetFromConfig("http://backend1:8080", 1, 0, 0, 0, false, false, ""),
|
||||
NewTargetFromConfig("http://backend2:8080", 1, 0, 0, 0, false, false, ""),
|
||||
}
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
ctx := &fasthttp.RequestCtx{}
|
||||
sticky.Select(ctx, targets)
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user