精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

汽車之家頁面性能監控建設實踐

移動開發 移動應用
通過頁面性能監控和評判體系建設,我們既有原始頁面性能數據,又有聚合統計值,還有最終評分。通過評分、統計和原始數據,打通了發現、定位和分析性能問題的鏈路。研發同學可以通過評分直觀判斷應用性能優劣是否需要優化?

一、前言

關注用戶體驗,提高頁面性能,是每位前端研發同學的日常工作之一。提高頁面性能對業務的幫助,雖不易衡量,但肯定是利遠大于弊。如何衡量頁面性能優劣?如何幫助研發同學快速定位到頁面性能瓶頸點?一直是前端的重點工作之一。本文分享汽車之家在頁面性能監控建設方面的部分工作,主要包含三方面:

技術選型

  • 該選擇哪些頁面性能監控技術方案?
  • 在盡可能不影響頁面性能的前提下,既能客觀、全面衡量頁面性能,又能幫助研發同學快速定位性能瓶頸點,該采集哪些指標?
  • SPA 應用非首頁性能該如何評估?
  • 在盡可能不影響頁面性能和保證采集數據精準性的前提下,盡量多地采集和上報數據,如何選擇合適的指標采集時機和上報方式?

整體架構設計

整合選中技術方案,構建體系化性能監控架構,提供性能監控和性能分析工具鏈,支持產研同學在 DevOps 各階段中發現和定位頁面性能問題。

建立評判體系

有數據,我們才能度量;有評分,技術才好改進。

利用采集到的眾多指標,根據應用特性,按各性能指標的重要程度,設置不同的基線和權重,以加權平均的方式,求得應用得分。通過分數,直觀告訴研發同學應用頁面快或慢?應用性能高或低?是否需要改進?

應用得分只能反映單個應用的性能情況,主要服務于產研同學。一家公司有多個部門,每個部門有多個團隊,一個團隊有多個應用,我們需要公司、部門和團隊層級的性能得分,才能讓各級領導直觀了解其負責隊伍的頁面性能,也方便上級領導判斷下級各隊伍之間的性能高低,所以我們根據應用 PV 數和應用級別,仍以加權平均算法,獲得團隊、部門和公司性能得分。

二、技術選型

根據監控頁面性能時的運行環境,我們將技術方案分為兩種:合成監控(Synthetic Monitoring,SYN)和真實用戶監控(Real User Monitoring,RUM)。

合成監控 (以下簡稱 SYN)

指在通過仿真環境運行頁面,評估頁面性能。早期代表工具有我們熟知的 YSlow 和 PageSpeed。隨著技術進步,當前三個最成熟的 SYN 工具為:Lighthouse、WebPageTest 和 SiteSpeed。Lighthouse 雖然僅支持 Chrome 瀏覽器、實施成本較高,但是有谷歌支持、易擴展、指標豐富、有評分諸多優勢,已逐步代替 WebPageTest,成為 SYN 首選工具。 如下以 Lighthouse 為例介紹 SYN 的運行過程、優缺點。

運行過程

從運行結果頁面來看,Lighthouse 除了輸出關鍵性能指標值和評分外,還向我們提供優化建議和診斷結果。10.1.0 版 Lighthouse 分別內置 94、16 條性能和最佳實踐方面的規范或建議,其中不乏日常研發比少留意且較有意義的規范,如:最大限度地減少主線程工作(mainthread-work-breakdown)、網頁已阻止恢復往返緩存(bf-cache)、減少 js 文件中未使用的 JavaScript (unused-javascript)等。

推薦使用 Node Cli 或 Node Module 方式運行 Lighthouse,同時輸出 html 和 json 格式的結果。json 中數據更全面,包含如:最大內容渲染時間元素(largest-contentful-paint-element)、應避免出現長時間運行的主線程任務(long-tasks)等明細信息。

優缺點

根據我們實踐,總結 Lighthouse 有如下優缺點:

改進

針對上述不足和產品需求,我們做了一些改進:

n 為解決 默認無基準環境,相同頁面在不同用戶端運行,因運行環 境和硬件資源不同,導致結果不同 的問題,我們做了兩方面的改進:

首先,提供 SYN 基準運行環境。利用 Lighthouse Node Module 自研 Web 版 SYN 服務并部署在容器中。通過在 Node 服務端添加隊列策略,保證單容器任意時間只允許運行一個 SYN 任務,且每個容器的硬件資源( 4 核 + 4G )和網速配置( M 端應用統一使用 10M 網速 )都一樣,從而保證運行結果和最終得分是相對公平和可靠的。

其次,支持以計劃任務,間隔 6、12 或 24 小時 的方式運行 SYN 任務。 統計多次運行結果指標的 AVG、TP 值,排除少數異常運行的結果偏差。

  • 針對  運行慢,占用資源多  的問題。我們認為相同頁面,如果沒有改版,沒必要過于頻繁的持續測試,建議 PV 量大或重要頁面添加計劃任務 12 小時及以上時間間隔運行一次,這樣既能客觀反映頁面性能情況,也能節省資源。
  • 將 SYN 集成到 CI 流水線中,將 SYN 作為上線前頁面性能測試或競品對比的實施工具。

適用場景

  • 將 SYN 作為頁面性能測試工具,集成到前端監控后臺應用、QA 套件 和 CI 中。建議研發同學交付頁面前,通過 SYN 評估頁面性能并根據優化建議和診斷結果,改進頁面質量缺陷,提高交付質量。
  • 利用 SYN 做競品對比。
  • 將 SYN 作為分析 RUM 捕獲到慢頁面的首選工具,結合 Chrome DevTools , 從實踐來看可以定位到多數問題。

使用方法

總結

SYN 實施成本低,便于統一標準,相比 RUM,受運行時環境的影響更小,結果更具有可比性和可復現性,是性能監控的重要一環。基于 Lighthouse,借助 K8S 等容器編排技術,快速搭建提供基準環境的 SYN Web 服務是建設頁面性能監控體系的第一階段。該階段以提供評估頁面性能、分析慢頁面等關鍵功能為主。雖然 Lighthouse 還存在 僅支持谷歌瀏覽器,代表性不足,也不能真實反映真實用戶端的性能情況 這兩個問題,但瑕不掩瑜,可以作為 SYN 的首選方案。同時,這兩個問題我們將通過添加另外一種技術方案:真實用戶監控(RUM)來解決。

真實用戶監控 ( 簡稱 RUM)

顧名思義,指監控運行在真實用戶終端(瀏覽器),采集用戶運行頁面時候真實的性能指標。業內技術方案主要分為兩種:

