From cf63b8e144b4a3f48fd8831500284f3dfba71b7d Mon Sep 17 00:00:00 2001 From: Leandro Moreira Date: Sat, 3 Feb 2024 09:35:57 -0300 Subject: [PATCH] add pprof --- doc/DEV_DIARY.md | 32 + .../entry_memory_leak/allocs_pprof001.svg | 2344 +++++++++++++++++ .../entry_memory_leak/docker_stats1.png.webp | Bin 0 -> 26294 bytes .../entry_memory_leak/docker_stats2.png.webp | Bin 0 -> 33824 bytes .../entry_memory_leak/goroutine_pprof001.svg | 2283 ++++++++++++++++ doc/imgs/entry_memory_leak/pprof001.svg | 1547 +++++++++++ doc/imgs/entry_memory_leak/pprof002.svg | 1547 +++++++++++ doc/imgs/entry_memory_leak/pprof003.svg | 1547 +++++++++++ docker-compose.yaml | 1 + internal/entities/entities.go | 5 +- internal/web/server.go | 7 + 11 files changed, 9311 insertions(+), 2 deletions(-) create mode 100644 doc/DEV_DIARY.md create mode 100644 doc/imgs/entry_memory_leak/allocs_pprof001.svg create mode 100644 doc/imgs/entry_memory_leak/docker_stats1.png.webp create mode 100644 doc/imgs/entry_memory_leak/docker_stats2.png.webp create mode 100644 doc/imgs/entry_memory_leak/goroutine_pprof001.svg create mode 100644 doc/imgs/entry_memory_leak/pprof001.svg create mode 100644 doc/imgs/entry_memory_leak/pprof002.svg create mode 100644 doc/imgs/entry_memory_leak/pprof003.svg diff --git a/doc/DEV_DIARY.md b/doc/DEV_DIARY.md new file mode 100644 index 0000000..931f062 --- /dev/null +++ b/doc/DEV_DIARY.md @@ -0,0 +1,32 @@ +# Investigating a potential memory leak + +## Date: 2/2/24 +### Hyphotesis: There's a memory leak happening +### Signs: pprof/allocs +![allocs profile print screen 1](imgs/entry_memory_leak/allocs_pprof001.svg "allocs profile print screen 1") +### Sumary + +* Start the donut `make run`, +* Check the general profiling http://localhost:6060/debug/pprof/?debug=1 +* Keep refreshing the page, notice that the counters: heap, goroutine, threadcreate are stable +* Access the the demo http://localhost:8080/ +* Go back to the profiling page http://localhost:6060/debug/pprof/?debug=1 +* Notice that the prof counters are stable, regardless if you refresh multiple times +* Now click on `[Connect]` +* Observe how the perf counters go up http://localhost:6060/debug/pprof/?debug=1 +* Keep refreshing the http://localhost:6060/debug/pprof/? and you'll see that the counters `goroutine` and `threacreate` **are stable** but `heap` and `allocs` **counters are growing**. + * You can check the specific heap page as well http://localhost:6060/debug/pprof/heap?debug=1 + * You can run the command `go tool pprof http://localhost:6060/debug/pprof/heap` and type `web`, it'll generate a svg tree map of heap. + * Snapshot 1 at time `Start + 4 m` + * ![heap profile print screen 1](imgs/entry_memory_leak/pprof001.svg "heap profile print screen 1") + * Snapshot 2 at time `Start + 15 m` + * ![heap profile print screen 2](imgs/entry_memory_leak/pprof002.svg "heap profile print screen 2") + * Snapshot 2 at time `Start + 8 h` + * ![heap profile print screen 3](imgs/entry_memory_leak/pprof003.svg "heap profile print screen 3") + * Docker stats `docker stats` at `Start` + * ![docker stats print screen 1](imgs/entry_memory_leak/docker_stats1.png.webp "docker stats print screen 1") + * Docker stats `docker stats` at `Start + 10m` + * ![docker stats print screen 2](imgs/entry_memory_leak/docker_stats2.png.webp "docker stats print screen 2") + +> ref: https://go101.org/article/memory-leaking.html +### Conclusion: there's not leak, I confused allocs growing nature. \ No newline at end of file diff --git a/doc/imgs/entry_memory_leak/allocs_pprof001.svg b/doc/imgs/entry_memory_leak/allocs_pprof001.svg new file mode 100644 index 0000000..02c61a8 --- /dev/null +++ b/doc/imgs/entry_memory_leak/allocs_pprof001.svg @@ -0,0 +1,2344 @@ + + + + + + +donut + + +cluster_L + + + + +File: donut + + +File: donut +Build ID: 0ec0a2eabb9774bfdaafbe299ab576946d93d3dc +Type: alloc_space +Time: Feb 3, 2024 at 8:07am (-03) +Showing nodes accounting for 39172.54MB, 92.53% of 42335.74MB total +Dropped 288 nodes (cum <= 211.68MB) +Dropped 4 edges (freq <= 42.34MB) +Showing top 52 nodes out of 54 +See https://git.io/JfYMW for how to read the graph + + + + + +N1 + + +controllers +(*StreamingController) +Stream +0 of 40865.81MB (96.53%) + + + + + +N2 + + +go-astits +(*Demuxer) +NextData +0 of 20538.87MB (48.51%) + + + + + +N1->N2 + + + + + + + 20538.87MB + + + + + +N5 + + +controllers +(*StreamingController) +writeMpegtsToWebRTC +0 of 20037.39MB (47.33%) + + + + + +N1->N5 + + + + + + + 20037.39MB + + + + + +N29 + + +controllers +(*StreamingController) +captureMediaInfoAndSendToWebRTC +48MB (0.11%) +of 289.55MB (0.68%) + + + + + +N1->N29 + + + + + + + 289.55MB + + + + + +N3 + + +go-astits +parseData +5956.49MB (14.07%) +of 12399.17MB (29.29%) + + + + + +N2->N3 + + + + + + + 12019.64MB + + + + + +N40 + + +go-astits +(*Demuxer) +NextPacket +0 of 7474.08MB (17.65%) + + + + + +N2->N40 + + + + + + + 7474.08MB + + + + + +N42 + + +go-astits +(*packetPool) +add +0 of 1045.16MB (2.47%) + + + + + +N2->N42 + + + + + + + 1045.16MB + + + + + +NN3_0 + + + + + +80B..3kB + + + + + +N3->NN3_0 + + + + + + + 2049.36MB + + + + + +NN3_1 + + + + + +4kB + + + + + +N3->NN3_1 + + + + + + + 1731.25MB + + + + + +NN3_2 + + + + + +4.75kB..18kB + + + + + +N3->NN3_2 + + + + + + + 1372.10MB + + + + + +NN3_3 + + + + + +3.12kB..3.38kB + + + + + +N3->NN3_3 + + + + + + + 697.25MB + + + + + +N14 + + +go-astits +parsePESData +47.50MB (0.11%) +of 5866.15MB (13.86%) + + + + + +N3->N14 + + + + + + + 5866.15MB + + + + + +N26 + + +go-astits +parsePSIData +80.50MB (0.19%) +of 455.02MB (1.07%) + + + + + +N3->N26 + + + + + + + 455.02MB + + + + + +N4 + + +controllers +ParseNAL +10888.67MB (25.72%) + + + + + +NN4_0 + + + + + +1.38kB..4kB + + + + + +N4->NN4_0 + + + + + + + 3399.02MB + + + + + +NN4_1 + + + + + +32B..256B + + + + + +N4->NN4_1 + + + + + + + 2749.45MB + + + + + +NN4_2 + + + + + +896B + + + + + +N4->NN4_2 + + + + + + + 2418.07MB + + + + + +NN4_3 + + + + + +512B + + + + + +N4->NN4_3 + + + + + + + 1985.47MB + + + + + +N11 + + +webrtc +(*TrackLocalStaticSample) +WriteSample +0 of 6960.17MB (16.44%) + + + + + +N5->N11 + + + + + + + 6960.17MB + + + + + +N43 + + +controllers +(*EIA608Reader) +Parse +0 of 13077.22MB (30.89%) + + + + + +N5->N43 + + + + + + + 13077.22MB + + + + + +N6 + + +controllers +ParseNALUs +1969MB (4.65%) +of 13077.22MB (30.89%) + + + + + +N6->N4 + + + + + + + 10888.67MB + + + + + +NN6_0 + + + + + +896B..1.12kB + + + + + +N6->NN6_0 + + + + + + + 1030.63MB + + + + + +NN6_1 + + + + + +512B..576B + + + + + +N6->NN6_1 + + + + + + + 503.28MB + + + + + +NN6_2 + + + + + +32B..288B + + + + + +N6->NN6_2 + + + + + + + 247.07MB + + + + + +N39 + + +bytes +Split +0 of 219.55MB (0.52%) + + + + + +N6->N39 + + + + + + + 219.55MB + (inline) + + + + + +N7 + + +go-astikit +(*BytesIterator) +NextBytes +5561.12MB (13.14%) + + + + + +NN7_0 + + + + + +4kB + + + + + +N7->NN7_0 + + + + + + + 1724.22MB + + + + + +NN7_1 + + + + + +2.62kB + + + + + +N7->NN7_1 + + + + + + + 1521.39MB + + + + + +NN7_2 + + + + + +4.75kB..18kB + + + + + +N7->NN7_2 + + + + + + + 1175.07MB + + + + + +NN7_3 + + + + + +3.38kB + + + + + +N7->NN7_3 + + + + + + + 563.35MB + + + + + +N8 + + +go-astikit +(*BytesIterator) +Dump +5421.98MB (12.81%) + + + + + +NN8_0 + + + + + +192B + + + + + +N8->NN8_0 + + + + + + + 5211.95MB + + + + + +N9 + + +go-astits +parsePacket +1379.56MB (3.26%) +of 7474.08MB (17.65%) + + + + + +N9->N8 + + + + + + + 5421.98MB + (inline) + + + + + +NN9_0 + + + + + +48B + + + + + +N9->NN9_0 + + + + + + + 1379.56MB + + + + + +N19 + + +go-astits +parsePacketHeader +405.51MB (0.96%) + + + + + +N9->N19 + + + + + + + 405.51MB + + + + + +N22 + + +go-astits +parsePacketAdaptationField +261.53MB (0.62%) +of 267.03MB (0.63%) + + + + + +N9->N22 + + + + + + + 267.03MB + + + + + +N10 + + +codecs +emitNalus +2579.32MB (6.09%) +of 4373.85MB (10.33%) + + + + + +NN10_0 + + + + + +384B..896B + + + + + +N10->NN10_0 + + + + + + + 426.84MB + + + + + +NN10_1 + + + + + +1kB + + + + + +N10->NN10_1 + + + + + + + 417.91MB + + + + + +NN10_2 + + + + + +1.12kB + + + + + +N10->NN10_2 + + + + + + + 375.41MB + + + + + +NN10_3 + + + + + +1.25kB + + + + + +N10->NN10_3 + + + + + + + 121.15MB + + + + + +N13 + + +codecs +(*H264Payloader) +Payload +func1 +1794.53MB (4.24%) + + + + + +N10->N13 + + + + + + + 1794.53MB + + + + + +N12 + + +rtp +(*packetizer) +Packetize +913.60MB (2.16%) +of 5287.45MB (12.49%) + + + + + +N11->N12 + + + + + + + 5287.45MB + + + + + +N31 + + +webrtc +(*TrackLocalStaticRTP) +WriteRTP +0 of 1672.72MB (3.95%) + + + + + +N11->N31 + + + + + + + 1672.72MB + + + + + +NN12_0 + + + + + +112B..384B + + + + + +N12->NN12_0 + + + + + + + 843.59MB + + + + + +N48 + + +codecs +(*H264Payloader) +Payload +0 of 4373.85MB (10.33%) + + + + + +N12->N48 + + + + + + + 4373.85MB + + + + + +NN13_0 + + + + + +1.25kB + + + + + +N13->NN13_0 + + + + + + + 1054.79MB + + + + + +N14->N7 + + + + + + + 5560.62MB + + + + + +N36 + + +go-astits +parsePESHeader +21.50MB (0.051%) +of 258.03MB (0.61%) + + + + + +N14->N36 + + + + + + + 258.03MB + + + + + +N15 + + +srtp +(*SessionSRTP) +writeRTP +0 of 1252.67MB (2.96%) + + + + + +N20 + + +sync +(*Pool) +Get +0 of 273.38MB (0.65%) + + + + + +N15->N20 + + + + + + + 115.65MB + + + + + +N34 + + +mux +(*Endpoint) +Write +0 of 697.01MB (1.65%) + + + + + +N15->N34 + + + + + + + 674.51MB + + + + + +N50 + + +srtp +(*Context) +encryptRTP +0 of 454.01MB (1.07%) + + + + + +N15->N50 + + + + + + + 454.01MB + + + + + +N16 + + +go-astits +(*packetAccumulator) +add +665.62MB (1.57%) +of 1045.16MB (2.47%) + + + + + +N16->N3 + + + + + + + 379.53MB + + + + + +NN16_0 + + + + + +256B + + + + + +N16->NN16_0 + + + + + + + 230.56MB + + + + + +N17 + + +webrtc +(*interceptorToTrackLocalWriter) +WriteRTP +374.02MB (0.88%) +of 1626.69MB (3.84%) + + + + + +NN17_0 + + + + + +48B + + + + + +N17->NN17_0 + + + + + + + 374.02MB + + + + + +N47 + + +interceptor +RTPWriterFunc +Write +0 of 1252.67MB (2.96%) + + + + + +N17->N47 + + + + + + + 1252.67MB + + + + + +N18 + + +sctp +(*Association) +writeLoop +0 of 698.57MB (1.65%) + + + + + +N37 + + +dtls +(*Conn) +Write +16.50MB (0.039%) +of 386.55MB (0.91%) + + + + + +N18->N37 + + + + + + + 386.55MB + + + + + +N49 + + +sctp +(*Association) +gatherOutbound +0 of 312.03MB (0.74%) + + + + + +N18->N49 + + + + + + + 312.03MB + + + + + +NN19_0 + + + + + +16B + + + + + +N19->NN19_0 + + + + + + + 405.51MB + + + + + +N21 + + +srtp +(*srtpCipherAesCmHmacSha1) +encryptRTP +125.50MB (0.3%) +of 454.01MB (1.07%) + + + + + +NN21_0 + + + + + +16B + + + + + +N21->NN21_0 + + + + + + + 251.50MB + + + + + +NN22_0 + + + + + +112B + + + + + +N22->NN22_0 + + + + + + + 261.53MB + + + + + +N23 + + +net +(*UDPAddr) +String +0 of 456.51MB (1.08%) + + + + + +NN23_0 + + + + + +16B + + + + + +N23->NN23_0 + + + + + + + 269.50MB + + + + + +N24 + + +go-astits +parsePESOptionalHeader +209.53MB (0.49%) +of 236.53MB (0.56%) + + + + + +N25 + + +bytes +genSplit +219.55MB (0.52%) + + + + + +N28 + + +go-astits +parsePSISection +64.50MB (0.15%) +of 374.52MB (0.88%) + + + + + +N26->N28 + + + + + + + 374.52MB + + + + + +N27 + + +ice +(*Conn) +Write +65MB (0.15%) +of 697.01MB (1.65%) + + + + + +N44 + + +ice +(*CandidatePair) +Write +0 of 632.01MB (1.49%) + + + + + +N27->N44 + + + + + + + 632.01MB + (inline) + + + + + +N35 + + +go-astits +parsePSISectionSyntax +22.50MB (0.053%) +of 255.51MB (0.6%) + + + + + +N28->N35 + + + + + + + 255.51MB + + + + + +N30 + + +sctp +(*Association) +gatherOutboundDataAndReconfigPackets +17MB (0.04%) +of 312.03MB (0.74%) + + + + + +N31->N17 + + + + + + + 1626.69MB + + + + + +N32 + + +dtls +(*Conn) +writePackets +7MB (0.017%) +of 370.05MB (0.87%) + + + + + +N33 + + +dtls +(*Conn) +processPacket +0 of 217.53MB (0.51%) + + + + + +N32->N33 + + + + + + + 217.53MB + + + + + +N34->N27 + + + + + + + 697.01MB + + + + + +N38 + + +go-astits +parsePSISectionSyntaxData +57MB (0.13%) +of 215.51MB (0.51%) + + + + + +N35->N38 + + + + + + + 215.51MB + + + + + +N36->N24 + + + + + + + 236.53MB + + + + + +N37->N32 + + + + + + + 370.05MB + + + + + +N39->N25 + + + + + + + 219.55MB + + + + + +N41 + + +go-astits +(*packetBuffer) +next +0 of 7474.08MB (17.65%) + + + + + +N40->N41 + + + + + + + 7474.08MB + + + + + +N41->N9 + + + + + + + 7474.08MB + + + + + +N42->N16 + + + + + + + 1045.16MB + + + + + +N43->N6 + + + + + + + 13077.22MB + + + + + +N45 + + +ice +(*candidateBase) +writeTo +0 of 632.01MB (1.49%) + + + + + +N44->N45 + + + + + + + 632.01MB + + + + + +N46 + + +ice +(*udpMuxedConn) +WriteTo +0 of 441.01MB (1.04%) + + + + + +N45->N46 + + + + + + + 441.01MB + + + + + +N46->N23 + + + + + + + 441.01MB + + + + + +N52 + + +webrtc +(*RTPSender) +Send +func1 +0 of 1252.67MB (2.96%) + + + + + +N47->N52 + + + + + + + 1252.67MB + + + + + +N48->N10 + + + + + + + 4373.85MB + + + + + +N49->N30 + + + + + + + 312.03MB + + + + + +N50->N21 + + + + + + + 454.01MB + + + + + +N51 + + +srtp +(*WriteStreamSRTP) +WriteRTP +0 of 1252.67MB (2.96%) + + + + + +N51->N15 + + + + + + + 1252.67MB + + + + + +N52->N51 + + + + + + + 1252.67MB + (inline) + + + + + diff --git a/doc/imgs/entry_memory_leak/docker_stats1.png.webp b/doc/imgs/entry_memory_leak/docker_stats1.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..a2db1ec9d0b3dca8f3d74fe3ddace92886928b93 GIT binary patch literal 26294 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 cRX&Z#00000000000000000000000000A%@cqyPW_ literal 0 HcmV?d00001 diff --git a/doc/imgs/entry_memory_leak/docker_stats2.png.webp b/doc/imgs/entry_memory_leak/docker_stats2.png.webp new file mode 100644 index 0000000000000000000000000000000000000000..000a910d32e2f7ec2812ee277f4bf8fd03487eeb GIT binary patch literal 33824 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 !x2=Y2Ek0=|>k! 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 + + + + + +donut + + +cluster_L + + + + +File: donut + + +File: donut +Build ID: 0ec0a2eabb9774bfdaafbe299ab576946d93d3dc +Type: goroutine +Time: Feb 3, 2024 at 8:08am (-03) +Showing nodes accounting for 33, 97.06% of 34 total +Showing top 80 nodes out of 113 +See https://git.io/JfYMW for how to read the graph + + + + + +N1 + + +runtime +gopark +30 (88.24%) + + + + + +N2 + + +runtime +selectgo +0 of 16 (47.06%) + + + + + +N2->N1 + + + + + + + 16 + + + + + +N3 + + +poll +(*pollDesc) +waitRead +0 of 6 (17.65%) + + + + + +N76 + + +poll +(*pollDesc) +wait +0 of 6 (17.65%) + + + + + +N3->N76 + + + + + + + 6 + + + + + +N4 + + +runtime +chanrecv2 +0 of 4 (11.76%) + + + + + +N6 + + +runtime +chanrecv +0 of 6 (17.65%) + + + + + +N4->N6 + + + + + + + 4 + + + + + +N5 + + +packetio +(*Buffer) +Read +0 of 5 (14.71%) + + + + + +N5->N2 + + + + + + + 5 + + + + + +N6->N1 + + + + + + + 6 + + + + + +N7 + + +http +(*conn) +serve +0 of 2 (5.88%) + + + + + +N14 + + +runtime +goroutineProfileWithLabels +1 (2.94%) + + + + + +N7->N14 + + + + + + + 1 + + + + + +N42 + + +bufio +(*Reader) +ReadLine +0 of 1 (2.94%) + + + + + +N7->N42 + + + + + + + 1 + + + + + +N8 + + +net +(*TCPListener) +Accept +0 of 3 (8.82%) + + + + + +N72 + + +poll +(*FD) +Accept +0 of 3 (8.82%) + + + + + +N8->N72 + + + + + + + 3 + + + + + +N9 + + +srtp +(*session) +start +func1 +0 of 2 (5.88%) + + + + + +N11 + + +mux +(*Endpoint) +Read +0 of 3 (8.82%) + + + + + +N9->N11 + + + + + + + 2 + + + + + +N10 + + +webrtc +(*DataChannel) +readLoop +0 of 2 (5.88%) + + + + + +N53 + + +datachannel +(*DataChannel) +ReadDataChannel +0 of 2 (5.88%) + + + + + +N10->N53 + + + + + + + 2 + + + + + +N11->N5 + + + + + + + 3 + + + + + +N12 + + +runtime +cgocall +1 (2.94%) + + + + + +N13 + + +runtime +chanrecv1 +0 of 2 (5.88%) + + + + + +N13->N6 + + + + + + + 2 + + + + + +N15 + + +runtime +notetsleepg +1 (2.94%) + + + + + +N16 + + +context +propagateCancel +func1 +0 of 1 (2.94%) + + + + + +N16->N2 + + + + + + + 1 + + + + + +N17 + + +controllers +(*StreamingController) +Stream +0 of 1 (2.94%) + + + + + +N50 + + +go-astits +(*Demuxer) +NextData +0 of 1 (2.94%) + + + + + +N17->N50 + + + + + + + 1 + + + + + +N18 + + +controllers +(*StreamingController) +readFromSRTIntoWriterPipe +0 of 1 (2.94%) + + + + + +N45 + + +pkg +(*Connection) +Read +0 of 1 (2.94%) + + + + + +N18->N45 + + + + + + + 1 + + + + + +N19 + + +web +NewHTTPServer +func1 +1 +0 of 1 (2.94%) + + + + + +N19->N8 + + + + + + + 1 + + + + + +N20 + + +dtls +(*Conn) +handshake +func2 +0 of 1 (2.94%) + + + + + +N57 + + +dtls +(*handshakeFSM) +Run +0 of 1 (2.94%) + + + + + +N20->N57 + + + + + + + 1 + + + + + +N21 + + +dtls +(*Conn) +handshake +func3 +0 of 1 (2.94%) + + + + + +N56 + + +dtls +(*Conn) +readAndBuffer +0 of 1 (2.94%) + + + + + +N21->N56 + + + + + + + 1 + + + + + +N22 + + +ice +(*Agent) +connectivityChecks +0 of 1 (2.94%) + + + + + +N22->N2 + + + + + + + 1 + + + + + +N23 + + +ice +(*Agent) +startOnConnectionStateChangeRoutine +func1 +0 of 1 (2.94%) + + + + + +N23->N4 + + + + + + + 1 + + + + + +N24 + + +ice +(*Agent) +startOnConnectionStateChangeRoutine +func2 +0 of 1 (2.94%) + + + + + +N24->N2 + + + + + + + 1 + + + + + +N25 + + +ice +(*Agent) +taskLoop +0 of 1 (2.94%) + + + + + +N25->N2 + + + + + + + 1 + + + + + +N26 + + +ice +(*UDPMuxDefault) +GetConn +func1 +0 of 1 (2.94%) + + + + + +N26->N13 + + + + + + + 1 + + + + + +N27 + + +ice +(*UDPMuxDefault) +connWorker +0 of 1 (2.94%) + + + + + +N75 + + +poll +(*FD) +ReadFromInet6 +0 of 1 (2.94%) + + + + + +N27->N75 + + + + + + + 1 + + + + + +N28 + + +ice +(*candidateBase) +recvLoop +0 of 1 (2.94%) + + + + + +N61 + + +ice +(*udpMuxedConn) +ReadFrom +0 of 1 (2.94%) + + + + + +N28->N61 + + + + + + + 1 + + + + + +N29 + + +ice +NewTCPMuxDefault +func1 +0 of 1 (2.94%) + + + + + +N60 + + +ice +(*TCPMuxDefault) +start +0 of 1 (2.94%) + + + + + +N29->N60 + + + + + + + 1 + + + + + +N30 + + +mdns +(*Conn) +start +0 of 1 (2.94%) + + + + + +N71 + + +ipv4 +(*payloadHandler) +ReadFrom +0 of 1 (2.94%) + + + + + +N30->N71 + + + + + + + 1 + + + + + +N31 + + +sctp +(*Association) +readLoop +0 of 1 (2.94%) + + + + + +N55 + + +dtls +(*Conn) +Read +0 of 1 (2.94%) + + + + + +N31->N55 + + + + + + + 1 + + + + + +N32 + + +sctp +(*Association) +writeLoop +0 of 1 (2.94%) + + + + + +N32->N2 + + + + + + + 1 + + + + + +N33 + + +sctp +(*rtxTimer) +start +func1 +0 of 1 (2.94%) + + + + + +N33->N2 + + + + + + + 1 + + + + + +N34 + + +connctx +(*connCtx) +ReadContext +func1 +0 of 1 (2.94%) + + + + + +N34->N2 + + + + + + + 1 + + + + + +N35 + + +webrtc +(*PeerConnection) +undeclaredMediaProcessor +func1 +0 of 1 (2.94%) + + + + + +N65 + + +srtp +(*SessionSRTP) +AcceptStream +0 of 1 (2.94%) + + + + + +N35->N65 + + + + + + + 1 + + + + + +N36 + + +webrtc +(*PeerConnection) +undeclaredMediaProcessor +func2 +0 of 1 (2.94%) + + + + + +N64 + + +srtp +(*SessionSRTCP) +AcceptStream +0 of 1 (2.94%) + + + + + +N36->N64 + + + + + + + 1 + + + + + +N37 + + +webrtc +(*SCTPTransport) +acceptDataChannels +0 of 1 (2.94%) + + + + + +N54 + + +datachannel +Accept +0 of 1 (2.94%) + + + + + +N37->N54 + + + + + + + 1 + + + + + +N38 + + +mux +(*Mux) +readLoop +0 of 1 (2.94%) + + + + + +N59 + + +ice +(*Conn) +Read +0 of 1 (2.94%) + + + + + +N38->N59 + + + + + + + 1 + + + + + +N39 + + +fx +(*signalReceivers) +relayer +0 of 1 (2.94%) + + + + + +N39->N2 + + + + + + + 1 + + + + + +N40 + + +signal +loop +0 of 1 (2.94%) + + + + + +N40->N15 + + + + + + + 1 + + + + + +N41 + + +runtime +main +0 of 1 (2.94%) + + + + + +N67 + + +fx +(*App) +Run +0 of 1 (2.94%) + + + + + +N41->N67 + + + + + + + 1 + + + + + +N43 + + +bufio +(*Reader) +ReadSlice +0 of 1 (2.94%) + + + + + +N42->N43 + + + + + + + 1 + + + + + +N44 + + +bufio +(*Reader) +fill +0 of 1 (2.94%) + + + + + +N43->N44 + + + + + + + 1 + + + + + +N74 + + +poll +(*FD) +Read +0 of 1 (2.94%) + + + + + +N44->N74 + + + + + + + 1 + + + + + +N46 + + +pkg +(*Socket) +ReceiveMessage +0 of 1 (2.94%) + + + + + +N45->N46 + + + + + + + 1 + (inline) + + + + + +N48 + + +pkg +cRecMsg2 +0 of 1 (2.94%) + + + + + +N46->N48 + + + + + + + 1 + + + + + +N47 + + +pkg +_Cfunc_astisrt_recvmsg2 +0 of 1 (2.94%) + + + + + +N47->N12 + + + + + + + 1 + + + + + +N49 + + +pkg +cRecMsg2 +func1 +0 of 1 (2.94%) + + + + + +N48->N49 + + + + + + + 1 + + + + + +N49->N47 + + + + + + + 1 + + + + + +N51 + + +go-astits +(*Demuxer) +NextPacket +0 of 1 (2.94%) + + + + + +N50->N51 + + + + + + + 1 + + + + + +N52 + + +go-astits +(*packetBuffer) +next +0 of 1 (2.94%) + + + + + +N51->N52 + + + + + + + 1 + + + + + +N80 + + +io +ReadAtLeast +0 of 1 (2.94%) + + + + + +N52->N80 + + + + + + + 1 + + + + + +N63 + + +sctp +(*Stream) +ReadSCTP +0 of 2 (5.88%) + + + + + +N53->N63 + + + + + + + 2 + + + + + +N62 + + +sctp +(*Association) +AcceptStream +0 of 1 (2.94%) + + + + + +N54->N62 + + + + + + + 1 + (inline) + + + + + +N55->N2 + + + + + + + 1 + + + + + +N66 + + +connctx +(*connCtx) +ReadContext +0 of 1 (2.94%) + + + + + +N56->N66 + + + + + + + 1 + + + + + +N58 + + +dtls +(*handshakeFSM) +finish +0 of 1 (2.94%) + + + + + +N57->N58 + + + + + + + 1 + + + + + +N58->N2 + + + + + + + 1 + + + + + +N59->N5 + + + + + + + 1 + + + + + +N60->N8 + + + + + + + 1 + + + + + +N61->N5 + + + + + + + 1 + + + + + +N62->N4 + + + + + + + 1 + + + + + +N63->N1 + + + + + + + 2 + + + + + +N64->N4 + + + + + + + 1 + + + + + +N65->N4 + + + + + + + 1 + + + + + +N66->N11 + + + + + + + 1 + + + + + +N68 + + +fx +(*App) +run +0 of 1 (2.94%) + + + + + +N67->N68 + + + + + + + 1 + + + + + +N68->N13 + + + + + + + 1 + + + + + +N69 + + +socket +(*Conn) +RecvMsg +0 of 1 (2.94%) + + + + + +N70 + + +socket +(*Conn) +recvMsg +0 of 1 (2.94%) + + + + + +N69->N70 + + + + + + + 1 + + + + + +N73 + + +poll +(*FD) +RawRead +0 of 1 (2.94%) + + + + + +N70->N73 + + + + + + + 1 + + + + + +N71->N69 + + + + + + + 1 + (inline) + + + + + +N72->N3 + + + + + + + 3 + (inline) + + + + + +N73->N3 + + + + + + + 1 + (inline) + + + + + +N74->N3 + + + + + + + 1 + (inline) + + + + + +N75->N3 + + + + + + + 1 + (inline) + + + + + +N77 + + +poll +runtime_pollWait +0 of 6 (17.65%) + + + + + +N76->N77 + + + + + + + 6 + + + + + +N77->N1 + + + + + + + 6 + + + + + +N78 + + +io +(*PipeReader) +Read +0 of 1 (2.94%) + + + + + +N79 + + +io +(*pipe) +read +0 of 1 (2.94%) + + + + + +N78->N79 + + + + + + + 1 + + + + + +N79->N2 + + + + + + + 1 + + + + + +N80->N78 + + + + + + + 1 + + + + + diff --git a/doc/imgs/entry_memory_leak/pprof001.svg b/doc/imgs/entry_memory_leak/pprof001.svg new file mode 100644 index 0000000..a6ac3f4 --- /dev/null +++ b/doc/imgs/entry_memory_leak/pprof001.svg @@ -0,0 +1,1547 @@ + + + + + + +donut + + +cluster_L + + + + +File: donut + + +File: donut +Build ID: 0ec0a2eabb9774bfdaafbe299ab576946d93d3dc +Type: inuse_space +Time: Feb 2, 2024 at 11:35pm (-03) +Showing nodes accounting for 3105.94kB, 100% of 3105.94kB total +See https://git.io/JfYMW for how to read the graph + + + + + +N1 + + +runtime +allocm +1025kB (33.00%) + + + + + +NN1_0 + + + + + +1kB + + + + + +N1->NN1_0 + + + + + + + 1025kB + + + + + +N2 + + +webrtc +glob +func1 +544.67kB (17.54%) + + + + + +NN2_0 + + + + + +64kB + + + + + +N2->NN2_0 + + + + + + + 544.67kB + + + + + +N3 + + +runtime +schedule +0 of 1025kB (33.00%) + + + + + +N34 + + +runtime +resetspinning +0 of 1025kB (33.00%) + + + + + +N3->N34 + + + + + + + 1025kB + + + + + +N4 + + +runtime +malg +512.20kB (16.49%) + + + + + +NN4_0 + + + + + +416B + + + + + +N4->NN4_0 + + + + + + + 512.20kB + + + + + +N5 + + +vnet +NewInterface +512.05kB (16.49%) + + + + + +NN5_0 + + + + + +96B + + + + + +N5->NN5_0 + + + + + + + 512.05kB + + + + + +N6 + + +http +HandlerFunc +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N15 + + +web +errorHandler +func1 +0 of 512.05kB (16.49%) + + + + + +N6->N15 + + + + + + + 512.05kB + + + + + +N16 + + +web +setCors +func1 +0 of 512.05kB (16.49%) + + + + + +N6->N16 + + + + + + + 512.05kB + + + + + +N7 + + +parse +(*Tree) +newCommand +512.02kB (16.49%) + + + + + +NN7_0 + + + + + +48B + + + + + +N7->NN7_0 + + + + + + + 512.02kB + + + + + +N8 + + +webrtc +(*DataChannel) +readLoop +0 of 544.67kB (17.54%) + + + + + +N37 + + +sync +(*Pool) +Get +0 of 544.67kB (17.54%) + + + + + +N8->N37 + + + + + + + 544.67kB + + + + + +N9 + + +runtime +mcall +0 of 512.50kB (16.50%) + + + + + +N33 + + +runtime +park_m +0 of 512.50kB (16.50%) + + + + + +N9->N33 + + + + + + + 512.50kB + + + + + +N10 + + +runtime +mstart +0 of 512.50kB (16.50%) + + + + + +N28 + + +runtime +mstart0 +0 of 512.50kB (16.50%) + + + + + +N10->N28 + + + + + + + 512.50kB + + + + + +N11 + + +runtime +systemstack +0 of 512.20kB (16.49%) + + + + + +N31 + + +runtime +newproc +func1 +0 of 512.20kB (16.49%) + + + + + +N11->N31 + + + + + + + 512.20kB + + + + + +N12 + + +http +(*conn) +serve +0 of 512.05kB (16.49%) + + + + + +N26 + + +http +serverHandler +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N12->N26 + + + + + + + 512.05kB + + + + + +N13 + + +runtime +main +0 of 512.02kB (16.49%) + + + + + +N27 + + +runtime +doInit +0 of 512.02kB (16.49%) + + + + + +N13->N27 + + + + + + + 512.02kB + + + + + +N14 + + +controllers +(*WebRTCController) +GatheringWebRTC +0 of 512.05kB (16.49%) + + + + + +N22 + + +webrtc +(*PeerConnection) +CreateAnswer +0 of 512.05kB (16.49%) + + + + + +N14->N22 + + + + + + + 512.05kB + + + + + +N17 + + +handlers +(*SignalingHandler) +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N15->N17 + + + + + + + 512.05kB + + + + + +N16->N6 + + + + + + + 512.05kB + + + + + +N17->N14 + + + + + + + 512.05kB + + + + + +N18 + + +ice +NewAgent +0 of 512.05kB (16.49%) + + + + + +N19 + + +vnet +NewNet +0 of 512.05kB (16.49%) + + + + + +N18->N19 + + + + + + + 512.05kB + + + + + +N19->N5 + + + + + + + 512.05kB + (inline) + + + + + +N20 + + +webrtc +(*ICEGatherer) +GetLocalParameters +0 of 512.05kB (16.49%) + + + + + +N21 + + +webrtc +(*ICEGatherer) +createAgent +0 of 512.05kB (16.49%) + + + + + +N20->N21 + + + + + + + 512.05kB + + + + + +N21->N18 + + + + + + + 512.05kB + + + + + +N23 + + +webrtc +(*PeerConnection) +generateMatchedSDP +0 of 512.05kB (16.49%) + + + + + +N22->N23 + + + + + + + 512.05kB + + + + + +N23->N20 + + + + + + + 512.05kB + + + + + +N24 + + +dig +init +0 of 512.02kB (16.49%) + + + + + +N38 + + +template +(*Template) +Parse +0 of 512.02kB (16.49%) + + + + + +N24->N38 + + + + + + + 512.02kB + + + + + +N25 + + +http +(*ServeMux) +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N25->N6 + + + + + + + 512.05kB + + + + + +N26->N25 + + + + + + + 512.05kB + + + + + +N27->N24 + + + + + + + 512.02kB + + + + + +N29 + + +runtime +mstart1 +0 of 512.50kB (16.50%) + + + + + +N28->N29 + + + + + + + 512.50kB + + + + + +N29->N3 + + + + + + + 512.50kB + + + + + +N30 + + +runtime +newm +0 of 1025kB (33.00%) + + + + + +N30->N1 + + + + + + + 1025kB + + + + + +N32 + + +runtime +newproc1 +0 of 512.20kB (16.49%) + + + + + +N31->N32 + + + + + + + 512.20kB + + + + + +N32->N4 + + + + + + + 512.20kB + + + + + +N33->N3 + + + + + + + 512.50kB + + + + + +N36 + + +runtime +wakep +0 of 1025kB (33.00%) + + + + + +N34->N36 + + + + + + + 1025kB + + + + + +N35 + + +runtime +startm +0 of 1025kB (33.00%) + + + + + +N35->N30 + + + + + + + 1025kB + + + + + +N36->N35 + + + + + + + 1025kB + + + + + +N37->N2 + + + + + + + 544.67kB + + + + + +N47 + + +parse +Parse +0 of 512.02kB (16.49%) + + + + + +N38->N47 + + + + + + + 512.02kB + + + + + +N39 + + +parse +(*Tree) +Parse +0 of 512.02kB (16.49%) + + + + + +N42 + + +parse +(*Tree) +parse +0 of 512.02kB (16.49%) + + + + + +N39->N42 + + + + + + + 512.02kB + + + + + +N40 + + +parse +(*Tree) +action +0 of 512.02kB (16.49%) + + + + + +N45 + + +parse +(*Tree) +rangeControl +0 of 512.02kB (16.49%) + + + + + +N40->N45 + + + + + + + 512.02kB + + + + + +N41 + + +parse +(*Tree) +command +0 of 512.02kB (16.49%) + + + + + +N41->N7 + + + + + + + 512.02kB + (inline) + + + + + +N46 + + +parse +(*Tree) +textOrAction +0 of 512.02kB (16.49%) + + + + + +N42->N46 + + + + + + + 512.02kB + + + + + +N43 + + +parse +(*Tree) +parseControl +0 of 512.02kB (16.49%) + + + + + +N44 + + +parse +(*Tree) +pipeline +0 of 512.02kB (16.49%) + + + + + +N43->N44 + + + + + + + 512.02kB + + + + + +N44->N41 + + + + + + + 512.02kB + + + + + +N45->N43 + + + + + + + 512.02kB + + + + + +N46->N40 + + + + + + + 512.02kB + + + + + +N47->N39 + + + + + + + 512.02kB + + + + + diff --git a/doc/imgs/entry_memory_leak/pprof002.svg b/doc/imgs/entry_memory_leak/pprof002.svg new file mode 100644 index 0000000..56d1be1 --- /dev/null +++ b/doc/imgs/entry_memory_leak/pprof002.svg @@ -0,0 +1,1547 @@ + + + + + + +donut + + +cluster_L + + + + +File: donut + + +File: donut +Build ID: 0ec0a2eabb9774bfdaafbe299ab576946d93d3dc +Type: inuse_space +Time: Feb 2, 2024 at 11:46pm (-03) +Showing nodes accounting for 3105.94kB, 100% of 3105.94kB total +See https://git.io/JfYMW for how to read the graph + + + + + +N1 + + +runtime +allocm +1025kB (33.00%) + + + + + +NN1_0 + + + + + +1kB + + + + + +N1->NN1_0 + + + + + + + 1025kB + + + + + +N2 + + +webrtc +glob +func1 +544.67kB (17.54%) + + + + + +NN2_0 + + + + + +64kB + + + + + +N2->NN2_0 + + + + + + + 544.67kB + + + + + +N3 + + +runtime +schedule +0 of 1025kB (33.00%) + + + + + +N34 + + +runtime +resetspinning +0 of 1025kB (33.00%) + + + + + +N3->N34 + + + + + + + 1025kB + + + + + +N4 + + +runtime +malg +512.20kB (16.49%) + + + + + +NN4_0 + + + + + +416B + + + + + +N4->NN4_0 + + + + + + + 512.20kB + + + + + +N5 + + +vnet +NewInterface +512.05kB (16.49%) + + + + + +NN5_0 + + + + + +96B + + + + + +N5->NN5_0 + + + + + + + 512.05kB + + + + + +N6 + + +http +HandlerFunc +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N15 + + +web +errorHandler +func1 +0 of 512.05kB (16.49%) + + + + + +N6->N15 + + + + + + + 512.05kB + + + + + +N16 + + +web +setCors +func1 +0 of 512.05kB (16.49%) + + + + + +N6->N16 + + + + + + + 512.05kB + + + + + +N7 + + +parse +(*Tree) +newCommand +512.02kB (16.49%) + + + + + +NN7_0 + + + + + +48B + + + + + +N7->NN7_0 + + + + + + + 512.02kB + + + + + +N8 + + +webrtc +(*DataChannel) +readLoop +0 of 544.67kB (17.54%) + + + + + +N37 + + +sync +(*Pool) +Get +0 of 544.67kB (17.54%) + + + + + +N8->N37 + + + + + + + 544.67kB + + + + + +N9 + + +runtime +mcall +0 of 512.50kB (16.50%) + + + + + +N33 + + +runtime +park_m +0 of 512.50kB (16.50%) + + + + + +N9->N33 + + + + + + + 512.50kB + + + + + +N10 + + +runtime +mstart +0 of 512.50kB (16.50%) + + + + + +N28 + + +runtime +mstart0 +0 of 512.50kB (16.50%) + + + + + +N10->N28 + + + + + + + 512.50kB + + + + + +N11 + + +runtime +systemstack +0 of 512.20kB (16.49%) + + + + + +N31 + + +runtime +newproc +func1 +0 of 512.20kB (16.49%) + + + + + +N11->N31 + + + + + + + 512.20kB + + + + + +N12 + + +http +(*conn) +serve +0 of 512.05kB (16.49%) + + + + + +N26 + + +http +serverHandler +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N12->N26 + + + + + + + 512.05kB + + + + + +N13 + + +runtime +main +0 of 512.02kB (16.49%) + + + + + +N27 + + +runtime +doInit +0 of 512.02kB (16.49%) + + + + + +N13->N27 + + + + + + + 512.02kB + + + + + +N14 + + +controllers +(*WebRTCController) +GatheringWebRTC +0 of 512.05kB (16.49%) + + + + + +N22 + + +webrtc +(*PeerConnection) +CreateAnswer +0 of 512.05kB (16.49%) + + + + + +N14->N22 + + + + + + + 512.05kB + + + + + +N17 + + +handlers +(*SignalingHandler) +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N15->N17 + + + + + + + 512.05kB + + + + + +N16->N6 + + + + + + + 512.05kB + + + + + +N17->N14 + + + + + + + 512.05kB + + + + + +N18 + + +ice +NewAgent +0 of 512.05kB (16.49%) + + + + + +N19 + + +vnet +NewNet +0 of 512.05kB (16.49%) + + + + + +N18->N19 + + + + + + + 512.05kB + + + + + +N19->N5 + + + + + + + 512.05kB + (inline) + + + + + +N20 + + +webrtc +(*ICEGatherer) +GetLocalParameters +0 of 512.05kB (16.49%) + + + + + +N21 + + +webrtc +(*ICEGatherer) +createAgent +0 of 512.05kB (16.49%) + + + + + +N20->N21 + + + + + + + 512.05kB + + + + + +N21->N18 + + + + + + + 512.05kB + + + + + +N23 + + +webrtc +(*PeerConnection) +generateMatchedSDP +0 of 512.05kB (16.49%) + + + + + +N22->N23 + + + + + + + 512.05kB + + + + + +N23->N20 + + + + + + + 512.05kB + + + + + +N24 + + +dig +init +0 of 512.02kB (16.49%) + + + + + +N38 + + +template +(*Template) +Parse +0 of 512.02kB (16.49%) + + + + + +N24->N38 + + + + + + + 512.02kB + + + + + +N25 + + +http +(*ServeMux) +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N25->N6 + + + + + + + 512.05kB + + + + + +N26->N25 + + + + + + + 512.05kB + + + + + +N27->N24 + + + + + + + 512.02kB + + + + + +N29 + + +runtime +mstart1 +0 of 512.50kB (16.50%) + + + + + +N28->N29 + + + + + + + 512.50kB + + + + + +N29->N3 + + + + + + + 512.50kB + + + + + +N30 + + +runtime +newm +0 of 1025kB (33.00%) + + + + + +N30->N1 + + + + + + + 1025kB + + + + + +N32 + + +runtime +newproc1 +0 of 512.20kB (16.49%) + + + + + +N31->N32 + + + + + + + 512.20kB + + + + + +N32->N4 + + + + + + + 512.20kB + + + + + +N33->N3 + + + + + + + 512.50kB + + + + + +N36 + + +runtime +wakep +0 of 1025kB (33.00%) + + + + + +N34->N36 + + + + + + + 1025kB + + + + + +N35 + + +runtime +startm +0 of 1025kB (33.00%) + + + + + +N35->N30 + + + + + + + 1025kB + + + + + +N36->N35 + + + + + + + 1025kB + + + + + +N37->N2 + + + + + + + 544.67kB + + + + + +N47 + + +parse +Parse +0 of 512.02kB (16.49%) + + + + + +N38->N47 + + + + + + + 512.02kB + + + + + +N39 + + +parse +(*Tree) +Parse +0 of 512.02kB (16.49%) + + + + + +N42 + + +parse +(*Tree) +parse +0 of 512.02kB (16.49%) + + + + + +N39->N42 + + + + + + + 512.02kB + + + + + +N40 + + +parse +(*Tree) +action +0 of 512.02kB (16.49%) + + + + + +N45 + + +parse +(*Tree) +rangeControl +0 of 512.02kB (16.49%) + + + + + +N40->N45 + + + + + + + 512.02kB + + + + + +N41 + + +parse +(*Tree) +command +0 of 512.02kB (16.49%) + + + + + +N41->N7 + + + + + + + 512.02kB + (inline) + + + + + +N46 + + +parse +(*Tree) +textOrAction +0 of 512.02kB (16.49%) + + + + + +N42->N46 + + + + + + + 512.02kB + + + + + +N43 + + +parse +(*Tree) +parseControl +0 of 512.02kB (16.49%) + + + + + +N44 + + +parse +(*Tree) +pipeline +0 of 512.02kB (16.49%) + + + + + +N43->N44 + + + + + + + 512.02kB + + + + + +N44->N41 + + + + + + + 512.02kB + + + + + +N45->N43 + + + + + + + 512.02kB + + + + + +N46->N40 + + + + + + + 512.02kB + + + + + +N47->N39 + + + + + + + 512.02kB + + + + + diff --git a/doc/imgs/entry_memory_leak/pprof003.svg b/doc/imgs/entry_memory_leak/pprof003.svg new file mode 100644 index 0000000..f537241 --- /dev/null +++ b/doc/imgs/entry_memory_leak/pprof003.svg @@ -0,0 +1,1547 @@ + + + + + + +donut + + +cluster_L + + + + +File: donut + + +File: donut +Build ID: 0ec0a2eabb9774bfdaafbe299ab576946d93d3dc +Type: inuse_space +Time: Feb 3, 2024 at 8:08am (-03) +Showing nodes accounting for 3105.94kB, 100% of 3105.94kB total +See https://git.io/JfYMW for how to read the graph + + + + + +N1 + + +runtime +allocm +1025kB (33.00%) + + + + + +NN1_0 + + + + + +1kB + + + + + +N1->NN1_0 + + + + + + + 1025kB + + + + + +N2 + + +webrtc +glob +func1 +544.67kB (17.54%) + + + + + +NN2_0 + + + + + +64kB + + + + + +N2->NN2_0 + + + + + + + 544.67kB + + + + + +N3 + + +runtime +schedule +0 of 1025kB (33.00%) + + + + + +N34 + + +runtime +resetspinning +0 of 1025kB (33.00%) + + + + + +N3->N34 + + + + + + + 1025kB + + + + + +N4 + + +runtime +malg +512.20kB (16.49%) + + + + + +NN4_0 + + + + + +416B + + + + + +N4->NN4_0 + + + + + + + 512.20kB + + + + + +N5 + + +vnet +NewInterface +512.05kB (16.49%) + + + + + +NN5_0 + + + + + +96B + + + + + +N5->NN5_0 + + + + + + + 512.05kB + + + + + +N6 + + +http +HandlerFunc +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N15 + + +web +errorHandler +func1 +0 of 512.05kB (16.49%) + + + + + +N6->N15 + + + + + + + 512.05kB + + + + + +N16 + + +web +setCors +func1 +0 of 512.05kB (16.49%) + + + + + +N6->N16 + + + + + + + 512.05kB + + + + + +N7 + + +parse +(*Tree) +newCommand +512.02kB (16.49%) + + + + + +NN7_0 + + + + + +48B + + + + + +N7->NN7_0 + + + + + + + 512.02kB + + + + + +N8 + + +webrtc +(*DataChannel) +readLoop +0 of 544.67kB (17.54%) + + + + + +N37 + + +sync +(*Pool) +Get +0 of 544.67kB (17.54%) + + + + + +N8->N37 + + + + + + + 544.67kB + + + + + +N9 + + +runtime +mcall +0 of 512.50kB (16.50%) + + + + + +N33 + + +runtime +park_m +0 of 512.50kB (16.50%) + + + + + +N9->N33 + + + + + + + 512.50kB + + + + + +N10 + + +runtime +mstart +0 of 512.50kB (16.50%) + + + + + +N28 + + +runtime +mstart0 +0 of 512.50kB (16.50%) + + + + + +N10->N28 + + + + + + + 512.50kB + + + + + +N11 + + +runtime +systemstack +0 of 512.20kB (16.49%) + + + + + +N31 + + +runtime +newproc +func1 +0 of 512.20kB (16.49%) + + + + + +N11->N31 + + + + + + + 512.20kB + + + + + +N12 + + +http +(*conn) +serve +0 of 512.05kB (16.49%) + + + + + +N26 + + +http +serverHandler +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N12->N26 + + + + + + + 512.05kB + + + + + +N13 + + +runtime +main +0 of 512.02kB (16.49%) + + + + + +N27 + + +runtime +doInit +0 of 512.02kB (16.49%) + + + + + +N13->N27 + + + + + + + 512.02kB + + + + + +N14 + + +controllers +(*WebRTCController) +GatheringWebRTC +0 of 512.05kB (16.49%) + + + + + +N22 + + +webrtc +(*PeerConnection) +CreateAnswer +0 of 512.05kB (16.49%) + + + + + +N14->N22 + + + + + + + 512.05kB + + + + + +N17 + + +handlers +(*SignalingHandler) +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N15->N17 + + + + + + + 512.05kB + + + + + +N16->N6 + + + + + + + 512.05kB + + + + + +N17->N14 + + + + + + + 512.05kB + + + + + +N18 + + +ice +NewAgent +0 of 512.05kB (16.49%) + + + + + +N19 + + +vnet +NewNet +0 of 512.05kB (16.49%) + + + + + +N18->N19 + + + + + + + 512.05kB + + + + + +N19->N5 + + + + + + + 512.05kB + (inline) + + + + + +N20 + + +webrtc +(*ICEGatherer) +GetLocalParameters +0 of 512.05kB (16.49%) + + + + + +N21 + + +webrtc +(*ICEGatherer) +createAgent +0 of 512.05kB (16.49%) + + + + + +N20->N21 + + + + + + + 512.05kB + + + + + +N21->N18 + + + + + + + 512.05kB + + + + + +N23 + + +webrtc +(*PeerConnection) +generateMatchedSDP +0 of 512.05kB (16.49%) + + + + + +N22->N23 + + + + + + + 512.05kB + + + + + +N23->N20 + + + + + + + 512.05kB + + + + + +N24 + + +dig +init +0 of 512.02kB (16.49%) + + + + + +N38 + + +template +(*Template) +Parse +0 of 512.02kB (16.49%) + + + + + +N24->N38 + + + + + + + 512.02kB + + + + + +N25 + + +http +(*ServeMux) +ServeHTTP +0 of 512.05kB (16.49%) + + + + + +N25->N6 + + + + + + + 512.05kB + + + + + +N26->N25 + + + + + + + 512.05kB + + + + + +N27->N24 + + + + + + + 512.02kB + + + + + +N29 + + +runtime +mstart1 +0 of 512.50kB (16.50%) + + + + + +N28->N29 + + + + + + + 512.50kB + + + + + +N29->N3 + + + + + + + 512.50kB + + + + + +N30 + + +runtime +newm +0 of 1025kB (33.00%) + + + + + +N30->N1 + + + + + + + 1025kB + + + + + +N32 + + +runtime +newproc1 +0 of 512.20kB (16.49%) + + + + + +N31->N32 + + + + + + + 512.20kB + + + + + +N32->N4 + + + + + + + 512.20kB + + + + + +N33->N3 + + + + + + + 512.50kB + + + + + +N36 + + +runtime +wakep +0 of 1025kB (33.00%) + + + + + +N34->N36 + + + + + + + 1025kB + + + + + +N35 + + +runtime +startm +0 of 1025kB (33.00%) + + + + + +N35->N30 + + + + + + + 1025kB + + + + + +N36->N35 + + + + + + + 1025kB + + + + + +N37->N2 + + + + + + + 544.67kB + + + + + +N47 + + +parse +Parse +0 of 512.02kB (16.49%) + + + + + +N38->N47 + + + + + + + 512.02kB + + + + + +N39 + + +parse +(*Tree) +Parse +0 of 512.02kB (16.49%) + + + + + +N42 + + +parse +(*Tree) +parse +0 of 512.02kB (16.49%) + + + + + +N39->N42 + + + + + + + 512.02kB + + + + + +N40 + + +parse +(*Tree) +action +0 of 512.02kB (16.49%) + + + + + +N45 + + +parse +(*Tree) +rangeControl +0 of 512.02kB (16.49%) + + + + + +N40->N45 + + + + + + + 512.02kB + + + + + +N41 + + +parse +(*Tree) +command +0 of 512.02kB (16.49%) + + + + + +N41->N7 + + + + + + + 512.02kB + (inline) + + + + + +N46 + + +parse +(*Tree) +textOrAction +0 of 512.02kB (16.49%) + + + + + +N42->N46 + + + + + + + 512.02kB + + + + + +N43 + + +parse +(*Tree) +parseControl +0 of 512.02kB (16.49%) + + + + + +N44 + + +parse +(*Tree) +pipeline +0 of 512.02kB (16.49%) + + + + + +N43->N44 + + + + + + + 512.02kB + + + + + +N44->N41 + + + + + + + 512.02kB + + + + + +N45->N43 + + + + + + + 512.02kB + + + + + +N46->N40 + + + + + + + 512.02kB + + + + + +N47->N39 + + + + + + + 512.02kB + + + + + diff --git a/docker-compose.yaml b/docker-compose.yaml index 66c6671..4ada49f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -11,6 +11,7 @@ services: - "8080:8080" - "8081:8081" - "8081:8081/udp" + - "6060:6060" srt: build: diff --git a/internal/entities/entities.go b/internal/entities/entities.go index 0afb91e..0f47db3 100644 --- a/internal/entities/entities.go +++ b/internal/entities/entities.go @@ -83,8 +83,9 @@ type StreamParameters struct { } type Config struct { - HTTPPort int32 `required:"true" default:"8080"` - HTTPHost string `required:"true" default:"0.0.0.0"` + HTTPPort int32 `required:"true" default:"8080"` + HTTPHost string `required:"true" default:"0.0.0.0"` + PproffHTTPPort int32 `required:"true" default:"6060"` TCPICEPort int `required:"true" default:"8081"` UDPICEPort int `required:"true" default:"8081"` diff --git a/internal/web/server.go b/internal/web/server.go index 8fbe036..d27f234 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -5,6 +5,7 @@ import ( "fmt" "net" "net/http" + _ "net/http/pprof" "github.com/flavioribeiro/donut/internal/entities" "go.uber.org/fx" @@ -30,6 +31,12 @@ func NewHTTPServer( log.Infow(fmt.Sprintf("Starting HTTP server. Open http://%s to access the demo", srv.Addr), "addr", srv.Addr, ) + // profiling server + go func() { + http.ListenAndServe(fmt.Sprintf(":%d", c.PproffHTTPPort), nil) + }() + + // main server go srv.Serve(ln) return nil },