Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ブラウザアプリの継続的パフォーマンスモニタリング (序) / Continuous ...
Search
moznion
September 03, 2026
Technology
40
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ブラウザアプリの継続的パフォーマンスモニタリング (序) / Continuous Browser Application Performance Monitoring; Act 1
ToKyoto.js #03
の資料です
moznion
September 03, 2026
More Decks by moznion
See All by moznion
reFACToring
moznion
1
1.3k
cccccc
moznion
1
2.5k
履歴テーブル、今回はこう作りました 〜 Delegated Types編 〜 / How We Built Our History Table This Time — With Delegated Types
moznion
16
15k
「データ無い! 腹立つ! 推論する!」から 「データ無い! 腹立つ! データを作る」へ チームでデータを作り、育てられるようにするまで / How can we create, use, and maintain data ourselves?
moznion
11
7.6k
避けられないI/O待ちに対処する: Rails アプリにおけるSSEとasync gemの活用 / Tackling Inevitable I/O Latency in Rails Apps with SSE and the async gem
moznion
4
9.2k
RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate
moznion
1
460
地に足の付いた現実的な技術選定から魔力のある体験を得る『AIレシート読み取り機能』のケーススタディ / From Grounded Tech Choices to Magical UX: A Case Study of AI Receipt Scanning
moznion
7
5.2k
Chrome Extension Techniques from Hell
moznion
1
330
Simple組み合わせ村から大都会Railsにやってきた俺は / Coming to Rails from the Simple
moznion
4
9k
Other Decks in Technology
See All in Technology
アクセスキー流出時の対応で再認識した攻撃側と防御側の非対称性について
kazzpapa3
1
500
bet_ai_day_2026_session02
agenticsec
0
210
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.3k
Claude Codeの体系的な理解と知識のフック
oikon48
10
6.4k
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
470
どんな手を使っても絶対間に合わせるスケジューラ
asari194617
0
1.5k
AI駆動開発を組織で促すために
lycorptech_jp
PRO
7
9.1k
1.5時間を無駄にして学んだwsl2におけるaptとsnapの選択と仕組み
yosaka0123
0
480
人気商品が「ちゃんと買える」をつくる ー ECの負荷改善
ykagano
1
170
AWSとAzureのマルチクラウド活用における強い味方___AWS_Kiroを使った二刀流スキル作成.pdf
duelist2020jp
1
160
Introduction to Bill One Development Engineer
sansan33
PRO
0
480
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.5k
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Chasing Engaging Ingredients in Design
codingconduct
0
290
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
850
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
830
Become a Pro
speakerdeck
PRO
31
6.2k
Leo the Paperboy
mayatellez
8
2.2k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Six Lessons from altMBA
skipperchong
29
4.5k
Fireside Chat
paigeccino
42
4k
Code Reviewing Like a Champion
maltzj
528
40k
Transcript
© Timeleap Inc. CONFIDENTIAL ブラウザアプリの 継続的パフォーマンス モニタリング (序) Thu, 3
Sep 2026 ToKyoto.js #03 https://timeleap.co.jp/ @moznion 1
@moznion タイムリープ株式会社 ソフトウェアエンジニア プロダクト責任者 — はてなインターン2013参加者 ということで今⽇は京都陣営
背景共有 WebRTCを使って遠隔接客を提供しているブラウザアプリを開発‧運⽤ © Timeleap Inc. 3
パフォーマンスモニタリング Google Meetとかにあるコレが欲しい © Timeleap Inc. 4
パフォーマンスモニタリング モチベーションは様々 「重い」「⾳が途切れる」「映像が固まった」などといったお客様の報告内容と 正確な事象発⽣時刻を対応させたい サーバーサイドやWebRTCコンポーネントのエラーとの突合をしたい 諸要因によるCPU逼迫、アプリのヒープ肥⼤、ネットワーク環境の劣化などを検出したい などなど…… © Timeleap Inc.
5
というわけで作って提供した © Timeleap Inc. 6
計測できる項⽬ • CPU負荷 (利⽤状況) • メモリ使⽤量 (JavaScriptヒープ) • ネットワーク利⽤状況 (WebRTC)
◦ 送受信帯域 ◦ RTT ◦ Jitter ◦ パケットロスレート © Timeleap Inc. 7
CPU負荷 • Compute Pressure API ◦ nominal, fair, serious, criticalの4値でCPU利⽤状況が取れる†
◦ (主として) プライバシー保護の観点から精緻な利⽤率は取れない†† ◦ 今回はこれを採⽤ • chrome.system.cpu API ◦ Chrome拡張のAPIを使ってCPU利⽤率を取得する ◦ Compute Pressure APIとは違い、精緻な利⽤率が取れる ◦ Google Meetの機能はこれを使って実現されている ▪ Chromeがデフォルトで権限を付与しているからできる †† †: 良いデモ => https://w3c.github.io/compute-pressure/demo/ ††: 例えばFingerprinting等 †††: https://x.com/lcasdev/status/1810696257137959018 © Timeleap Inc. 8
メモリ使⽤量 • performance.memory ◦ ウェブページのメモリフットプリントを測定 ▪ JavaScriptのヒープサイズを返却する ◦ ⾮標準かつ⾮推奨: Chromeなど特定のブラウザのみ対応
とにかく使っちゃ駄⽬そうなムードがすごい ◦ が、今回は採⽤ © Timeleap Inc. 9
メモリ使⽤量 • performance.measureUserAgentSpecificMemory() ◦ performance.memoryの後継 ◦ JSヒープだけではなくページ全体のメモリを測定できる ◦ HTTPSの利⽤とcross-origin isolation
(COOP + COEP) が必要 まだ若そうな機能 ◦ 実際にはこれを使った⽅が良かったと思う…… © Timeleap Inc. 10
WebRTCのネットワーク利⽤状況 • RTCInboundRtpStreamStats ◦ WebRTCのありとあらゆるStatsが取得できる ▪ 多すぎるので説明略 (ドキュメントを参照ください) ▪ これを取得して貯めておくと何かと便利
◦ これを取得するには RTCPeerConnection.getStats() や RTCRtpReceiver.getStats() を呼ぶのだが…… ▪ ハングするケースがある ▪ Promise.raceなどを使ってタイムアウトを設けるのが安全 • getStats()⾃体はキャンセルされないのでin-flight 対応は別途必要 (さもなくばスタックする) © Timeleap Inc. 11
アーキテクチャ Infra 取得 CPU Pressure State Collector Scheduler ClientMetricsSampleをファンアウト performance
memory usedJSHeapSize WebRTCStats 毎秒 Trigger Sink † Hydration Ring Buffer Chart UIへ †: WebRTCStatsは各コネクション毎にサンプル間の差分を返却 append-only IndexedDB JSON Dumpへ © Timeleap Inc. 12
アーキテクチャ上の特徴 • ⾊々と増やしやすい ◦ 取得したいメトリクスが増えたらinfraを増やせば良い ◦ 出⼒先が増えたらSinkを増やせば良い • IndexedDBに永続化†することによりハイドレーションができる ◦
リロード等をしたとしてもデータが残っているのでチャートに レンダリングができる†† ◦ 過去データのダンプ機能を提供できる †: 永続化といっても未来永劫残すわけではなく、⼀定期間に限定 ††: getAll + sliceすると⻑期保存時にエラいことになるので降順カーソルで maxSamples 件だけ辿る © Timeleap Inc. 13
Tips⾊々 • CPU PressureのPressureObserverはsampleIntervalごとに コンストラクタで渡したcallback経由でpressure stateを渡す ◦ callbackとcollectorは不必要なレンダリングを防ぐ⽬的で分離 ▪ callbackは値を
(Reactなのでrefに) stashしておくだけ ▪ collectorはそのrefをgetしてくる 👉 PressureObserverのsampleIntervalと、collectorに対する Schedulerのtrigger intervalは噛み合っている必要がある © Timeleap Inc. 14
Tips⾊々 • IndexedDBはオリジン単位でTab間共有がされる ◦ 共有端末でのオペレーションが前提とされているとコンタミする ◦ IndexedDBのキーにセッションIDを含めるようにし、 それと共にオペレーションをすることでコンタミを防ぐ† †: と書いてて気付いたが、セッションIDよりユーザーIDのほうが良いのでは?
(セッションが変わってしまうと過去ぶんがダンプできなくなってしまう) © Timeleap Inc. 15
まとめ • ブラウザのAPIは充実していて案外サクッと作れる ◦ メモリ周りだけが決定版にはなっていない印象 • とはいえ素朴に作ると結構問題があった ◦ 雑にやると計測のたびにReactがレンダリングされて死ぬ ◦
WebRTCのgetStats()は油断するとハングする ▪ ハングするとモニタリング全体を巻き込んで⽌まる • IndexedDBがとにかく便利 ◦ 共⽤されうる端末の時には注意が必要 © Timeleap Inc. 16
破に向けて • 現状すべてのメトリクス機構がローカルで完結している • メトリクスはリモートに送出して中央管理したい† ◦ 承前: Sinkを実装すれば良い ◦ あるいはIndexedDBのScheduled
Exporterを作れば良い • どちらかというとメトリクスを受けて保管する側に課題がある ◦ Monitoring SaaSに素朴に突っ込むと⾼いし…… ◦ Prometheus的概念を⾃前で運⽤するのは…… †† ◦ DWHに⼊れるという選択も無いわけではない • 破でお会いしましょう †: 利⽤規約等のレベルでの解決‧同意が為されているという前提 ††: 嫌いではないが…… © Timeleap Inc. 17
© Timeleap inc. All Rights Reserved.