依托 W3C 組織且各瀏覽器廠商廣泛支持技術方案:PerformanceTiming 和 PerformanceNavigationTiming。偏向從瀏覽器處理過程角度去衡量頁面運行時各節點、各階段的耗時。

各廠根據實際需求自研技術方案。谷歌 web-vitals 是其中最優秀的代表,它從用戶體驗角度,用更通俗易懂的指標展現頁面性能。

除上述兩種常見技術方案外,少數商業前端監控服務廠商,除了支持 W3C 和 web-vitals 外,還提供少數自定義性能指標,如:阿里 ARMS 中的 FMP 、字節 WebPro 里的 SPA_LOAD 。SPA_LOAD 用于評估 SPA 非首頁的頁面性能,有較大創新性,后面還會提及。

技術選型

技術選型主要解決兩個問題:1)W3C 的 PerformanceTiming 和 PerformanceNavigationTiming 兩規范,應該以哪個為主?2)W3C Timing 規范 和 web-vitals 應該如何協作?

W3C 的 PerformanceTiming 和 PerformanceNavigationTiming 兩規范,應該以哪個為主?

PerformanceTiming:已被最新 W3C 標準廢棄,不過當前主流瀏覽器仍支持,舊瀏覽器支持好,兼容度高。


PerformanceNavigationTiming:最新標準隨 Navigation Timing Level 2 于 2019 年推出,Navigation Timing Level 2 目的是代替涵蓋 PerformaceTiming 的 Navigation Timing Level 1。

變更點:

  • 整合 PerformanceTiming 和 PerformanceNavigation 功能。
  • 廢棄因各瀏覽器廠商實現不一,指導意義不足的 domLoading 節點。
  • 添加 ServiceWorker 相關節點。
  • 各屬性節點時間使用高精度、以 startTime 為起點的相對時間。

優點:

  • 使用高精度的相對時間,避免因用戶端系統時間更改而導致后續節點值不準。
  • 支持 ServiceWorker 相關統計。

缺點:

  • 瀏覽器兼容性不足。

結論:

從 Can I Use 統計兩者兼容度僅差 2.67%,但是從我們實際用戶分布來看,使用 PerformanceNavigationTiming,用戶兼容度下降 12%,難以接受。所以我們以 PerformanceNavigationTiming 為主,如瀏覽器不支持,則使用 PerformanceTiming。兩者數據格式差異不大,忽略 PerformanceTiming 中 domLoading 節點,使用 PerformanceTiming 時認為瀏覽器不兼容 workStart 節點即可。

W3C Timing 規范 和 web-vitals 應該如何協作?

PerformanceNavigationTiming ( 以下簡稱 Timing ): 基于 W3C 規范,著重從瀏覽器處理過程角度衡量頁面性能,以下簡稱 Timing。

優點:

  • 瀏覽器兼容性好瀏覽器兼容性好。
  • 數據豐富,指標全面。即包含各階段耗時,如:Unload、Redirect、DNS、TCP、SSL、Response、DomContentLoadedEvent 和 LoadEvent;還支持顯示頁面運行到各節點時的耗時,如:workStart、fetchStart、requestStart、domInteractive 和 domComplate;也可以根據所給節點值,計算 DCL ( DomContentLoaded ) 、window.load 事件或者 PageLoad(頁面加載)的耗時。

缺點:

  • 缺乏關鍵指標。雖然指標多、全,但是不夠直觀,很難表達用戶體驗效果。

web-vitals: 目前含 6 個指標:TTFB、FCP、LCP、FID、INP 和 CLS,其中 FID 將被 INP 代替。TTFB、FCP 和 LCP 反映頁面加載性能,FID 與 INP 代表頁面交互體驗,CLS 表示頁面視覺穩定性。僅 6 個指標,就能支持對頁面加載、交互和視覺穩定方面的評估。不過 web-vitals 部分指標源頭還是來自于 W3C 制定的 LargestContentfulPaint、LayoutShift、PerformanceEventTiming 和 PerformancePaintTiming 等規范,不過兼容性更好、整體性更強。

優點:

  • 指標簡明、精練、易懂。
  • 自帶基線,能根據指標,判斷頁面性能優劣。

缺點:

  • 瀏覽器兼容不足,尤其在 IOS 端。
  • LCP 可以偽造。做法:給頁面添加大尺寸白底圖,該圖加載時間大概率就是 LCP 值,但是該 LCP 值并沒有任何業務意義
  • 受限于 LCP、CLS 原理,對采集指標時機有一定要求,后面會詳細介紹。

述求

真實、客觀、全面衡量頁面性能。

結論

同時采集 Timing 和 web-vitals 數據,帶來好處有:

  • 指標豐富、數據全面,既能利用 Timing 站在瀏覽器角度反映各節點、各階段處理耗時,也能通過 web-vitals 直觀表達用戶視覺體驗。建議先通過 web-vitals 直觀判斷頁面性能,再通過 Timing 再進一步分析,達到綜合考慮、全面分析,減少因瀏覽器兼容不足、LCP 造假等情況下,誤判頁面性能。
  • 結合 Timing 和 web-vitals 數據,更容易定位問題。如:web-vitals 采集到的 TTFB 慢,可以通過 Timing 定位到具體慢在 Unload、Redirect、DNS、TCP、SSL 哪個階段。
  • 解決 web-vitals 老瀏覽器兼容不足的問題。如果瀏覽器不支持 web-vitals, 可以通過 DCL、window.load 事件或者 PageLoad(頁面加載)的耗時來判斷頁面性能。

小節:RUM 技術選型,同時采集 PerformanceNavigationTiming 和 web- vitals。如果瀏覽器不兼容 PerformanceNavigationTiming,則以 PerformanceTiming 代替。

采集哪些指標

我們的需求是:在盡可能不影響頁面性能,既能客觀、全面衡量頁面性能,又能幫助研發同學快速定位性能瓶頸點。具體包含三方面需求:1) 指標要全面客觀;2) 能發現慢頁面的瓶頸點;3) 滿足前面兩需求前提下,盡可能不影響頁面性能。

指標要全面客觀

首先,我們采集了 web- vitals 六個指標,效果如下:

谷歌計劃于 2024 年用 INP 替換 FID,FID 體現第一次交互的延遲時間,INP 表示所有交互中最長的延遲時間。我們認為 FID 和 INP 都有各自使用場景,同時保留并不矛盾。

其次,我們對 PerformanceNavigationTiming 做了加工處理,效果如下:

與下面的 W3C 示例圖不同:

原因在于:

  • 實際頁面運行過程中,各階段并不一定如上圖那樣串行運行。存在 responseEnd 耗時大于 domLoading 的情況。
  • HTTP Cache 階段并無起止時間節點,只能表明發生在 fetchStart 和 domainLookUpStart 節點之間。
  • ServiceWorkerInit、ServiceWorkerFetchEvent 和 Request 階段只有起始節點,沒有終止節點,無法統計階段耗時。對于 Request 階段不能以 responseStart 作為終止節點,因為內容在網絡中是分幀傳送的,不一定可以一次傳輸整個頁面內容。
  • Processing 階段以 domInteractive 為起點,不符合客觀規律,頁面執行到 domInteractive 時候 DOM is ready,所以 Processing 階段無法代表頁面處理過程。

所以我們結合 W3C 示例圖,以點、段和線的方式,展示真實的頁面運行過程:

  • 點:指不存在終止節點的節點,含:workStart、fetchStart、requestStart、domInteractive 和 domComplete,用白色圓點表示。
  • 段:指真實存在起始和終止節點的處理階段,如 unload 階段值為:unloadEnd - unloadStart。同理于 redirect、DNS、TCP、SSL、Response、domContentLoadedEvent 和 loadEvent,用藍色柱狀圖表示。
  • 線:含頁面加載過程中觸發的事件,如 DCL ( DomContentLoaded ) 、window.load。另外我們自定義 PageLoad 事件,表示整個頁面加載耗時,值為:loadEventEnd-loadEventStart。用黃色柱狀圖表示。

段和線具體算法:

  • UnloadEvent = unloadEventEnd - unloadEventStart
  • Redirect = redirectEnd - redirectStart
  • DNS = domainLookupEnd - domainLookupStart
  • TCP = connectEnd - connectStart
  • SSL = connectEnd - secureConnectionStart
  • Response = responseEnd - responseStart
  • loadEvent = loadEventEnd - loadEventStart
  • DCL = domContentLoadedEventStart - startTime
  • WindowLoad = loadEventStart - startTime
  • PageLoad = loadEventEnd - startTime

此外,為了更全面體現頁面性能,還采集和統計了如下輸入:

  • 小概率 (1%) 的采集完整 PerformanceEntry 數據。PerformanceEntry 包含 LargestContentfulPaint、LayoutShift、PerformanceEventTiming、PerformanceLongTaskTiming、PerformanceNavigationTiming、PerformancePaintTiming、PerformanceResourceTiming、PerformanceServerTiming 等方面數據,既包含頁面本身性能指標,還涵蓋資源、網絡、緩存、JS 長阻塞任務、慢執行事件等多方面信息,對評估頁面性能,判斷慢頁面瓶頸點很有幫助。考慮到大部分頁面內容較多,導致 PerformanceEntry 集合條數太大,要是 100%采集上報,對帶寬、存儲、查詢性能都有較大影響,所以只能小概率采集。
  • 頁面導航類型,取值于 PerformanceNavigationTiming.type,判斷頁面是首次加載還是刷新重載等。
  • 按資源類型,統計各類資源個數、總傳輸體積和總耗時。
  • 按域名,統計各域名資源個數、總傳輸體積和總耗時。

能發現慢頁面瓶頸點

我們參考Lighthouse 50 分線 和 HTTP Archive 站點統計數據,根據應用類型是 PC 或 M 來制定慢頁面標準,具體閾值如下:

針對慢頁面,我們除了采集上節提到的 PerformanceNavigationTiming、web- vitals、小概率的完整 PerformanceEntry 數據和統計數據外,我們還會采集:

  • TOP N 慢資源,做法:取 duration 值最大的 N 個 PerformanceResourceTiming 類型的 PerformanceEntry。
  • 長任務,指占用 UI 線程大于 50 毫秒的任務。做法:采集所有 PerformanceLongTaskTiming 類型的 PerformanceEntry。不過當前大部分瀏覽器無法提供長任務所在的腳本地址( containerSrc )和方法名稱( containerName ),采集這部分數據,只能判斷長任務是否發生?發生的次數。PerformanceLongTaskTiming 內容如下:

  • 慢事件,指處理時間超過 104ms 的交互事件,做法:采集所有 PerformanceEventTiming 類型的 PerformanceEntry。
  • 頁面跳轉次數,值為:PerformanceNavigationTiming.redirectCount,可以輔助分析 Redirect 階段耗時多的原因。
  • CLS 和 LCP 值大于慢頁面閾值時,記錄其關聯的元素。

不影響頁面性能

RUM 必須通過入侵頁面,在頁面引入 JS SDK 來實現,不可避免地影響頁面性能。作為一個發現和分析頁面性能的工具,不應該加重頁面性能問題。為了將性能影響降到最低,我們做了兩方面工作:

異步加載 JS SDK:頁面只引入功能單一、體積小的 JS 頭文件,待頁面到達 DomContentLoaded 事件后,以動態 script 方式異步加載功能完整的 JS 主文件。

減少帶寬占用:

  • 抽樣上報:慢頁面必須上報,非慢頁面抽樣上報,默認抽煙比例為 30%,減少上報次數。
  • 減少上報數據體積:全量的 PerformanceEntry 數據可以完整體現頁面性能,不少頁面動輒超過白條 PerformanceEntry 數據,體積過大,所以只能小概率采集全量 PerformanceEntry 數據,計算和采集 PerformanceEntry 的統計數據。

綜上所述我們采集指標主要兩大類:PerformanceEntry 和 web-vitals。

SPA 應用非首頁性能該如何評估?

采集上述指標,已經可以較為客觀全面評估常規頁面和 SPA 應用首頁的頁面性能。但是 SPA 應用非首頁不是瀏覽器標準,在 SPA 路由切換過程中:

  • 瀏覽器僅會執行 History.replaceState()方法,不會也不該重新生成 PerformanceNavigationTiming 數據。
  • 多數 PerformanceEntry 數據包含 SPA 首頁以來所有路由切換頁面的性能指標。以 PerformanceResourceTiming 為例,無法通過 History.replaceState()方法拿到真實路由切換的時機,排除 PerformanceResourceTiming 集合中的歷史數據,從而獲取當前路由的 PerformanceResourceTiming 數據。因為各前端框架在 SPA 路由切換過程中,大多數會先執行其框架內部邏輯,而后再觸發 History.replaceState()方法,所以 History.replaceState()方法觸發時間晚于路由切換的執行時間。
  • web-vitals 暫時也不支持采集 SPA 非首頁路由切換后的性能指標。

