webrtc-stats icon indicating copy to clipboard operation
webrtc-stats copied to clipboard

Add CPU metrics

Open henbos opened this issue 3 years ago • 12 comments

Now that we have a gate for hardware exposure, can we add CPU% metrics to getStats()?

Tagging @pes10k for privacy concerns.

henbos avatar Nov 29 '22 14:11 henbos

I am supportive of this, is there a proposal for this? vis-a-vis the compute-pressure proposal?

vr000m avatar Nov 29 '22 14:11 vr000m

@kenchris can speak for the Compute Pressure if some type of coordination would be beneficial.

anssiko avatar Nov 29 '22 15:11 anssiko

The context here is for evaluating the performance of intensive video conferencing web apps e.g. encoding, recoding, rendering, effects processing, etc. Google Meet is one example. We do specifically want the granularity of CPU% rather than an enum. This gives more fingerprinting surface than an enum, but it is also guarded behind a getUserMedia() permission prompt (camera/microphone actively capturing) or fullscreen usage, so this is not useful for passive tracking.

henbos avatar Nov 29 '22 15:11 henbos

This would be much easier than the current approach of summing up the total encode and decode times, dividing them by the core count (and multiplying by some factor)

fippo avatar Nov 29 '22 17:11 fippo

Also related to #245

vr000m avatar Nov 29 '22 21:11 vr000m

so, CPU% metric will add to which stats object ? or add a new rtcstatstype.?

it's useful in video conference for performing quality limitation in receiver end(webrtc support this in sender side)

bdrtc avatar Nov 30 '22 02:11 bdrtc

This would be much easier than the current approach of summing up the total encode and decode times, dividing them by the core count (and multiplying by some factor)

Hardware encoders/decoders may also queue frames internally, so abnormally high encode/decode times may be reported even in situations where performance is not degraded.

bc-lee avatar Nov 30 '22 03:11 bc-lee

Because the CPU% is a system-wide metric I think we should add a new stats dictionary, e.g. RTCSystemStats, and we could guard the exposure of that entire object on the HW exposure criterion. The alternative would be to add it to RTCPeerConnectionStats simply because that is a singleton that always exists.

Hardware encoders/decoders may also queue frames internally, so abnormally high encode/decode times may be reported even in situations where performance is not degraded.

Agree it's just a heuristic and sometimes it is wrong. This issue is about adding actual system information, not proxy info!

henbos avatar Nov 30 '22 09:11 henbos

Regarding the gate, I understand why gating on capturing context makes sense, but I dont think its appropriate to consider fullscreenElement !== undefined as a gate. If I understand correctly, there are sites where i might have a fullscreen element that are both low engagement and not related to WebRTC (for example, <video>) and where I don't wish to be fingerprintable.

pes10k avatar Nov 30 '22 16:11 pes10k

@pes10k Can you file a separate issue regarding fullscreen and fingerprinting? The intended use case for that was Cloud Gaming and being able to detect HW decoders even though the client is not sending, only receiving

henbos avatar Nov 30 '22 17:11 henbos

Or are you OK with the gate for for previously exposed metrics (e.g. HW encoder/decoder support) but not OK with it for CPU%? If so we could split up the gate into two different gates as part of this issue

henbos avatar Nov 30 '22 17:11 henbos

Sure no problem https://github.com/w3c/webrtc-stats/issues/712

pes10k avatar Nov 30 '22 22:11 pes10k