From 7fe2300d54d13071a213ce8930dad28483d9b518 Mon Sep 17 00:00:00 2001 From: Sachinxmpl Date: Mon, 24 Aug 2026 18:04:12 +0545 Subject: [PATCH 1/4] http server mounting Go's pprof handlers --- internal/debug/server.go | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 internal/debug/server.go diff --git a/internal/debug/server.go b/internal/debug/server.go new file mode 100644 index 0000000..62873a5 --- /dev/null +++ b/internal/debug/server.go @@ -0,0 +1,62 @@ +package debug + +import ( + "context" + "fmt" + "log/slog" + "net" + "net/http" + "net/http/pprof" + "time" +) + +// http server that mounts Go's pprof handlers +// Exposes Go's pprof profiling endpoints on private debug port. +// Bounded to localhost only , not publicly reachable + +type Server struct { + httpSrv *http.Server + ln net.Listener + log *slog.Logger +} + +func NewServer(addr string, log *slog.Logger) *Server { + mux := http.NewServeMux() + + mux.HandleFunc("/debug/pprof/", pprof.Index) + mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) + mux.HandleFunc("/debug/pprof/profile", pprof.Profile) + mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) + mux.HandleFunc("/debug/pprof/trace", pprof.Trace) + + return &Server{ + httpSrv: &http.Server{ + Addr: addr, + Handler: mux, + ReadHeaderTimeout: 5 * time.Second, + }, + log: log, + } +} + +func (s *Server) Start() error { + ln, err := net.Listen("tcp", s.httpSrv.Addr) + if err != nil { + return fmt.Errorf("listen on %s: %w", s.httpSrv.Addr, err) + } + s.ln = ln + + go func(ln net.Listener) { + err := s.httpSrv.Serve(ln) + if err != nil && err != http.ErrServerClosed { + s.log.Error("debug server stopped unexpectedly", "err", err) + } + }(ln) + + s.log.Info("debug server listening", "addr", ln.Addr().String()) + return nil +} + +func (s *Server) ShutDown(ctx context.Context) error { + return s.httpSrv.Shutdown(ctx) +} From 8167dcdad26e1064fedd800d180bd6067ad8ab07 Mon Sep 17 00:00:00 2001 From: Sachinxmpl Date: Mon, 24 Aug 2026 18:47:38 +0545 Subject: [PATCH 2/4] wite debug server to server.go --- cmd/gobalancer/serve.go | 22 ++++++++++++++++++++++ configl7.example.yaml | 37 +++++++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/cmd/gobalancer/serve.go b/cmd/gobalancer/serve.go index c21319a..79532ea 100644 --- a/cmd/gobalancer/serve.go +++ b/cmd/gobalancer/serve.go @@ -9,6 +9,7 @@ import ( "github.com/Sachinxmpl/gobalancer/internal/balancer" "github.com/Sachinxmpl/gobalancer/internal/config" + "github.com/Sachinxmpl/gobalancer/internal/debug" "github.com/Sachinxmpl/gobalancer/internal/health" "github.com/Sachinxmpl/gobalancer/internal/listener" "github.com/Sachinxmpl/gobalancer/internal/metrics" @@ -34,6 +35,12 @@ func Serve(args []string) error { "metrics server address", ) + debugAddr := fs.String( + "debug-addr", + "", + "pprof debug server address, e.g. 127.0.0.1:6060 (empty = disabled)", + ) + if err := fs.Parse(args); err != nil { return err } @@ -62,6 +69,15 @@ func Serve(args []string) error { return err } + var debugSrv *debug.Server + if *debugAddr != "" { + debugSrv = debug.NewServer(*debugAddr, log) + if err := debugSrv.Start(); err != nil { + log.Error("failed to start debug server", "addr", *debugAddr, "err", err) + return err + } + } + balancer, err := balancer.New(cfg.Balancer, registry) if err != nil { log.Error("failed to create balancer", "algorithm", cfg.Balancer, "err", err) @@ -138,6 +154,12 @@ func Serve(args []string) error { log.Warn("Failed to shutdown metrics server", "err", err) } + if debugSrv != nil { + if err := debugSrv.ShutDown(shutdownCtx); err != nil { + log.Warn("failed to shutdown debug server", "err", err) + } + } + log.Info("stopped") return nil } diff --git a/configl7.example.yaml b/configl7.example.yaml index 3ab0ad8..ce33f20 100644 --- a/configl7.example.yaml +++ b/configl7.example.yaml @@ -1,10 +1,39 @@ # example configuration file mode: l7 -listen: "127.0.0.1:8080" +listen: "0.0.0.0:8080" + +balancer: round_robin + +timeouts: + dial: 300ms + read: 30s + write: 30s + idle: 60s + request: 30s + drain: 15s + +health: + active: + interval: 2s + timeout: 500ms + rise: 2 + passive: + fall: 3 + cooldown: 10s + +rate_limit: + global_rps: 0 + per_client_rps: 0 + routes: - - match: { path_prefix: "/" } - pool: default + - match: + path_prefix: "/" + pool: web + pools: - default: + web: - addr: "127.0.0.1:9001" + weight: 1 + - addr: "127.0.0.1:9002" + weight: 1 From 848e9c46729511d25847ffab81d6f5465047fa88 Mon Sep 17 00:00:00 2001 From: Sachinxmpl Date: Mon, 24 Aug 2026 19:00:20 +0545 Subject: [PATCH 3/4] profiling script --- test/bench/profile.sh | 61 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 test/bench/profile.sh diff --git a/test/bench/profile.sh b/test/bench/profile.sh new file mode 100644 index 0000000..5ef4641 --- /dev/null +++ b/test/bench/profile.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +# Captures CPU, heap, and goroutine profiles from GoBalancer while it is under load, +# using the separate pprof debug port. Saves the raw profiles and their -top summaries +# into docs/profiles/. Not part of `make bench` -- profiling is an on-demand step. + +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +OUT="$ROOT/docs/profiles" +mkdir -p "$OUT" + +GOBAL="$ROOT/bin/gobalancer" +BACKEND="$ROOT/bin/testbackend" +LOADGEN="$ROOT/bin/loadgen" + +CONFIG="${CONFIG:-$ROOT/configl7.example.yaml}" +DEBUG="127.0.0.1:6060" +TARGET="http://127.0.0.1:8080/" +RATE="${RATE:-5000}" +CPU_SECONDS="${CPU_SECONDS:-30}" + +echo "building binaries..." +go build -o "$GOBAL" ./cmd/gobalancer +go build -o "$BACKEND" ./testbackend +go build -o "$LOADGEN" ./test/loadgen + +pids=() +cleanup() { for p in "${pids[@]:-}"; do kill "$p" 2>/dev/null || true; done; } +trap cleanup EXIT + +wait_up() { for _ in $(seq 1 100); do curl -s -o /dev/null "$1" && return 0; sleep 0.1; done; echo "timeout $1" >&2; exit 1; } + +# Fast (0ms) backends: keeps the proxy busy doing proxy work rather than waiting on a +# slow backend, so the CPU profile shows where the proxy itself spends time. +NAME=b1 PORT=9001 "$BACKEND" & pids+=($!) +NAME=b2 PORT=9002 "$BACKEND" & pids+=($!) +wait_up "http://127.0.0.1:9001/health" +wait_up "http://127.0.0.1:9002/health" + +# Balancer with the pprof debug port enabled. +"$GOBAL" run -c "$CONFIG" -debug-addr "$DEBUG" -log-level error >/dev/null 2>&1 & pids+=($!) +wait_up "http://$DEBUG/debug/pprof/" +wait_up "$TARGET" + +# Drive load long enough to cover the CPU capture plus the two snapshots. +LOAD_SECONDS=$((CPU_SECONDS + 15)) +"$LOADGEN" -target "$TARGET" -rate "$RATE" -duration "${LOAD_SECONDS}s" -out /dev/null >/dev/null 2>&1 & pids+=($!) +sleep 3 # warm up + +echo "capturing profiles (cpu = ${CPU_SECONDS}s under load)..." +curl -s "http://$DEBUG/debug/pprof/profile?seconds=$CPU_SECONDS" > "$OUT/cpu.prof" +curl -s "http://$DEBUG/debug/pprof/heap" > "$OUT/heap.prof" +curl -s "http://$DEBUG/debug/pprof/goroutine" > "$OUT/goroutine.prof" + +echo "writing -top summaries..." +go tool pprof -top "$GOBAL" "$OUT/cpu.prof" > "$OUT/cpu-top.txt" +go tool pprof -top "$GOBAL" "$OUT/heap.prof" > "$OUT/heap-top.txt" +go tool pprof -top "$GOBAL" "$OUT/goroutine.prof" > "$OUT/goroutine-top.txt" + +echo "done. raw profiles and -top summaries are in docs/profiles/" From ba2284dbf3301b8e17cf372ab7f8a66ed49eb217 Mon Sep 17 00:00:00 2001 From: Sachinxmpl Date: Mon, 24 Aug 2026 20:21:50 +0545 Subject: [PATCH 4/4] docs(profiling): 3 major profiling output + docs --- .gitignore | 1 + docs/benchmark.md | 4 + docs/profiles/cpu-top.txt | 213 ++++++++++++++++++++++++++++++++ docs/profiles/cpu.prof | Bin 0 -> 61812 bytes docs/profiles/goroutine-top.txt | 61 +++++++++ docs/profiles/goroutine.prof | Bin 0 -> 2763 bytes docs/profiles/heap-top.txt | 45 +++++++ docs/profiles/heap.prof | Bin 0 -> 8461 bytes docs/profiling.md | 156 +++++++++++++++++++++++ 9 files changed, 480 insertions(+) create mode 100644 docs/profiles/cpu-top.txt create mode 100644 docs/profiles/cpu.prof create mode 100644 docs/profiles/goroutine-top.txt create mode 100644 docs/profiles/goroutine.prof create mode 100644 docs/profiles/heap-top.txt create mode 100644 docs/profiles/heap.prof create mode 100644 docs/profiling.md diff --git a/.gitignore b/.gitignore index ea76931..900ed8d 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ bin/ coverage.html *.prof coverage.out +!docs/profiles/*.prof test.go diff --git a/docs/benchmark.md b/docs/benchmark.md index 92ec04e..3eba7f8 100644 --- a/docs/benchmark.md +++ b/docs/benchmark.md @@ -135,6 +135,10 @@ Both served every request successfully at ~965/s. **What it proves.** With one sick backend and round-robin balancing, enabling the passive path reduces mean latency from 106 ms to 8.3 ms and p90 from 307 ms to 6.7 ms. With the passive path disabled, round-robin sends approximately one-third of requests to the sick backend; each times out after 300 ms and is retried, so a third of all requests are slow for the entire run. With the passive path enabled, the sick backend is evicted after 3 failures and traffic goes only to the healthy backends. In GoBalancer the passive path is the only mechanism that evicts a backend — the active prober only readmits — so active-only means no eviction at all. The passive+active p999 of 308 ms reflects brief flapping: the active prober's TCP-only probe succeeds against the sick backend (it accepts connections), readmitting it momentarily before the passive path evicts it again. +## Profiling + +Where the CPU and memory actually go under load — CPU, heap, and goroutine profiles captured with pprof — is written up separately in [profiling.md](profiling.md). In short: the proxy spends its CPU on network syscalls and scheduling, holds under 4 MB of live memory, and runs the load on less than one core. + ## Limitations All traffic runs on a single machine over loopback. This measures GoBalancer's own overhead — CPU and memory — not real-world network behaviour. On a real network the round-trip time between machines dwarfs the sub-millisecond cost measured here. Read these as "how much does the balancer add," not "how fast is a request in production." diff --git a/docs/profiles/cpu-top.txt b/docs/profiles/cpu-top.txt new file mode 100644 index 0000000..9d73452 --- /dev/null +++ b/docs/profiles/cpu-top.txt @@ -0,0 +1,213 @@ +File: gobalancer +Build ID: 5a6a7a4d1855a0a9b02d6e6cfbb5336c091cea4a +Type: cpu +Time: 2026-08-24 18:48:58 +0545 +Duration: 30s, Total samples = 25.77s (85.90%) +Showing nodes accounting for 17.89s, 69.42% of 25.77s total +Dropped 590 nodes (cum <= 0.13s) + flat flat% sum% cum cum% + 6.19s 24.02% 24.02% 6.19s 24.02% internal/runtime/syscall/linux.Syscall6 + 2.44s 9.47% 33.49% 2.44s 9.47% runtime.futex + 0.52s 2.02% 35.51% 1.56s 6.05% runtime.stealWork + 0.41s 1.59% 37.10% 0.41s 1.59% runtime.nextFreeFast (inline) + 0.36s 1.40% 38.49% 0.36s 1.40% runtime.usleep + 0.33s 1.28% 39.77% 0.41s 1.59% runtime.lock2 + 0.31s 1.20% 40.98% 0.31s 1.20% runtime.nanotime (inline) + 0.30s 1.16% 42.14% 6.21s 24.10% runtime.findRunnable + 0.26s 1.01% 43.15% 0.27s 1.05% runtime.(*mspan).writeHeapBitsSmall + 0.23s 0.89% 44.04% 0.23s 0.89% runtime.memclrNoHeapPointers + 0.22s 0.85% 44.90% 0.33s 1.28% net/textproto.CanonicalMIMEHeaderKey + 0.21s 0.81% 45.71% 0.79s 3.07% runtime.selectgo + 0.21s 0.81% 46.53% 0.24s 0.93% runtime.unlock2 + 0.19s 0.74% 47.26% 0.20s 0.78% runtime.(*timers).wakeTime (inline) + 0.19s 0.74% 48.00% 1.71s 6.64% runtime.netpoll + 0.16s 0.62% 48.62% 0.16s 0.62% runtime.memmove + 0.15s 0.58% 49.20% 0.52s 2.02% runtime.runqgrab + 0.15s 0.58% 49.79% 0.15s 0.58% time.runtimeNow + 0.14s 0.54% 50.33% 0.14s 0.54% aeshashbody + 0.14s 0.54% 50.87% 0.14s 0.54% indexbytebody + 0.13s 0.5% 51.38% 1.85s 7.18% runtime.mallocgc + 0.12s 0.47% 51.84% 0.13s 0.5% internal/sync.(*Mutex).Lock (inline) + 0.12s 0.47% 52.31% 1.10s 4.27% runtime.newobject + 0.11s 0.43% 52.74% 0.19s 0.74% internal/runtime/maps.(*Map).getWithoutKeySmallFastStr + 0.11s 0.43% 53.16% 1.52s 5.90% runtime.notesleep + 0.11s 0.43% 53.59% 0.18s 0.7% runtime.scanObjectsSmall + 0.10s 0.39% 53.98% 0.19s 0.74% context.(*cancelCtx).Done + 0.10s 0.39% 54.37% 0.22s 0.85% runtime.tryDeferToSpanScan + 0.09s 0.35% 54.71% 0.15s 0.58% runtime.casgstatus + 0.09s 0.35% 55.06% 0.17s 0.66% runtime.ifaceeq + 0.09s 0.35% 55.41% 0.16s 0.62% sync.(*Pool).Get + 0.08s 0.31% 55.72% 4.23s 16.41% github.com/Sachinxmpl/gobalancer/internal/proxy/l7.(*Server).forwardOnce + 0.08s 0.31% 56.03% 2.37s 9.20% net/http.(*conn).readRequest + 0.08s 0.31% 56.34% 0.24s 0.93% runtime.(*timer).modify + 0.08s 0.31% 56.66% 1.41s 5.47% runtime.mallocgcSmallScanNoHeader + 0.08s 0.31% 56.97% 0.33s 1.28% runtime.mapaccess1_faststr + 0.07s 0.27% 57.24% 1.81s 7.02% internal/poll.(*FD).Read + 0.07s 0.27% 57.51% 1.74s 6.75% net/http.(*Transport).roundTrip + 0.07s 0.27% 57.78% 1.38s 5.36% net/http.readRequest + 0.07s 0.27% 58.05% 0.24s 0.93% net/textproto.canonicalMIMEHeaderKey + 0.07s 0.27% 58.32% 0.17s 0.66% runtime.pidleget + 0.07s 0.27% 58.60% 0.21s 0.81% runtime.scanblock + 0.06s 0.23% 58.83% 1.82s 7.06% bufio.(*Reader).Peek + 0.06s 0.23% 59.06% 0.60s 2.33% internal/poll.runtime_pollSetDeadline + 0.06s 0.23% 59.29% 1.06s 4.11% net/textproto.readMIMEHeader + 0.06s 0.23% 59.53% 0.46s 1.79% runtime.mapassign_faststr + 0.05s 0.19% 59.72% 0.64s 2.48% io.copyBuffer + 0.05s 0.19% 59.91% 0.30s 1.16% net/http.(*Transport).queueForIdleConn + 0.05s 0.19% 60.11% 11.76s 45.63% net/http.(*conn).serve + 0.05s 0.19% 60.30% 2.53s 9.82% net/http.(*persistConn).readLoop + 0.05s 0.19% 60.50% 0.30s 1.16% net/http.(*persistConn).readLoop.func4 + 0.05s 0.19% 60.69% 0.75s 2.91% net/http.(*persistConn).roundTrip + 0.05s 0.19% 60.88% 0.14s 0.54% net/http.Header.sortedKeyValues + 0.05s 0.19% 61.08% 0.33s 1.28% net/http.Header.writeSubset + 0.05s 0.19% 61.27% 1.44s 5.59% runtime.futexsleep + 0.05s 0.19% 61.47% 0.19s 0.74% runtime.makechan + 0.05s 0.19% 61.66% 0.19s 0.74% runtime.makeslice + 0.05s 0.19% 61.85% 6.68s 25.92% runtime.park_m + 0.05s 0.19% 62.05% 0.13s 0.5% runtime.scanObject + 0.05s 0.19% 62.24% 6.60s 25.61% runtime.schedule + 0.04s 0.16% 62.40% 1.76s 6.83% bufio.(*Reader).fill + 0.04s 0.16% 62.55% 0.23s 0.89% context.(*cancelCtx).cancel + 0.04s 0.16% 62.71% 0.42s 1.63% context.WithDeadlineCause + 0.04s 0.16% 62.86% 0.13s 0.5% context.parentCancelCtx + 0.04s 0.16% 63.02% 0.16s 0.62% fmt.(*pp).doPrintf + 0.04s 0.16% 63.17% 4.48s 17.38% github.com/Sachinxmpl/gobalancer/internal/proxy/l7.(*Server).ServeHTTP + 0.04s 0.16% 63.33% 0.39s 1.51% io.(*LimitedReader).Read + 0.04s 0.16% 63.48% 1.90s 7.37% net.(*conn).Read + 0.04s 0.16% 63.64% 2.98s 11.56% net/http.(*persistConn).writeLoop + 0.04s 0.16% 63.80% 0.21s 0.81% net/http.readTransfer + 0.04s 0.16% 63.95% 0.42s 1.63% runtime.(*timers).check + 0.04s 0.16% 64.11% 0.38s 1.47% runtime.markroot + 0.04s 0.16% 64.26% 0.56s 2.17% runtime.runqsteal + 0.03s 0.12% 64.38% 4.41s 17.11% bufio.(*Writer).Flush + 0.03s 0.12% 64.49% 0.22s 0.85% github.com/Sachinxmpl/gobalancer/internal/proxy/l7.copyHeader + 0.03s 0.12% 64.61% 0.13s 0.5% internal/poll.(*pollDesc).wait + 0.03s 0.12% 64.73% 0.23s 0.89% internal/runtime/maps.(*Map).Delete + 0.03s 0.12% 64.84% 1.45s 5.63% internal/runtime/syscall/linux.EpollWait + 0.03s 0.12% 64.96% 0.23s 0.89% net/http.(*Request).Clone + 0.03s 0.12% 65.08% 2.86s 11.10% net/http.(*response).finishRequest + 0.03s 0.12% 65.19% 0.28s 1.09% net/http.Header.Clone (inline) + 0.03s 0.12% 65.31% 2.03s 7.88% net/http.checkConnErrorWriter.Write + 0.03s 0.12% 65.42% 0.30s 1.16% net/textproto.MIMEHeader.Del (inline) + 0.03s 0.12% 65.54% 0.18s 0.7% runtime.mapassign + 0.03s 0.12% 65.66% 6.82s 26.46% runtime.mcall + 0.03s 0.12% 65.77% 0.20s 0.78% runtime.newproc1 + 0.03s 0.12% 65.89% 1.61s 6.25% runtime.stopm + 0.02s 0.078% 65.97% 0.36s 1.40% context.(*cancelCtx).propagateCancel + 0.02s 0.078% 66.05% 0.25s 0.97% github.com/Sachinxmpl/gobalancer/internal/metrics.(*Metrics).RequestObserved + 0.02s 0.078% 66.12% 0.13s 0.5% github.com/prometheus/client_golang/prometheus.(*MetricVec).GetMetricWithLabelValues + 0.02s 0.078% 66.20% 0.35s 1.36% internal/runtime/maps.(*Map).growToSmall + 0.02s 0.078% 66.28% 3.93s 15.25% net.(*netFD).Write + 0.02s 0.078% 66.36% 0.24s 0.93% net/http.(*Transport).tryPutIdleConn + 0.02s 0.078% 66.43% 0.36s 1.40% net/http.(*bodyEOFSignal).Read + 0.02s 0.078% 66.51% 1.05s 4.07% net/http.(*connReader).Read + 0.02s 0.078% 66.59% 0.37s 1.44% net/http.(*connReader).backgroundRead + 0.02s 0.078% 66.67% 0.57s 2.21% net/http.(*response).ReadFrom + 0.02s 0.078% 66.74% 0.76s 2.95% net/http.ReadResponse + 0.02s 0.078% 66.82% 1.95s 7.57% net/http.persistConnWriter.Write + 0.02s 0.078% 66.90% 0.14s 0.54% net/textproto.(*Reader).readLineSlice + 0.02s 0.078% 66.98% 0.40s 1.55% runtime.(*mcache).nextFree + 0.02s 0.078% 67.05% 0.44s 1.71% runtime.chansend + 0.02s 0.078% 67.13% 0.43s 1.67% runtime.lockWithRank (inline) + 0.02s 0.078% 67.21% 0.14s 0.54% runtime.mapIterStart + 0.02s 0.078% 67.29% 0.13s 0.5% runtime.mapdelete_faststr + 0.02s 0.078% 67.37% 0.32s 1.24% runtime.reentersyscall + 0.02s 0.078% 67.44% 0.23s 0.89% runtime.slicebytetostring + 0.02s 0.078% 67.52% 0.90s 3.49% runtime.startm + 0.02s 0.078% 67.60% 0.14s 0.54% runtime.sweepone + 0.02s 0.078% 67.68% 2.70s 10.48% runtime.systemstack + 0.02s 0.078% 67.75% 0.26s 1.01% runtime.unlockWithRank (inline) + 0.02s 0.078% 67.83% 1.43s 5.55% syscall.Read (inline) + 0.02s 0.078% 67.91% 5.22s 20.26% syscall.Syscall + 0.02s 0.078% 67.99% 3.84s 14.90% syscall.write + 0.01s 0.039% 68.02% 0.13s 0.5% context.WithCancelCause.func1 + 0.01s 0.039% 68.06% 0.16s 0.62% context.removeChild + 0.01s 0.039% 68.10% 0.25s 0.97% context.withCancel (inline) + 0.01s 0.039% 68.14% 0.27s 1.05% fmt.Fprintf + 0.01s 0.039% 68.18% 0.31s 1.20% github.com/Sachinxmpl/gobalancer/internal/proxy/l7.stripHopByHop + 0.01s 0.039% 68.22% 0.13s 0.5% github.com/prometheus/client_golang/prometheus.(*CounterVec).GetMetricWithLabelValues (inline) + 0.01s 0.039% 68.26% 0.14s 0.54% github.com/prometheus/client_golang/prometheus.(*CounterVec).WithLabelValues + 0.01s 0.039% 68.30% 5.38s 20.88% internal/poll.ignoringEINTRIO (inline) + 0.01s 0.039% 68.34% 0.79s 3.07% internal/poll.setDeadlineImpl + 0.01s 0.039% 68.37% 0.33s 1.28% internal/runtime/maps.newGroups (inline) + 0.01s 0.039% 68.41% 0.32s 1.24% internal/runtime/maps.newarray + 0.01s 0.039% 68.45% 1.83s 7.10% net.(*netFD).Read + 0.01s 0.039% 68.49% 0.86s 3.34% net/http.(*Request).write + 0.01s 0.039% 68.53% 0.47s 1.82% net/http.(*Transport).getConn + 0.01s 0.039% 68.57% 0.16s 0.62% net/http.(*Transport).prepareTransportCancel.func1 + 0.01s 0.039% 68.61% 0.40s 1.55% net/http.(*chunkWriter).writeHeader + 0.01s 0.039% 68.65% 0.33s 1.28% net/http.(*connReader).abortPendingRead + 0.01s 0.039% 68.68% 0.67s 2.60% net/http.(*persistConn).Read + 0.01s 0.039% 68.72% 0.25s 0.97% net/http.(*persistConn).readLoop.func2 + 0.01s 0.039% 68.76% 4.49s 17.42% net/http.serverHandler.ServeHTTP + 0.01s 0.039% 68.80% 1.07s 4.15% net/textproto.(*Reader).ReadMIMEHeader (inline) + 0.01s 0.039% 68.84% 0.13s 0.5% net/url.ParseRequestURI + 0.01s 0.039% 68.88% 0.35s 1.36% runtime.(*mcache).refill + 0.01s 0.039% 68.92% 0.35s 1.36% runtime.entersyscall + 0.01s 0.039% 68.96% 0.25s 0.97% runtime.entersyscallWakeSysmon + 0.01s 0.039% 68.99% 0.13s 0.5% runtime.funcname (inline) + 0.01s 0.039% 69.03% 1.06s 4.11% runtime.futexwakeup + 0.01s 0.039% 69.07% 0.73s 2.83% runtime.goready (inline) + 0.01s 0.039% 69.11% 0.31s 1.20% runtime.newarray + 0.01s 0.039% 69.15% 1.07s 4.15% runtime.notewakeup + 0.01s 0.039% 69.19% 0.70s 2.72% runtime.ready + 0.01s 0.039% 69.23% 0.55s 2.13% runtime.send.goready.func1 + 0.01s 0.039% 69.27% 1.05s 4.07% runtime.wakep + 0.01s 0.039% 69.31% 4.78s 18.55% syscall.RawSyscall6 + 0.01s 0.039% 69.34% 1.41s 5.47% syscall.read + 0.01s 0.039% 69.38% 0.16s 0.62% time.Now + 0.01s 0.039% 69.42% 0.17s 0.66% time.Until + 0 0% 69.42% 0.22s 0.85% context.WithCancel + 0 0% 69.42% 0.42s 1.63% context.WithDeadline (inline) + 0 0% 69.42% 0.42s 1.63% context.WithTimeout + 0 0% 69.42% 0.62s 2.41% internal/poll.(*FD).SetReadDeadline (inline) + 0 0% 69.42% 0.17s 0.66% internal/poll.(*FD).SetWriteDeadline (inline) + 0 0% 69.42% 3.91s 15.17% internal/poll.(*FD).Write + 0 0% 69.42% 0.13s 0.5% internal/poll.(*pollDesc).waitRead (inline) + 0 0% 69.42% 0.59s 2.29% io.Copy (inline) + 0 0% 69.42% 0.52s 2.02% io.CopyBuffer + 0 0% 69.42% 0.62s 2.41% net.(*conn).SetReadDeadline + 0 0% 69.42% 0.17s 0.66% net.(*conn).SetWriteDeadline + 0 0% 69.42% 3.93s 15.25% net.(*conn).Write + 0 0% 69.42% 0.62s 2.41% net.(*netFD).SetReadDeadline (inline) + 0 0% 69.42% 0.17s 0.66% net.(*netFD).SetWriteDeadline (inline) + 0 0% 69.42% 1.74s 6.75% net/http.(*Transport).RoundTrip (inline) + 0 0% 69.42% 0.30s 1.16% net/http.(*bodyEOFSignal).condfn (inline) + 0 0% 69.42% 0.40s 1.55% net/http.(*chunkWriter).Write + 0 0% 69.42% 0.15s 0.58% net/http.(*conn).readRequest.func1 + 0 0% 69.42% 0.13s 0.5% net/http.(*connLRU).remove (inline) + 0 0% 69.42% 0.45s 1.75% net/http.(*connReader).startBackgroundRead + 0 0% 69.42% 0.76s 2.95% net/http.(*persistConn).readResponse + 0 0% 69.42% 0.15s 0.58% net/http.(*response).WriteHeader + 0 0% 69.42% 0.16s 0.62% net/http.Header.Add (inline) + 0 0% 69.42% 0.30s 1.16% net/http.Header.Del (inline) + 0 0% 69.42% 0.18s 0.7% net/http.Header.WriteSubset (inline) + 0 0% 69.42% 0.17s 0.66% net/textproto.(*Reader).ReadLine (inline) + 0 0% 69.42% 0.16s 0.62% net/textproto.MIMEHeader.Add (inline) + 0 0% 69.42% 0.24s 0.93% runtime.(*mcentral).cacheSpan + 0 0% 69.42% 0.17s 0.66% runtime.(*mcentral).grow + 0 0% 69.42% 0.13s 0.5% runtime.(*timer).maybeAdd + 0 0% 69.42% 0.17s 0.66% runtime.bgsweep + 0 0% 69.42% 0.44s 1.71% runtime.chansend1 + 0 0% 69.42% 0.95s 3.69% runtime.gcBgMarkWorker + 0 0% 69.42% 0.83s 3.22% runtime.gcBgMarkWorker.func2 + 0 0% 69.42% 0.83s 3.22% runtime.gcDrain + 0 0% 69.42% 0.48s 1.86% runtime.gcDrainMarkWorkerDedicated (inline) + 0 0% 69.42% 0.35s 1.36% runtime.gcDrainMarkWorkerIdle (inline) + 0 0% 69.42% 0.27s 1.05% runtime.heapSetTypeNoHeader (inline) + 0 0% 69.42% 0.14s 0.54% runtime.isSystemGoroutine + 0 0% 69.42% 0.43s 1.67% runtime.lock (inline) + 0 0% 69.42% 1.52s 5.90% runtime.mPark (inline) + 0 0% 69.42% 0.22s 0.85% runtime.markroot.func1 + 0 0% 69.42% 0.15s 0.58% runtime.netpollgoready + 0 0% 69.42% 0.15s 0.58% runtime.netpollgoready.goready.func1 + 0 0% 69.42% 0.40s 1.55% runtime.newproc + 0 0% 69.42% 0.40s 1.55% runtime.newproc.func1 + 0 0% 69.42% 0.23s 0.89% runtime.resetspinning + 0 0% 69.42% 0.25s 0.97% runtime.scanSpan + 0 0% 69.42% 0.13s 0.5% runtime.scanframeworker + 0 0% 69.42% 0.20s 0.78% runtime.scanstack + 0 0% 69.42% 0.56s 2.17% runtime.send + 0 0% 69.42% 0.26s 1.01% runtime.unlock (inline) + 0 0% 69.42% 0.13s 0.5% sync.(*Mutex).Lock (inline) + 0 0% 69.42% 3.84s 14.90% syscall.Write (inline) diff --git a/docs/profiles/cpu.prof b/docs/profiles/cpu.prof new file mode 100644 index 0000000000000000000000000000000000000000..5dfc7394ab2d9061c00e139c8a7714a3e729da66 GIT binary patch literal 61812 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 Jcl-g+0RRS9)_(v1 literal 0 HcmV?d00001 diff --git a/docs/profiles/goroutine-top.txt b/docs/profiles/goroutine-top.txt new file mode 100644 index 0000000..3004cc5 --- /dev/null +++ b/docs/profiles/goroutine-top.txt @@ -0,0 +1,61 @@ +File: gobalancer +Build ID: 5a6a7a4d1855a0a9b02d6e6cfbb5336c091cea4a +Type: goroutine +Time: 2026-08-24 18:49:28 +0545 +Showing nodes accounting for 67, 98.53% of 68 total + flat flat% sum% cum cum% + 63 92.65% 92.65% 63 92.65% runtime.gopark + 1 1.47% 94.12% 1 1.47% github.com/Sachinxmpl/gobalancer/internal/proxy/l7.stripHopByHop + 1 1.47% 95.59% 1 1.47% runtime.goroutineProfileWithLabels + 1 1.47% 97.06% 1 1.47% runtime.notetsleepg + 1 1.47% 98.53% 1 1.47% syscall.Syscall + 0 0% 98.53% 44 64.71% bufio.(*Reader).Peek + 0 0% 98.53% 44 64.71% bufio.(*Reader).fill + 0 0% 98.53% 1 1.47% github.com/Sachinxmpl/gobalancer/internal/debug.(*Server).Start.func1 + 0 0% 98.53% 2 2.94% github.com/Sachinxmpl/gobalancer/internal/health.(*Manager).Sync.func1 + 0 0% 98.53% 2 2.94% github.com/Sachinxmpl/gobalancer/internal/health.(*Manager).probeLoop + 0 0% 98.53% 1 1.47% github.com/Sachinxmpl/gobalancer/internal/metrics.(*Server).Start.func1 + 0 0% 98.53% 1 1.47% github.com/Sachinxmpl/gobalancer/internal/proxy/l7.(*Server).ServeHTTP + 0 0% 98.53% 1 1.47% github.com/Sachinxmpl/gobalancer/internal/proxy/l7.(*Server).Start.func2 + 0 0% 98.53% 1 1.47% github.com/Sachinxmpl/gobalancer/internal/proxy/l7.(*Server).forwardOnce + 0 0% 98.53% 3 4.41% internal/poll.(*FD).Accept + 0 0% 98.53% 45 66.18% internal/poll.(*FD).Read + 0 0% 98.53% 47 69.12% internal/poll.(*pollDesc).wait + 0 0% 98.53% 47 69.12% internal/poll.(*pollDesc).waitRead (inline) + 0 0% 98.53% 1 1.47% internal/poll.ignoringEINTRIO (inline) + 0 0% 98.53% 47 69.12% internal/poll.runtime_pollWait + 0 0% 98.53% 1 1.47% main.Serve + 0 0% 98.53% 1 1.47% main.Serve.func1 + 0 0% 98.53% 1 1.47% main.main + 0 0% 98.53% 1 1.47% main.run + 0 0% 98.53% 3 4.41% net.(*TCPListener).Accept + 0 0% 98.53% 3 4.41% net.(*TCPListener).accept + 0 0% 98.53% 45 66.18% net.(*conn).Read + 0 0% 98.53% 45 66.18% net.(*netFD).Read + 0 0% 98.53% 3 4.41% net.(*netFD).accept + 0 0% 98.53% 1 1.47% net/http.(*ServeMux).ServeHTTP + 0 0% 98.53% 3 4.41% net/http.(*Server).Serve + 0 0% 98.53% 35 51.47% net/http.(*conn).serve + 0 0% 98.53% 33 48.53% net/http.(*connReader).Read + 0 0% 98.53% 1 1.47% net/http.(*connReader).backgroundRead + 0 0% 98.53% 11 16.18% net/http.(*persistConn).Read + 0 0% 98.53% 11 16.18% net/http.(*persistConn).readLoop + 0 0% 98.53% 11 16.18% net/http.(*persistConn).writeLoop + 0 0% 98.53% 1 1.47% net/http.HandlerFunc.ServeHTTP + 0 0% 98.53% 2 2.94% net/http.serverHandler.ServeHTTP + 0 0% 98.53% 1 1.47% net/http/pprof.Index + 0 0% 98.53% 1 1.47% net/http/pprof.handler.ServeHTTP + 0 0% 98.53% 1 1.47% os/signal.NotifyContext.func1 + 0 0% 98.53% 1 1.47% os/signal.loop + 0 0% 98.53% 1 1.47% os/signal.signal_recv + 0 0% 98.53% 1 1.47% runtime.chanrecv + 0 0% 98.53% 1 1.47% runtime.chanrecv1 + 0 0% 98.53% 1 1.47% runtime.main + 0 0% 98.53% 47 69.12% runtime.netpollblock + 0 0% 98.53% 1 1.47% runtime.pprof_goroutineProfileWithLabels + 0 0% 98.53% 15 22.06% runtime.selectgo + 0 0% 98.53% 1 1.47% runtime/pprof.(*Profile).WriteTo + 0 0% 98.53% 1 1.47% runtime/pprof.writeGoroutine + 0 0% 98.53% 1 1.47% runtime/pprof.writeRuntimeProfile + 0 0% 98.53% 1 1.47% syscall.Read (inline) + 0 0% 98.53% 1 1.47% syscall.read diff --git a/docs/profiles/goroutine.prof b/docs/profiles/goroutine.prof new file mode 100644 index 0000000000000000000000000000000000000000..cbed2771a85002c844375cbe904a9e4e0a708fc4 GIT binary patch literal 2763 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 RKLh{(|NrG5el!Rb004;JUJd{N literal 0 HcmV?d00001 diff --git a/docs/profiles/heap-top.txt b/docs/profiles/heap-top.txt new file mode 100644 index 0000000..85b75ca --- /dev/null +++ b/docs/profiles/heap-top.txt @@ -0,0 +1,45 @@ +File: gobalancer +Build ID: 5a6a7a4d1855a0a9b02d6e6cfbb5336c091cea4a +Type: inuse_space +Time: 2026-08-24 18:49:28 +0545 +Showing nodes accounting for 3691.07kB, 100% of 3691.07kB total + flat flat% sum% cum cum% + 902.59kB 24.45% 24.45% 2136.21kB 57.88% compress/flate.NewWriter (inline) + 650.62kB 17.63% 42.08% 1233.63kB 33.42% compress/flate.(*compressor).init + 583.01kB 15.80% 57.88% 583.01kB 15.80% compress/flate.newDeflateFast (inline) + 528.17kB 14.31% 72.18% 528.17kB 14.31% net/http.init.func16 + 513.69kB 13.92% 86.10% 513.69kB 13.92% syscall.init.func1 + 513kB 13.90% 100% 513kB 13.90% runtime.mallocgc + 0 0% 100% 2136.21kB 57.88% compress/gzip.(*Writer).Write + 0 0% 100% 513.69kB 13.92% google.golang.org/protobuf/internal/impl.init + 0 0% 100% 513.69kB 13.92% google.golang.org/protobuf/internal/impl.init.func1 (inline) + 0 0% 100% 528.17kB 14.31% net/http.(*Request).write + 0 0% 100% 528.17kB 14.31% net/http.(*persistConn).writeLoop + 0 0% 100% 528.17kB 14.31% net/http.(*transferWriter).doBodyCopy + 0 0% 100% 528.17kB 14.31% net/http.(*transferWriter).writeBody + 0 0% 100% 528.17kB 14.31% net/http.getCopyBuf (inline) + 0 0% 100% 513.69kB 13.92% os.Getenv + 0 0% 100% 513kB 13.90% runtime.allocm + 0 0% 100% 513.69kB 13.92% runtime.doInit (inline) + 0 0% 100% 513.69kB 13.92% runtime.doInit1 + 0 0% 100% 513.69kB 13.92% runtime.main + 0 0% 100% 513kB 13.90% runtime.mstart + 0 0% 100% 513kB 13.90% runtime.mstart0 + 0 0% 100% 513kB 13.90% runtime.mstart1 + 0 0% 100% 513kB 13.90% runtime.newm + 0 0% 100% 513kB 13.90% runtime.newobject + 0 0% 100% 513kB 13.90% runtime.resetspinning + 0 0% 100% 513kB 13.90% runtime.schedule + 0 0% 100% 513kB 13.90% runtime.startm + 0 0% 100% 513kB 13.90% runtime.wakep + 0 0% 100% 2136.21kB 57.88% runtime/pprof.(*profileBuilder).appendLocsForStack + 0 0% 100% 2136.21kB 57.88% runtime/pprof.(*profileBuilder).build + 0 0% 100% 2136.21kB 57.88% runtime/pprof.(*profileBuilder).emitLocation + 0 0% 100% 2136.21kB 57.88% runtime/pprof.(*profileBuilder).flush + 0 0% 100% 2136.21kB 57.88% runtime/pprof.profileWriter + 0 0% 100% 513.69kB 13.92% sync.(*Once).Do + 0 0% 100% 513.69kB 13.92% sync.(*Once).doSlow + 0 0% 100% 528.17kB 14.31% sync.(*Pool).Get + 0 0% 100% 513.69kB 13.92% syscall.Getenv + 0 0% 100% 513.69kB 13.92% syscall.init.OnceFunc.func3 + 0 0% 100% 513.69kB 13.92% syscall.init.OnceFunc.func3.1 diff --git a/docs/profiles/heap.prof b/docs/profiles/heap.prof new file mode 100644 index 0000000000000000000000000000000000000000..b93cdc650d8c4d62bc3be6e083b1d4b26703fb33 GIT binary patch literal 8461 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 v;D9zTFi0O