所以,對于上述指標 SPA 非首頁無法或無法準確拿到,所以我們暫不評估 SPA 非首頁性能。

針對業內 SPA 非首頁性能難評估的情況,字節 WebPro 創造性地推出 SPA_LOAD 的概念,基本邏輯為:以觸發 history.replaceState() 方法為起點,通過 MutationObserver 監聽 dom 變更、資源加載、請求發送等變更事件來尋找一個頁面達到穩定態的時間為終點,通過計算起終點之間的耗時,來衡量 SPA 非首頁的頁面性能。SPA_LOAD 類似于常規頁面 onload 事件,但是起始時間比真實路由切換時間晚,到終止時間時頁面可能已經加載完畢,略有不足,不過已是當前最佳的方案,后面我們可能引入。

采集指標時機

只有采集真實、準確的指標值,才能真實反映頁面性能,反之,可能誤導產研同學,錯誤評估真實的頁面性能。所以選擇采集指標時機有幾大原則:

  • 指標準,最關鍵是要保證指標是準的,不準不如不采。
  • 樣本多,上報可靠,部分指標,如 CLS、INP、PerformanceEventTiming 等,越晚采集值越準,但是越晚采集,留給上報的時間越少,數據上報失敗的概率越大,為了盡量多采集數據樣本,我們不能等到頁面關閉時再采集指標、提交上報。
  • 公平,部分指標,如 CLS、INP、LCP 等,隨著頁面打開時間邊長,值可能也跟著變大。對于這類指標,我們只能保證數據”樣本多“的前提下,選擇一個相對合理、對“所有項目”都公平的采集時機。
  • 一次上報,web-vitals 中部分指標如:LCP、CLS、INP,每次變更都會觸發其回調函數,谷歌官方建議每次指標值變更都采集上報。這種處理邏輯,指標值是更準,但是占用太多前端的連接、帶寬和 CPU 資源,也嚴重加大后端接收程序的處理難度,不是各合理均衡的選擇。所以我們要找到一個合適的采集時機,一次采集并上報所有的性能指標。

那么如何確定采集時機?我們得先分析 PerformanceEntry 和 web-vitals 兩類指標數據得準確生成時間:

對于 PerformanceEntry 數據,onload 事件觸發時,頁面已接近加載完畢,PerformanceEntry 中影響首屏加載的絕大部分指標數據已經生成。未生成的數據對評估頁面性能影響不大,如:PerformanceNavigationTiming 中的 loadEventEnd 指標值。所以我們認為 onload 事件觸發件時,可以采集 PerformanceEntry 指標。

 web-vitals 中各指標生成原理不一,onload 事件觸發時:

  • TTFB、FCP 指標已生成且不會變,可以采集。
  • LCP 對應的最大元素大概率已加載完畢,所以我們認為這時候 LCP 值大概率是準的,可以采集。
  • CLS 值無法確定是否準確,其計算邏輯為:頁面打開后每 5s 作為一個 session 窗口,累加該窗口內產生的偏移值即是 CLS 值,如果下一個 session 窗口的 CLS 值大于上一個 session 窗口,則替換。所以對于 CLS 指標來說,打開頁面 5S 后、最好 5S 或其整數倍時采集,比較合適,對”所有項目“也比較公平。
  • FID、INP 也無法確定是否準確,它們依賴用戶交互操作后才生成,交互操作含:點擊、輸入、拖放、觸摸等事件。FID 是第一次交互的延遲時間,INP 取多次交互操作中延遲時間最大的值。這兩指標都依賴于用戶操作,INP 可能會隨著用戶操作次數變多而值變大,所以任何時間都沒法保證準確拿到這兩指標值。

基于上述考慮,我們認為至少要滿足:觸發 onload 事件或打開頁面 5s 之一條件時,才能保證 PerformanceEntry 或部分 web-vitals 指標值準確,采集才有意義。在追求”樣本多“的原則下,結合 RUM SDK 是 onload 事件后異步加載的實際情況,我們針對頁面是否被正常關閉前提下,總共設置了三種采集時機,其特點如下:

為了避免采集指標影響頁面性能,我們異步加載 RUM JS SDK,web-vitals 中各指標默認僅支持異步回調,異步加載再異步回調,導致采集時機時仍可能無法拿到各指標值,所以我們對 web-vitals 源碼做了改造,支持同步獲取各指標值。

上報方式

采集到指標后,需要選擇恰當上報方式,將指標可靠的發送到后端。上報方式包含兩個部分:上報機制和上報時機。

選擇合適的上報機制,首先,要滿足功能需求,瀏覽器兼容度高,對數據大小最好沒限制;其次,能感知上報請求異常,便于上報重試,進而提高上報可靠性;最后,客戶端支持設置超時時間,避免長時間占用忘了連接,加大后端服務壓力。常見上報機制有四種,分別是:Image、XMLHttpRequest、sendBeacon、Fetch API。其特點如下:


Image

XMLHttpRequest

sendBeacon

Fetch

基本原理

創建一個 1 像素、隱藏的 img DOM,將上報地址和上報內容包含在 img 的 src 中。上報成功則返回 200 狀態碼

利用瀏覽器內置對象 XMLHttpRequest 上報數據

使用專門設計用于發送分析數據的 navigator.sendBeacon()方法,以異步發送 HTTP POST 請求的方式將分析數據提交到后端

fetch 是一個現代的、基于 Promise 的用于發送 HTTP 請求的 API

瀏覽器兼容性

中,不支持 IE

中偏低,不支持 IE

數據大小限制

小于 8K

各瀏覽器大小限制不一,且受制于 CDN、后端代理和 web 服務器,默認值常為 8K。8K 指用 URI 編碼后的長度

用 POST 請求,無限制

有,部分瀏覽器小于 64K

用 POST 請求,無限制

感知上報異常

部分支持。

請求返回狀態碼為 404 或 204 時會觸發 img onerror 事件。狀態碼大于等于 400,不會觸發 onerror 事件,如 400、500、502 和 504 等。

支持

不支持。

sendBeacon()返回值,只能表示瀏覽器是否發出請求

支持

可設置超時

不可以,依賴服務端的設置

可以

不可以

可以

優點

使用簡單、兼容度高

功能強大,靈活易擴展

無大小限制,兼容度高

使用簡單,可靠性高

頁面關閉時,仍可發送

相比于 XMLHttpRequest,使用更簡介、功能更強大

缺點

數據大小有限制,難感知上報異常

代碼編寫略復雜

跨域處理要留意

無法感知上報異常,函數返回值 true、false 只能代表是否發送成功

