hello, curious if you were able to resolve the issue by downgrading golang? 
I am having the exact same issue as you with cpu blowing up 
at crypto/internal/bigmod.(*Nat).montgomeryMul causing TLS handshakes to 
fail

On Thursday, January 11, 2024 at 8:06:16 AM UTC+8 Andrew Athan wrote:

> 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/61ef16e4-9e4f-4ad7-9056-ee1ab2ca65a7n%40googlegroups.com.

Reply via email to