Open karino2 opened 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のように待てるキューに直すのがいいと思いますがどうでしょう?
AsyncStreamで同種の処理が入っていそうなのでPriorityQueueをAsyncStreamにする方が筋が良いかもしれません。
試しにwithCheckedContinuationでPRを作ってみました(#15) いかがでしょうか?
症状
HPRTMPExampleをiOS上でProfile実行すると、CPUのロードが高い。
調べた内容
背景
業務でHPRTMPが使えないかと開発中のアプリにインテグレートして評価してみた所、無事配信は出来たのだけれど、CPUロードが高い。 プロファイルを取ってみると、Actorなどの同期周りで多くのCPUが不可解に消費されていて、HPRTMPExampleを試してもほぼ同じようなCPUの使い方をしているので、調査をしてみて、可能なら修正してPRを送りたいとも思っています。
ただ、調査に入る前にそもそもこれが作者の方でknownな問題であったり解決方法に想像がついたりするかもしれないので、一旦issueを建てさせてもらいました。