同 XMLHttpRequest

瀏覽器兼容度最低

適用場景

上報數據小,可靠性要求不高

功能需求多

建議以 POST 方式用 text/plain 或 application/x-www-form-urlencoded 格式上報,CORS 預驗證

需要在頁面關閉時,上報數據

同 XMLHttpRequest,更適用于瀏覽器分布較新的終端

上述結論:依賴于 chrome114

相比于 Fetch,XMLHttpRequest 功能幾乎一致,兼容性更高;與 Image 對比,XMLHttpRequest 具有兼容度高、數據大小沒限制、能感知異常和可設置超時時間等優勢;XMLHttpRequest 是頁面正常(未關閉)情況下,發送指標數據的首選上報機制。至于 sendBeacon,雖然存在諸多不足,但是頁面關閉時仍可以上報數據,成功率還較高,適合作為在頁面關閉時,發送尚未發送的指標數據的上報機制。

既然選擇了 sendBeacon 作為頁面關閉時發送指標數據的上報機制,那該如何判斷頁面被關閉?傳統方案是監聽 unload 或 beforeunload 事件,該方案存在兩個不足:

  • 不能滿足功能需求。手機端用戶離開頁面時,更習慣將瀏覽器隱藏,而不是關閉瀏覽器。隱藏頁面時,不會觸發 unload 和 beforeunload 事件。
  • 性能有損耗。部分瀏覽器,監聽到 unload 或 beforeunload 事件后,無法使用 bfcache,導致頁面性能降低。

更合適、更現代的方案是監聽 pagehide 或 visibilitychange===hiden 事件,該方案除了避免傳統方案存在的兩不足,兼容度也會更高。對于 SPA 項目我們不采集非首頁性能指標,觸發History.replaceState()方法也算離開頁面。

綜上所述,整體上報機制為:1)頁面正常(未關閉),到采集時機時,SDK 采集性能指標數據,使用 XMLHttpRequest 機制上報;2)通過監聽 pagehide 或 visibilitychange===hiden 事件,當頁面被關閉時,如果滿足任一采集時機條件,則立即采集指標,使用 sendBeacon 機制上報。

整體方案

綜上所述,我們整理 RUM 實施大綱如下:

實際編碼過程中,具體處理流程如下:

優缺點

在實施過程中,我們總結 RUM 優缺點如下:

RUM 架構設計復雜,實施成本較高,由于是技術剛需,只能投入資源,努力做好。

針對 無診斷結果和優化建議 的缺點,可以結合 SYN,取長補短,利用 SYN 診斷慢頁面性能瓶頸點分布。

對于 無評分,沒法判斷頁面性能優劣 的問題,我們分三步走:首先,制定慢頁面標準,判斷單次頁面是否快慢,標準值前文已有描述;其次,統計該頁面各重要指標的 AVG、TP50、TP90、TP99 值,全面評估頁面所有請求的性能分布;最后,我們會對頁面所在的應用進行評分,直接告訴研發同學,該應用性能優劣,應用評分具體做法,會在下面《建立評分體系》章節細講。

三、整體架構設計

前文深入分析了 SYN 和 RUM 各自特點、使用方法及優缺點等,我們發現 SYN 和 RUM 各有所長、無法替代,最好同時引用 SYN 和 RUM,構建體系化性能監控架構,提供性能監控和性能分析工具鏈,支持產研同學在 devpos 各階段中發現和定位頁面性能問題。

在編碼、構建和測試階段,研發同學可以利用 SYN 來做頁面性能測試,判斷頁面性能是否達標?如果頁面性能有問題,再利用 SYN 診斷性能問題,獲得優化建議。此舉解決前端頁面長期以來,前端頁面做性能測試難、交付頁面質量無標準等痛點。應用部署后,再利用 RUM 采集真實用戶頁面性能,評估真實頁面性能,如果還存在慢頁面,仍可以使用 SYN 定位慢頁面性能瓶頸點,并利用診斷結果和優化建議,提高優化效率。除此之外,SYN 還可以用來做競品對比,達到知己知彼、快競爭對手一步的目的。

有了 SYN 和 RUM,我們可以構建在線持續優化慢頁面的閉環,如上圖。RUM 負責采集真實用戶產生的慢頁面,經后臺存儲、聚合,自動將 TOPN 的慢頁面創建 SYN JOB,待 JOB 運行完畢,將診斷結果和優化建議以告警防止通知研發同學,研發同學利用 SYN 優化建議,再利用 devtools、webpack 等工具,改進頁面,交付高質量頁面,降低慢頁面的頻次。如此循環迭代,持續優化應用頁面性能,最終應用能達到極致性能。

三、建立評判體系

引入 SYN,自研 RUM SDK,采集到眾多 SYN 和 RUM 指標數據后,我們將著手建立評判體系,評估各應用、團隊、部門,乃至整個公司的性能情況,輸出少數幾個關鍵指標和評分,直觀告訴各層級、各角色員工其所在組織及同級組織的頁面性能情況,通過得分和同級對比,評判是否要優化頁面性能?

建立評判體系時我們秉持著:既要突出重點、關鍵指標,同時還能全面、綜合、客觀真實地反映頁面性能 的原則。所以我們將評判體系分為兩大塊,其一,展示最關鍵的性能指標。其二,輸出各指標、應用、團隊、部門及公司層級的性能評分和層級。

展示最關鍵的性能指標

我們從 web-vitals 和 performanceNavigationTiming 中各選一個最能代表頁面性能的指標,分別為:DCL 和 LCP。LCP 兼容度不高且可能被偽造,DCL 既能代替 LCP 部分反映首屏性能且兼容度高、難以偽造,和 LCP 相輔相成,最能體現頁面性能。

TP90 代表 90%用戶的體驗下限,與 AVG、TP50、TP75 比,覆蓋和統計更廣的用戶,還能屏蔽頁面在手機端特殊網絡環境下,產生的少數臟數據,更具有代表性。

輸出各級評分

應用性能評分

為了全面、綜合和客觀的評估應用頁面性能。我們將選擇各維度具有代表性指標,參考 HTTP Archive 給予的業內指標分布,根據應用特性,如應用類型( PC 或 M 端 )、終端用戶( C 端用戶、B 端客戶和內部員工),設立不同的評分基線,算出各指標得分。再根據各指標重要程度設置權重,通過加權平均算法,求得應用性能評分。流程如下:

獲取應用性能分過程中涉及幾個重要流程:1) 指標篩選及權重設置;2) 選擇評分算法;3) 確立指標基線;4) 使用加權平均算法計算應用性能分。下面逐一介紹。

