Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

High CPU Load #14

Open
karino2 opened this issue Jul 13, 2024 · 3 comments
Open

High CPU Load #14

karino2 opened this issue Jul 13, 2024 · 3 comments

Comments

@karino2
Copy link

karino2 commented Jul 13, 2024

症状

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

調べた内容

  • tryAssumeThreadForSwitch, canGiveUpThreadForSwitch, giveUpThreadForSwitchが時間を使っている主なエントリーポイント
    • だいたいはRTMPSocket.startSendMessagesで時間を食っていそう
    • DefaultActorImpl::unlockなどがかなり時間を食っているように見える

背景

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

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

@karino2
Copy link
Author

karino2 commented Jul 14, 2024

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
Copy link
Author

karino2 commented Jul 14, 2024

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

karino2 added a commit to karino2/HPRTMP that referenced this issue Jul 14, 2024
Now PriorityQueue::deque() becomes async and always return MessageContainer and never return nil.
When no message is available, sleep with withCheckedContinuation until new message is comming.

With this change, HPRTMPExample CPU load becomes 14% for my iPhone 14 pro (previous: more than 100%).
@karino2
Copy link
Author

karino2 commented Jul 14, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant