I tried go1.21.6 and see the same behavior. I'm going to try to backport the project to go1.18 to see what happens.
On Wednesday, January 10, 2024 at 3:51:16 PM UTC-8 Andrew Athan wrote: > As you can see in the below output from pprof, the golang TLS > implementation seems to be in some kind of tight loop in > crypto/internal/bigmod.addMulVVW2048 causing CPU starvation, wherein the > net.HTTP server stops calling my request handler. Eventually the TLS > handshakes fail, and the connections are dropped before my handler ever > sees them. I guess I'll look for an even newer version of golang, but > wanted to post this here to see if you have any feedback. It seems unlikely > to me that go's TLS package would exhibit this type of regression. > > $ go tool pprof /tmp/cpu.prof2 > File: sgs-server-dev > Type: cpu > Time: Jan 10, 2024 at 10:10pm (UTC) > Duration: 180.20s, Total samples = 892.25s (495.14%) > Entering interactive mode (type "help" for commands, "o" for options) > (pprof) top 10 > Showing nodes accounting for 840.73s, 94.23% of 892.25s total > Dropped 1278 nodes (cum <= 4.46s) > Showing top 10 nodes out of 52 > flat flat% sum% cum cum% > 595.80s 66.78% 66.78% 595.80s 66.78% > crypto/internal/bigmod.addMulVVW2048 > 83.10s 9.31% 76.09% 772.62s 86.59% > crypto/internal/bigmod.(*Nat).montgomeryMul > 53.66s 6.01% 82.10% 53.86s 6.04% > crypto/internal/bigmod.(*Nat).assign (inline) > 42.83s 4.80% 86.90% 42.93s 4.81% > crypto/internal/bigmod.addMulVVW (inline) > 23.23s 2.60% 89.51% 25.10s 2.81% > crypto/internal/bigmod.(*Nat).shiftIn > 14.93s 1.67% 91.18% 14.93s 1.67% > crypto/internal/bigmod.(*Nat).sub (inline) > 7.75s 0.87% 92.05% 7.75s 0.87% runtime.memmove > 7.33s 0.82% 92.87% 7.33s 0.82% runtime.duffzero > 7.12s 0.8% 93.67% 7.12s 0.8% > runtime/internal/syscall.Syscall6 > 4.98s 0.56% 94.23% 4.98s 0.56% crypto/sha256.block > > I am building an executable on this box: > > $ lsb_release -a > No LSB modules are available. > Distributor ID: Ubuntu > Description: Ubuntu 23.04 > Release: 23.04 > Codename: lunar > > $ uname -a > Linux AASalad 6.2.0-36-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Wed Oct 4 > 10:14:28 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux > > $ go version > go version go1.21.4 linux/amd64 > > Using this command: > > GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o a.out -buildvcs=true -a > -ldflags '-extldflags "-static"' > > This executable is then deployed to a Debian 11 host: > > # lsb_release -a > No LSB modules are available. > Distributor ID: Debian > Description: Debian GNU/Linux 11 (bullseye) > Release: 11 > Codename: bullseye > > # uname -a > Linux sgs-dandelion 5.10.0-26-amd64 #1 SMP Debian 5.10.197-1 (2023-09-29) > x86_64 GNU/Linux > > This was done because without the -static build, the right glibc so's are > not found on the target system. When running the executable under high > incoming TLS connection load, I observe that the net.HTTP handler is > eventually not called and lots of these errors are logged: > > http: TLS handshake error from ... > > with this stacktrace: > log.(*Logger).output > /usr/local/go/src/log/log.go:245 > log.(*Logger).Printf > /usr/local/go/src/log/log.go:268 > net/http.(*Server).logf > /usr/local/go/src/net/http/server.go:3212 > net/http.(*conn).serve > /usr/local/go/src/net/http/server.go:1900 > > This exe handles high load and lots of incoming TLS connections. I have > exhaustively looked for a source of CPU starvation such as excessive > numbers of goroutines started by my code, or tight loops, etc. and have not > found evidence for that. > > > Here is the output of pprof tree: > > (pprof) tree > Showing nodes accounting for 853.85s, 95.70% of 892.25s total > Dropped 1278 nodes (cum <= 4.46s) > ----------------------------------------------------------+------------- > flat flat% sum% cum cum% calls calls% + context > ----------------------------------------------------------+------------- > 595.80s 100% | > crypto/internal/bigmod.(*Nat).montgomeryMul > 595.80s 66.78% 66.78% 595.80s 66.78% | > crypto/internal/bigmod.addMulVVW2048 > ----------------------------------------------------------+------------- > 718.77s 93.03% | > crypto/internal/bigmod.(*Nat).Exp > 47.75s 6.18% | > crypto/internal/bigmod.(*Nat).ExpShort > 4.76s 0.62% | > crypto/internal/bigmod.(*Nat).montgomeryRepresentation > 1.34s 0.17% | > crypto/rsa.decrypt > 83.10s 9.31% 76.09% 772.62s 86.59% | > crypto/internal/bigmod.(*Nat).montgomeryMul > 595.80s 77.11% | > crypto/internal/bigmod.addMulVVW2048 > 42.93s 5.56% | > crypto/internal/bigmod.addMulVVW (inline) > 36.25s 4.69% | > crypto/internal/bigmod.(*Nat).maybeSubtractModulus > 6.19s 0.8% | > crypto/internal/bigmod.(*Nat).reset (inline) > 4.19s 0.54% | > runtime.duffzero > 3.54s 0.46% | > runtime.memmove > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/d54e46b0-c8da-4960-bbc6-15415e1febf6n%40googlegroups.com.