指標篩選及權重設立

此過程中,我主要考慮兩點:

全面綜合考慮。頁面性能涵蓋多方面,傳統上只用首字節、白屏、首屏時間等少數指標來衡量,較為片面,不夠客觀。我們認為評判頁面性能應該涵蓋各維度指標,如:頁面加載、交互體驗和視覺體驗。此外我們還引入慢 API 比例的概念,API 請求比例指頁面打開后 API 耗時超過 3s 的請求比例,慢 API,即可能影響首屏加載耗時,也會影響交互過程中的用戶體驗。為了讓研發同學關注慢頁面、將在線 SYN 作為日常開發性能評估工具,我們將 SYN 評分也作為權重指標,后臺系統每天會統計訪問次數 TOP10 的慢頁面并自動創建 SYN 定時任務,待任務執行、分析完畢后,將優化建議和診斷結果通知研發同學。SYN 評分項,包含性能分和最佳實踐分,兩者都是百分制。

突出重點。提高重要指標的權重比。如:加載指標用于衡量頁面能不能用,最為關鍵,所以賦予權重占比最大。LCP 是最重要的加載指標,權重占比也相應提高。由于 LCP 本身不一定完全合理且可能被偽造,所以評判頁面加載性能時,還引入 DCL、FCP、TTFB、WindwLoad 和 PageLoad 等加載指標。該做法,優點:指標多,維度廣、角度大、更全面和更客觀準確;缺點:增加評判系統復雜度和難度。

基于上述兩點考慮,我們指標篩選結果和權重占比設置,如下圖:

各指標以其 TP90 統計值,參與評分運算。

選擇評分算法

評分算法主要參考 Lighthouse 評分曲線模型,基本原理是:設置兩個控制點,通常是 TP50 和 TP90,即得 50 或 90 分時的指標值點,然后根據這兩個控制點,生成對數正態曲線,通過該曲線可以獲得任一指標值對應的得分。下圖是 M 端 LCP 的評分曲線:

m 表示中位數,圖中 m 值為 4000ms,表示當 LCP 值為 4000ms 時,得 50 分;同理 p10 為 2520ms,LCP 值為 2529ms 時,得 90 分。設置 m 和 p10 后,會生成右邊的評分曲線模型,根據該模型可以獲得 LCP 值從 0 到正無窮時的得分。

確立指標基線

確立指標基線是為了給評分算法提供兩個控制點,即 m 和 p10 的值。確立方法有三種:

  • 直接借用 Lighthouse 配置。以 Lighthouse 對應指標的 50 分和 90 分閾值為 m 和 p10 控制點值,如 web-vitals 中各指標。
  • 參考 HTTP Archive 統計數據,以統計數據中的 p10、p75 值為 m 和 p10 控制點值。如 performanceNavigationTiming 各指標。
  • 自建基線。少數指標基線無法從上述兩種方法確立,只能自建基線。具體做法:以當前后臺系統拿到的數據為樣本,以樣本的 tp75 和 tp95 值為 m 和 p10 控制點值。適用于慢 api 比例指標。

確立基線過程中,應考慮應用價值和研發要求的不同,根據應用特性,有針對性的設置。首先,PC 端和 M 端類型的應用,要設置不同的指標基線,所幸 Lighthouse 和 HTTP Archive 都提供 PC 端和 M 端的配置參考;其次,根據應用實際終端用戶類型,有針對性的調整閾值。C 端和 B 端應用,直接產生業務價值,性能要求要比內部應用高,兩控制點值應該更低。

使用加權平均算法計算應用性能分

根據指標 tp90 值、指標基線和評分算法,求得該指標的百分制得分。

使用加權平均算法求應用性能分,結果 = (Σ (指標tp90值 × 指標權重)) / (Σ 權重)  ,其中:Σ 表示求和。

各級組織評分

至于求各級組織,含團隊、部門及公司的性能分,則根據其管轄的應用個數、應用性能分及應用權重,仍使用加權平均算法獲取組織分。流程如下:

求組織性能分的難點是:如何設置應用權重?我們主要參考應用的 PV 區間和應用級別。PV 層級越大、應用級別越高,權重越大。具體配置參考如下:

PV區間中的PV 值指采用 PV,而非真實 PV,采用 PV=采集到 RUM 數據量/抽樣比例。

經過上述步驟,我們能獲得應用性能分,以及各級組織的性能分,如團隊性能分、部門性能分及之家性能分,展示效果如下:

性能分參考lighthouse標準,50分以上算合格,90分以上才算優秀。

四、總結

通過頁面性能監控和評判體系建設,我們既有原始頁面性能數據,又有聚合統計值,還有最終評分。通過評分、統計和原始數據,打通了發現、定位和分析性能問題的鏈路。研發同學可以通過評分直觀判斷應用性能優劣是否需要優化?如果需要優化,再通過聚合統計數據,分析應用瓶頸點;定位具體瓶頸點時,可以查看明細數據,輔助分析產生瓶頸點的具體原因;改進后可以通過通過統計查看優化效果,最終反映到提高評分上。

受限于篇幅,本文僅能介紹頁面性能監控和評判體系建設相關的實踐。一個完整的頁面性能監控系統,還應該包含:監控、報警、優化、治理等模塊,不僅僅只是指標,能度量頁面性能,發現其中性能瓶頸點,幫助研發同學提升優化效率,還要治本,通過構建一系列前端工具鏈,改進交付過程,通過規范、工具和流程,從源頭上提高頁面交付質量,避免將問題帶到線上,先于用戶發現性能問題。

五、參考文獻

vitals-spa-faq

Web Vital Metrics for Single Page Applications

Beaconing In Practice

HTTP Archive

一個收集和分析網站性能數據的項目,旨在幫助 Web 開發者了解互聯網的技術趨勢以及性能優化的最佳實踐。

責任編輯:姜華 來源: 51CTO
相關推薦

2023-06-27 07:26:36

汽車之家敏感數據治理

2023-04-28 07:41:38

Unity前端架構

2023-02-01 18:08:55

應用數據庫TiDB

2022-08-11 16:47:32

Mach-OAPP

2022-08-26 20:00:00

系統架構

2022-08-25 22:24:19

架構電商系統

2019-12-05 16:17:59

云計算行業科技

2023-07-20 15:46:24

2021-06-11 14:01:51

數據倉庫湖倉一體 Flink

2022-12-29 08:56:30

監控服務平臺

2023-08-23 08:23:47

應用性能優化

2023-07-21 08:42:23

