Closed ToxicityMax closed 1 month ago
hi @ToxicityMax
thanks for the bug report. Will take a look.
hi @ToxicityMax
To try this out, I took an web stream which is very chatty and captured some times along with sending keepalives. This is what I ended up capturing. The output was pretty consistent.
I0723 11:47:05.023154 20797 options.go:19] DEEPGRAM_API_KEY found
I0723 11:47:05.023416 20797 client.go:97] Using DefaultCallbackHandler.
I0723 11:47:05.023420 20797 client.go:113] NewDeepGramWSClient Succeeded
Stream is up and running *http.Response
I0723 11:47:08.470015 20797 client.go:169] Locking connection mutex
I0723 11:47:08.470062 20797 client.go:193] Context is still valid. Retry...
I0723 11:47:08.470351 20797 version.go:45] host decompose... match: false
I0723 11:47:08.470374 20797 version.go:58] protocol: wss
I0723 11:47:08.470386 20797 version.go:59] host: api.deepgram.com
I0723 11:47:08.470446 20797 version.go:69] path decompose - match: false
I0723 11:47:08.620748 20797 client.go:252] HTTP Response: 101 Switching Protocols
[OpenResponse]
I0723 11:47:08.620837 20797 client.go:282] WebSocket Connection Successful!
I0723 11:47:08.972348 20797 client.go:487] live.Stream.Write() took 190.083µs
I0723 11:47:08.972493 20797 client.go:487] live.Stream.Write() took 68.833µs
I0723 11:47:08.972587 20797 client.go:487] live.Stream.Write() took 59.417µs
I0723 11:47:08.972657 20797 client.go:487] live.Stream.Write() took 54.083µs
I0723 11:47:08.972752 20797 client.go:487] live.Stream.Write() took 51.208µs
I0723 11:47:08.972815 20797 client.go:487] live.Stream.Write() took 48.333µs
I0723 11:47:09.131887 20797 client.go:487] live.Stream.Write() took 233.5µs
I0723 11:47:09.132050 20797 client.go:487] live.Stream.Write() took 92.333µs
I0723 11:47:09.132255 20797 client.go:487] live.Stream.Write() took 81.291µs
I0723 11:47:09.132428 20797 client.go:487] live.Stream.Write() took 151.416µs
I0723 11:47:09.132518 20797 client.go:487] live.Stream.Write() took 60.5µs
I0723 11:47:09.132585 20797 client.go:487] live.Stream.Write() took 53.041µs
I0723 11:47:09.132658 20797 client.go:487] live.Stream.Write() took 47.541µs
I0723 11:47:09.132769 20797 client.go:487] live.Stream.Write() took 96.917µs
I0723 11:47:09.132848 20797 client.go:487] live.Stream.Write() took 56.875µs
I0723 11:47:09.132916 20797 client.go:487] live.Stream.Write() took 54.708µs
I0723 11:47:09.132989 20797 client.go:487] live.Stream.Write() took 52.125µs
I0723 11:47:09.133054 20797 client.go:487] live.Stream.Write() took 51µs
I0723 11:47:09.133180 20797 client.go:487] live.Stream.Write() took 50.083µs
I0723 11:47:09.133231 20797 client.go:487] live.Stream.Write() took 26.959µs
I0723 11:47:09.174068 20797 client.go:487] live.Stream.Write() took 113.542µs
I0723 11:47:09.174156 20797 client.go:487] live.Stream.Write() took 39.625µs
I0723 11:47:09.289775 20797 client.go:487] live.Stream.Write() took 138.583µs
I0723 11:47:09.289895 20797 client.go:487] live.Stream.Write() took 56.291µs
I0723 11:47:09.289950 20797 client.go:487] live.Stream.Write() took 34.25µs
I0723 11:47:09.289999 20797 client.go:487] live.Stream.Write() took 39.166µs
I0723 11:47:09.290042 20797 client.go:487] live.Stream.Write() took 29.208µs
I0723 11:47:09.290076 20797 client.go:487] live.Stream.Write() took 26.916µs
I0723 11:47:09.290114 20797 client.go:487] live.Stream.Write() took 26.208µs
I0723 11:47:09.290145 20797 client.go:487] live.Stream.Write() took 24.625µs
I0723 11:47:09.290185 20797 client.go:487] live.Stream.Write() took 29.042µs
I0723 11:47:09.290221 20797 client.go:487] live.Stream.Write() took 28.667µs
I0723 11:47:09.290273 20797 client.go:487] live.Stream.Write() took 29.5µs
I0723 11:47:09.290311 20797 client.go:487] live.Stream.Write() took 30.667µs
I0723 11:47:09.290348 20797 client.go:487] live.Stream.Write() took 29.459µs
I0723 11:47:09.299827 20797 client.go:487] live.Stream.Write() took 44.416µs
I0723 11:47:09.364289 20797 client.go:487] live.Stream.Write() took 165.583µs
I0723 11:47:09.427427 20797 client.go:487] live.Stream.Write() took 123.583µs
I0723 11:47:09.485353 20797 client.go:487] live.Stream.Write() took 126.125µs
I0723 11:47:09.555056 20797 client.go:487] live.Stream.Write() took 132.167µs
I0723 11:47:11.473136 20797 client.go:487] live.Stream.Write() took 161.875µs
[MessageResponse] (Final) Because, you know, she vietnamese daughter. She has to be
I0723 11:47:11.535954 20797 client.go:487] live.Stream.Write() took 108.458µs
I0723 11:47:11.597601 20797 client.go:487] live.Stream.Write() took 118.584µs
I0723 11:47:11.661139 20797 client.go:487] live.Stream.Write() took 138.166µs
I0723 11:47:11.721552 20797 client.go:487] live.Stream.Write() took 125.166µs
I0723 11:47:11.781476 20797 client.go:487] live.Stream.Write() took 109.542µs
I0723 11:47:11.854182 20797 client.go:487] live.Stream.Write() took 140µs
I0723 11:47:11.920868 20797 client.go:487] live.Stream.Write() took 137.833µs
I0723 11:47:11.992807 20797 client.go:487] live.Stream.Write() took 113.792µs
I0723 11:47:12.054853 20797 client.go:487] live.Stream.Write() took 124.584µs
I0723 11:47:13.622600 20797 client.go:788] KeepAlive took 484µs
I0723 11:47:13.622662 20797 client.go:797] KeepAlive total 562.75µs
I0723 11:47:13.957911 20797 client.go:487] live.Stream.Write() took 162.542µs
I0723 11:47:14.026284 20797 client.go:487] live.Stream.Write() took 170.5µs
I0723 11:47:14.084280 20797 client.go:487] live.Stream.Write() took 115.416µs
I0723 11:47:14.144113 20797 client.go:487] live.Stream.Write() took 90.042µs
[MessageResponse] (Final) like her mom and everything. So now she's like,
I0723 11:47:14.214681 20797 client.go:487] live.Stream.Write() took 173.625µs
I0723 11:47:14.280933 20797 client.go:487] live.Stream.Write() took 149.542µs
I0723 11:47:14.348692 20797 client.go:487] live.Stream.Write() took 163.166µs
I0723 11:47:14.418492 20797 client.go:487] live.Stream.Write() took 171.916µs
I0723 11:47:14.483041 20797 client.go:487] live.Stream.Write() took 112.417µs
I0723 11:47:14.547900 20797 client.go:487] live.Stream.Write() took 146.542µs
I0723 11:47:14.620780 20797 client.go:487] live.Stream.Write() took 168.792µs
I0723 11:47:14.672964 20797 client.go:487] live.Stream.Write() took 103.625µs
I0723 11:47:14.740687 20797 client.go:487] live.Stream.Write() took 203.666µs
I0723 11:47:14.804617 20797 client.go:487] live.Stream.Write() took 126.833µs
I0723 11:47:14.863261 20797 client.go:487] live.Stream.Write() took 156.75µs
I0723 11:47:14.930339 20797 client.go:487] live.Stream.Write() took 118.042µs
I0723 11:47:14.999019 20797 client.go:487] live.Stream.Write() took 175.917µs
I0723 11:47:15.064329 20797 client.go:487] live.Stream.Write() took 156.625µs
I0723 11:47:15.117409 20797 client.go:487] live.Stream.Write() took 144.5µs
I0723 11:47:15.168892 20797 client.go:487] live.Stream.Write() took 153.834µs
I0723 11:47:16.942861 20797 client.go:487] live.Stream.Write() took 252.292µs
I0723 11:47:17.006782 20797 client.go:487] live.Stream.Write() took 133.291µs
I0723 11:47:17.075311 20797 client.go:487] live.Stream.Write() took 188.041µs
I0723 11:47:17.134850 20797 client.go:487] live.Stream.Write() took 134.875µs
I0723 11:47:17.198178 20797 client.go:487] live.Stream.Write() took 153.166µs
I0723 11:47:17.261212 20797 client.go:487] live.Stream.Write() took 140µs
I0723 11:47:17.320880 20797 client.go:487] live.Stream.Write() took 143.041µs
I0723 11:47:17.382806 20797 client.go:487] live.Stream.Write() took 111.75µs
I0723 11:47:17.453135 20797 client.go:487] live.Stream.Write() took 135.958µs
I0723 11:47:17.521284 20797 client.go:487] live.Stream.Write() took 108.042µs
[MessageResponse] (Final) my mentor because I always look up to her when, you know, before a major champ or when
I0723 11:47:18.622542 20797 client.go:788] KeepAlive took 308.667µs
I0723 11:47:18.622608 20797 client.go:797] KeepAlive total 459.584µs
I0723 11:47:19.435949 20797 client.go:487] live.Stream.Write() took 163.041µs
I0723 11:47:19.495652 20797 client.go:487] live.Stream.Write() took 98.375µs
I0723 11:47:19.556968 20797 client.go:487] live.Stream.Write() took 151.792µs
I0723 11:47:19.617314 20797 client.go:487] live.Stream.Write() took 133.791µs
I0723 11:47:19.690947 20797 client.go:487] live.Stream.Write() took 153µs
I0723 11:47:19.749924 20797 client.go:487] live.Stream.Write() took 137.042µs
I0723 11:47:19.816203 20797 client.go:487] live.Stream.Write() took 150.958µs
I0723 11:47:19.887813 20797 client.go:487] live.Stream.Write() took 125.042µs
I0723 11:47:19.947351 20797 client.go:487] live.Stream.Write() took 119.792µs
I0723 11:47:20.003942 20797 client.go:487] live.Stream.Write() took 136.708µs
I0723 11:47:20.081286 20797 client.go:487] live.Stream.Write() took 127.041µs
I0723 11:47:20.148877 20797 client.go:487] live.Stream.Write() took 155.791µs
I0723 11:47:20.207423 20797 client.go:487] live.Stream.Write() took 145µs
I0723 11:47:20.286608 20797 client.go:487] live.Stream.Write() took 128.166µs
I0723 11:47:20.352653 20797 client.go:487] live.Stream.Write() took 149.542µs
I0723 11:47:20.423400 20797 client.go:487] live.Stream.Write() took 128.917µs
I0723 11:47:20.510859 20797 client.go:487] live.Stream.Write() took 121.666µs
I0723 11:47:20.569095 20797 client.go:487] live.Stream.Write() took 131.083µs
I0723 11:47:20.631816 20797 client.go:487] live.Stream.Write() took 157.125µs
I0723 11:47:20.694623 20797 client.go:487] live.Stream.Write() took 120.708µs
What region are you in? Is it ap-south-1
by any chance?
Hey! Yes I am located in the ap-south-1 region. Historically, this hasn't impacted our performance ever, and we've consistently experienced good-quality transcriptions with minimal latency. However, starting around last 18 july, we've encountered significant performance degradation and severe delays.
>> ping api.deepgram.com
64 bytes from 38.142.135.243: icmp_seq=8 ttl=39 time=254.525 ms
This, unfortunately, is a known issue that started several weeks (4+) ago. Here is some additional info on how to mitigate this issue: https://discord.com/channels/1108042150941294664/1264193396726304868/1264349196182618182
Closing the issue since this isn't SDK related.
What is the current behavior?
The Deepgram Go SDK is experiencing significant delays when sending audio packets over a websocket. Specifically, the
WriteBinary
calls often take much longer than expected, 2-5 seconds and sometimes up to 15 seconds. Additionally, the Connect call can also take an unusually long time, up to 2-3 seconds. These delays cause severe audio packet loss, affecting the overall performance of the audio processing pipeline.Steps to reproduce
Expected behavior
The WriteBinary calls should consistently complete within 100µs to less than 100-200ms.
Please tell us about your environment
Other information
The delays are suspected to stem from an internal keep-alive periodic loop within the Deepgram SDK. This loop holds a lock for longer than anticipated, which impacts the performance of WriteBinary and Connect calls.
The
WriteBinary
method locksc.muConn
to ensure exclusive access to the WebSocket connection. This mutex lock prevents concurrent write operations but may introduce delays if multiple goroutines are trying to write simultaneously. This lock contention could lead to increased wait times for acquiring the lock.The
internalConnect
method is called for every write operation includingKeepAlive
,WriteBinary
,WriteJson
. It may involve re-establishing the connection if it is invalid. This can add latency, especially if the connection is not immediately available or ifinternalConnect
frequently reestablishes connections.Despite batching packets to reduce the number of WriteBinary calls, the issue persists.
The delays caused the pipeline for reading audio packets to choke, resulting in severe audio packet loss. Despite optimizations, transcription times remain excessively long.
Even with optimizations above, it sometimes takes up to 15 seconds
Example logs:
Connect taking >2s
Write taking >3s