huiping192 / HPRTMP

HPRTMP is a Swift library for RTMP streaming, with an easy-to-use API, efficient message handling, and robust error recovery.
MIT License
15 stars 3 forks source link

High CPU Load #14

Open karino2 opened 1 month ago

karino2 commented 1 month ago

症状

HPRTMPExampleをiOS上でProfile実行すると、CPUのロードが高い。

調べた内容

背景

業務でHPRTMPが使えないかと開発中のアプリにインテグレートして評価してみた所、無事配信は出来たのだけれど、CPUロードが高い。 プロファイルを取ってみると、Actorなどの同期周りで多くのCPUが不可解に消費されていて、HPRTMPExampleを試してもほぼ同じようなCPUの使い方をしているので、調査をしてみて、可能なら修正してPRを送りたいとも思っています。

ただ、調査に入る前にそもそもこれが作者の方でknownな問題であったり解決方法に想像がついたりするかもしれないので、一旦issueを建てさせてもらいました。

karino2 commented 1 month ago

RTMPSocketのstartSendMessagesでキューが空の時にビジーループになってしまうので、以下のように足したらCPU負荷は100%超えから20%くらいに下がりました。

        guard let messageContainer = await messagePriorityQueue.dequeue() else {
          // 10msec寝てみる
          try? await Task.sleep(nanoseconds:  UInt64(10 * 1000 * 1000))
          continue
        }

10msecよりはキューに入ったら起きるのが良いとは思いますが、ここのビジーループを直すとCPU負荷と熱の問題は解決しそうです。 CheckedContinuationを使ってConditional Variableのように待てるキューに直すのがいいと思いますがどうでしょう?

karino2 commented 1 month ago

AsyncStreamで同種の処理が入っていそうなのでPriorityQueueをAsyncStreamにする方が筋が良いかもしれません。

karino2 commented 1 month ago

試しにwithCheckedContinuationでPRを作ってみました(#15) いかがでしょうか?