App汽車之家

2025-08-06 03:11:00

監控運營量化管理

2023-04-21 10:05:00

B端項目頁面

2021-11-26 13:43:01

服務器虛擬化數據中心

2024-02-01 17:48:35

智能模型

2018-09-03 09:22:25

監控服務器性能

2022-08-31 07:54:08

采集sdk埋點數據

2025-07-17 09:00:57

點贊
收藏

51CTO技術棧公眾號

欧美tickling挠脚心丨vk| 日韩av卡一卡二| 偷偷要91色婷婷| 美足av综合网| 精品久久久久久无码中文野结衣| 99久久婷婷国产综合精品电影| 黄色片一区二区| 亚洲av永久无码精品| 免费国产一区二区| 丝袜一区二区三区| 久久99久久99小草精品免视看| 欧美专区一区| 国产在线精品视频| 91精品国产91久久久久久吃药 | 亚洲综合在线网站| 美女免费久久| 国产成人综合在线| 欧美bbbbbbbbbbbb精品| 国产在线中文字幕| 毛片av一区二区三区| 美日韩在线视频| 免费无码一区二区三区| 日韩三级成人| 成人18精品视频| 国产欧美中文字幕| 在线精品免费视| 99久久久久| 日韩国产欧美精品在线| 国产一级片中文字幕| 成人性教育av免费网址| 国产精品色一区二区三区| 国产精品久久久久久久久久ktv | 日本人视频jizz页码69| 男人天堂视频在线观看| 亚洲桃色在线一区| 日本高清视频一区二区三区 | 成人国产精品一区二区免费麻豆 | 国产精品无码专区av免费播放| 激情综合网址| 久久久国产精品亚洲一区| 亚洲精品成人无码| 要久久爱电视剧全集完整观看| 日韩一级免费一区| 久久久九九九热| 秋霞国产精品| 色噜噜狠狠成人中文综合| 日本www在线播放| 日本精品600av| 亚洲精品写真福利| 中文字幕欧美日韩一区二区| 北岛玲日韩精品一区二区三区| 久久亚洲欧美国产精品乐播| 国产一级二级三级精品| 人妻丰满熟妇av无码区hd| 国产一二三精品| 成人午夜激情网| 亚洲熟妇无码久久精品| 免费视频一区二区三区在线观看| 午夜精品久久17c| 国产一级黄色av| 狠狠88综合久久久久综合网| 九九热精品视频在线播放| 手机看片国产日韩| 四虎成人av| 夜夜躁日日躁狠狠久久88av| av永久免费观看| 日韩欧美自拍| 久久综合久中文字幕青草| 国产免费久久久久| 国内自拍视频一区二区三区| 韩国日本不卡在线| 精品人妻无码一区二区性色| 99热免费精品在线观看| 91大神在线播放精品| 日韩伦理在线视频| 日韩电影在线一区二区三区| 国产人妖伪娘一区91| 一级黄色小视频| 国产精品456| 九九九九精品九九九九| 狠狠狠综合7777久夜色撩人| 国产精品国产馆在线真实露脸 | 国语精品中文字幕| 韩国三级av在线免费观看| 国产无遮挡一区二区三区毛片日本| 日本不卡一区二区三区视频| 精品美女在线观看视频在线观看| 亚洲激情自拍偷拍| 日韩激情免费视频| av在线精品| 亚洲电影免费观看高清| 亚洲精品中文字幕在线观看| 台湾成人av| av大大超碰在线| 欧美日韩国产专区| 日韩av黄色网址| 美女搞黄视频在线观看| 在线观看视频欧美| 久久久高清视频| 你懂的一区二区三区| 中文字幕av一区中文字幕天堂| 紧身裙女教师波多野结衣| 国产精品亚洲综合久久| 成人av在线天堂| 色哟哟在线观看| 亚洲精品成人a在线观看| 日韩视频免费播放| 国产福利亚洲| 日韩一区二区三区观看| 少妇无套高潮一二三区| 精品69视频一区二区三区Q| 国产精品老女人视频| 人妻精品一区一区三区蜜桃91| 国产91对白在线观看九色| 日韩欧美精品久久| 免费h在线看| 日韩欧美一区二区不卡| 国产吞精囗交久久久| 国模吧视频一区| 成人性生交大片免费看视频直播| 天堂在线资源库| 亚洲另类在线一区| 天堂视频免费看| 国产影视一区| 欧美一区二区三区……| 99热这里只有精品5| 欧美国产日韩在线观看| 18禁男女爽爽爽午夜网站免费 | 在线免费一区三区| 特级西西人体wwwww| 韩国av一区| 7777精品伊久久久大香线蕉语言| 福利小视频在线观看| 欧美日韩亚洲91| 性活交片大全免费看| 亚洲女同中文字幕| 国产在线视频2019最新视频| 国产大片在线免费观看| 日本黄色一区二区| 一级黄色性视频| 欧美视频不卡| 98国产高清一区| 欧美理论片在线播放| 欧美三级电影网| 精品熟妇无码av免费久久| 玖玖玖国产精品| 就去色蜜桃综合| 成人香蕉视频| 在线成人一区二区| 不卡av电影在线| 国产视频一区在线播放| 成人精品小视频| 国产在线日韩精品| 国产精品入口免费视| av片在线免费观看| 欧美精品久久久久久久多人混战| 国产一区在线观看免费| 精品一区二区三区免费毛片爱 | 岛国视频免费在线观看| 欧美性猛交xxxxx免费看| 91精品又粗又猛又爽| 夜夜夜久久久| 日韩欧美一区二区三区四区五区| 亚洲va中文在线播放免费| 在线观看国产精品淫| 亚洲天堂自拍偷拍| 亚洲乱码国产乱码精品精的特点| 国产又黄又嫩又滑又白| aa级大片欧美三级| 日本不卡一区二区三区在线观看| 国产精品第一| 欧美日韩国产成人在线| 无码精品黑人一区二区三区| 色婷婷综合在线| 自拍偷拍第9页| 国产传媒一区在线| 欧美v在线观看| 成人羞羞在线观看网站| 91观看网站| 中文字幕这里只有精品| 日韩中文字幕国产| 亚洲经典一区二区三区| 午夜精品免费在线| 亚洲专区区免费| 韩国v欧美v亚洲v日本v| 影音先锋欧美在线| 中文字幕一区二区三区中文字幕| 国精产品一区一区三区有限在线| 青青草观看免费视频在线| 欧美日韩成人激情| 久草精品视频在线观看| 国产欧美一区二区精品性| 小早川怜子一区二区三区| 99精品国产在热久久| 亚洲人成人77777线观看| 哺乳一区二区三区中文视频 | 黄色av网站免费| 亚洲精选在线视频| 丰满少妇高潮一区二区| 青青草国产成人99久久| 400部精品国偷自产在线观看| 青青久久av| 91超碰在线电影| 第四色男人最爱上成人网| 欧美激情乱人伦| 亚洲成人三级| 亚洲乱码国产乱码精品精| 国产激情无套内精对白视频| 在线视频综合导航| 国产精品成人av久久| 国产精品久久久久四虎| 粉嫩av蜜桃av蜜臀av| 精品中文字幕一区二区小辣椒| 免费 成 人 黄 色| 午夜精品久久99蜜桃的功能介绍| 日韩三级在线播放| 天天躁日日躁狠狠躁欧美| 2020国产精品久久精品不卡| 88xx成人免费观看视频库 | 日本午夜精品一区二区三区| 亚洲大奶少妇| 91网站免费观看| gay欧美网站| 97在线视频免费播放| 免费看电影在线| 色系列之999| 久久综合九色综合久| 精品国产不卡一区二区三区| 国产乱淫a∨片免费观看| 精品国产乱码久久久久久虫虫漫画| 免费国产羞羞网站美图| 国产精品女上位| 中文字幕第4页| 91麻豆精品在线观看| 欧美xxxxx精品| 国产成人啪午夜精品网站男同| 亚洲色精品三区二区一区| 日韩午夜在线电影| 少妇一晚三次一区二区三区| 亚洲精品a级片| 天天做天天爱天天高潮| 99精品网站| 五月天男人天堂| 青青草97国产精品麻豆| 欧美大陆一区二区| 亚洲人成网亚洲欧洲无码| 久久综合色一本| 亚洲人成亚洲精品| 污视频在线免费观看一区二区三区| 亚洲伊人春色| 日韩欧美亚洲在线| 国产精品久久久久9999赢消| 亚洲综合激情五月| 欧美 亚欧 日韩视频在线 | 免费一级片91| 又色又爽又高潮免费视频国产| 久久一区精品| 国产免费999| 激情五月婷婷综合| wwwww在线观看| 99re热这里只有精品免费视频| 亚洲自拍偷拍精品| 国产剧情一区在线| 日韩av无码一区二区三区不卡| 国产一区二区影院| 91网址在线观看精品| 福利电影一区二区| 免费无码一区二区三区| 国产喷白浆一区二区三区| 蜜臀av一区二区三区有限公司| 国产成人免费在线| 中文字幕在线免费看线人| 久久久久久久一区| 精品国产大片大片大片| 亚洲一级二级在线| 91在线视频在线观看| 欧美亚洲日本国产| 国产丰满果冻videossex| 亚洲国产小视频在线观看| 欧洲成人一区二区三区| 亚洲女人被黑人巨大进入| 一区二区三区视频网站 | 2018天天弄| 精品久久久久久亚洲国产300| 波多野结衣电车痴汉| 欧美日韩视频不卡| 俄罗斯嫩小性bbwbbw| 亚洲偷熟乱区亚洲香蕉av| 成人短视频在线| 91精品国产成人www| 日本美女久久| 成人www视频在线观看| 精品福利一区| 久久精品国产理论片免费| 国产二区精品| 91黄色小网站| 国产福利一区在线| 国产精品久久久久久久无码| 国产精品国产自产拍高清av王其| 久久久精品一区二区涩爱| 在线这里只有精品| 成人毛片视频免费看| 中文字幕最新精品| 天堂网在线最新版www中文网| 国产日韩欧美自拍| 色天天色综合| 国产a级黄色大片| 日韩成人精品在线观看| 好吊操视频这里只有精品| 国产精品天天摸av网| 日韩三级免费看| 91麻豆精品国产91久久久久| 天天干天天草天天射| 欧美成人精品在线观看| 香蕉成人影院| 鲁丝一区二区三区免费| 欧美日韩精品一本二本三本| 蜜臀av午夜一区二区三区| 成人av网站在线观看免费| 国语对白在线播放| 欧美日韩国产美| 国产高清免费在线播放| 91精品国产91久久久| a级日韩大片| 亚洲最大色综合成人av| 久久久人人人| 麻豆传媒在线看| 中文字幕一区二区在线观看| 嫩草影院一区二区三区| 亚洲国产另类 国产精品国产免费| 成人日韩欧美| 91久久久亚洲精品| 欧美日韩精品在线一区| 久久国产色av免费观看| 成人毛片老司机大片| 青青操国产视频| 欧美va在线播放| 天堂8中文在线| 波多野结衣成人在线| 欧美午夜免费影院| 佐佐木明希电影| 亚洲人123区| 国产成人精品亚洲| 亚洲人成电影网站| 欧美粗大gay| 日韩精品久久一区| 七七婷婷婷婷精品国产| 五月婷六月丁香| 欧美性xxxxxx少妇| 国产高清在线| 成人国产亚洲精品a区天堂华泰| 日韩精品一卡| 青娱乐精品在线| 一区二区三区精品在线| 高潮一区二区三区乱码| 久久久久亚洲精品| 日韩影视在线观看| 免费观看成人网| 亚洲日本欧美天堂| 亚洲AV无码一区二区三区性| 欧美精品videosex性欧美| 欧美成人免费电影| 伊人av成人| 高清日韩电视剧大全免费| 日本一级淫片色费放| 亚洲欧美国产制服动漫| 欧美黄色a视频| 伊人久久在线观看| 不卡的av在线播放| 秋霞av一区二区三区| 亚洲香蕉伊综合在人在线视看| 成人国产精品一区二区免费麻豆| 美国av在线播放| 97精品久久久午夜一区二区三区| 在线观看日本视频| 日韩有码在线视频| 国产精品99久久免费观看| 亚洲色精品三区二区一区| 亚洲人成电影网站色mp4| 天堂网在线中文| 成人黄色片网站| 日韩一级精品| 自拍偷拍中文字幕| 欧美精品自拍偷拍| 国产拍在线视频| 亚洲一区二区在线观| 成人av网站免费观看| 伊人网站在线观看| 久久久亚洲精品视频| 精品久久精品| 中文字幕乱码在线人视频| 日本精品视频一区二区| 色呦呦网站在线观看| 日韩色妇久久av| 成人午夜电影网站| 中文字幕人成人乱码亚洲电影| 欧美激情亚洲自拍| 色欧美自拍视频| 欧美性xxxx图片| 欧美成人性战久久|