精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人av资源网站| 亚洲三级影院| 欧美一区二区三区四区久久 | 欧美一级黄色片视频| 久久久久久青草| 麻豆久久一区二区| 欧美日韩福利在线观看| 国产ts丝袜人妖系列视频| 日韩毛片一区| 亚洲福利电影网| 欧美午夜精品理论片a级大开眼界| 在线免费一区二区| 欧美日韩三级| 亚洲欧美日韩区| 99热这里只有精品2| 伊人网在线播放| 综合久久给合久久狠狠狠97色| 国产精品一区二区欧美| 中国一级特黄视频| 亚洲毛片视频| 欧美成人精品在线观看| 日本少妇xxxxx| 精品视频在线你懂得| 欧美理论片在线| 各处沟厕大尺度偷拍女厕嘘嘘| 久久日韩视频| 26uuu精品一区二区三区四区在线| 91在线播放国产| www.日韩一区| 免费精品视频| 色综合天天综合网国产成人网 | 亚洲一区影音先锋| 一区二区三区四区| 国产一级在线| 91在线你懂得| 国产久一道中文一区| 国产欧美综合视频| 老汉av免费一区二区三区| 欧美又大又硬又粗bbbbb| 国产亚洲第一页| 夜间精品视频| 久久精品夜夜夜夜夜久久| 国产女主播喷水高潮网红在线| 99a精品视频在线观看| 欧美一区二区三区免费在线看| 亚洲性生活网站| 18video性欧美19sex高清| 樱花草国产18久久久久| 99亚洲精品视频| 丝袜美腿美女被狂躁在线观看| 久久嫩草精品久久久久| 看欧美日韩国产| 青青草免费在线视频| av在线不卡免费看| 精品一区国产| 亚洲 国产 欧美 日韩| 97精品国产露脸对白| 精品欧美国产一区二区三区不卡| 亚洲大尺度网站| 成人免费av资源| 国内成+人亚洲| 五月天激情婷婷| 99国产精品久| 欧美日韩国产综合视频在线| 青青草超碰在线| 国产日韩欧美一区二区三区乱码 | 国产精品美女无圣光视频| 无码人妻精品一区二| 日韩不卡一区二区三区 | 亚洲av综合一区| 免费高清视频精品| 成人欧美一区二区三区黑人| av高清一区二区| 国产jizzjizz一区二区| 激情久久av| 成人欧美一区| 国产精品久久久久影院色老大| 美国av在线播放| 激情网站在线| 色综合天天综合狠狠| 国产精品igao| 国产日韩在线观看视频| 日韩精品中文字幕一区二区三区 | 国产精品欧美激情在线观看| jvid一区二区三区| 91精品久久久久久久久99蜜臂| 绯色av蜜臀vs少妇| 欧美禁忌电影| 美女国内精品自产拍在线播放| 久久高清免费视频| 日本视频中文字幕一区二区三区| 成人性生交大片免费观看嘿嘿视频| 性生活三级视频| xnxx国产精品| 青青在线免费视频| 亚洲天堂免费电影| 在线播放亚洲一区| 右手影院亚洲欧美| 亚洲成人二区| 欧洲午夜精品久久久| 一区二区三区精| 91色乱码一区二区三区| 国产91av视频在线观看| 免费污视频在线观看| 在线观看区一区二| 亚洲美女在线播放| 日本精品三区| 欧美亚洲另类视频| 精品国精品国产自在久不卡| 久久久久9999亚洲精品| 免费的一级黄色片| a成人v在线| 精品呦交小u女在线| 午夜少妇久久久久久久久| 久久中文精品| 国产日韩在线一区二区三区| 麻豆视频免费在线观看| 欧美视频第一页| 国产成人av免费观看| 清纯唯美日韩| 日韩av黄色在线观看| 亚洲成人第一区| 最新国产成人在线观看| 成人性做爰aaa片免费看不忠| jizz久久精品永久免费| 久久精品久久久久久| 波多野结衣黄色网址| a在线播放不卡| 屁屁影院ccyy国产第一页| 四虎精品在线观看| 伊人成人开心激情综合网| 日韩av大片在线观看| 国产69精品久久久久777| 国产精品久久成人免费观看| 成人1区2区| 亚洲精品中文字幕有码专区| 日本熟伦人妇xxxx| 国产成人免费xxxxxxxx| 50度灰在线观看| 国产精品久久久久久久久久辛辛 | 亚洲国产精品免费| 久久精品一区二区三| 国产在线一区二区| 亚洲一区不卡在线| 国产一区二区色噜噜| 正在播放亚洲1区| 一二三区免费视频| 久久精品欧美一区二区三区麻豆| 久久婷婷国产精品| 精品99在线| 国产精品高潮呻吟久久av野狼| 青青久草在线| 色久优优欧美色久优优| 亚洲一区视频在线播放| 蜜桃av一区二区在线观看| 视频在线99re| 亚洲爽爆av| 欧美美最猛性xxxxxx| 北条麻妃一二三区| 亚洲国产你懂的| 三级电影在线看| 国产欧美一区二区色老头 | 成年人视频在线观看免费| 在线视频欧美精品| 91ts人妖另类精品系列| 国产一区二区中文字幕| 日本福利视频在线观看| 亚洲高清在线一区| 久久露脸国产精品| 日本福利片在线| 欧美日韩一区精品| 青娱乐国产盛宴| 91网上在线视频| 久久久精品麻豆| 亚洲精品国产首次亮相| 国产精品12| 视频二区不卡| 久色乳综合思思在线视频| 可以免费看毛片的网站| 日韩欧美在线免费观看| 精品在线观看一区| 国产成人8x视频一区二区| 日韩av一二三四区| 日本久久黄色| 国产一区二区三区高清视频| 超碰aⅴ人人做人人爽欧美| 最新日韩中文字幕| 亚洲免费成人在线| 色94色欧美sute亚洲13| 成人免费视频国产免费观看| 99热这里都是精品| 日韩av在线中文| 99re国产精品| 视频一区二区视频| 日韩高清影视在线观看| 成人精品aaaa网站| 成人小电影网站| 欧美另类极品videosbestfree| 九九九伊在人线综合| 日韩欧美色综合| 亚洲精品男人的天堂| 亚洲精品国产成人久久av盗摄 | 成人羞羞网站入口免费| 成人黄视频免费| 成人免费一区| 7m第一福利500精品视频| 在线观看免费网站黄| 亚洲成人精品av| 97免费观看视频| 欧美午夜www高清视频| 欧美色图亚洲视频| 欧美激情一区二区三区不卡| 色综合久久五月| 精品无人区卡一卡二卡三乱码免费卡| 久久久久久久中文| 欧美精品黄色| 免费观看黄色大片| 大色综合视频网站在线播放| 久久精品日韩精品| 91综合精品国产丝袜长腿久久| 国产精品丝袜久久久久久不卡| 国产传媒av在线| 欧美美女18p| 精品黄色免费中文电影在线播放| 亚洲日本成人网| 天天综合天天综合| 欧美mv日韩mv国产网站app| 91麻豆国产视频| 欧美亚洲综合在线| 伊人中文字幕在线观看| 激情成人在线视频| 免费一级全黄少妇性色生活片| 亚洲欧洲国产日本综合| 成人午夜免费影院| 国产精品系列在线| 91激情视频在线观看| 久久久精品免费观看| 色噜噜在线观看| av中文一区二区三区| 欧美极品jizzhd欧美仙踪林| 懂色av一区二区三区蜜臀| 在线成人精品视频| 高清成人免费视频| 亚洲精品久久一区二区三区777 | 亚洲一区二区三区综合| 成人激情文学综合网| 亚洲成av人片在线观看无| 成人亚洲一区二区一| 手机免费看av片| 99久久婷婷国产| 魔女鞋交玉足榨精调教| 久久美女高清视频| 久久精品国产亚洲av久| 久久久久国产精品免费免费搜索| 一级片视频免费看| 欧美高清在线一区| 日韩精品一区二区亚洲av性色| 亚洲三级免费观看| 欧美精品99久久久| 欧美日韩黄色大片| 天天干天天操天天爱| 在线观看免费成人| 91精品国产乱码久久久久| 91精品国产一区二区三区蜜臀| 99热这里只有精品在线观看| 欧美zozo另类异族| 日韩毛片在线一区二区毛片| 亚洲少妇中文在线| 九七久久人人| 91国产在线精品| 欧美自拍电影| 成人黄色av网站| 国产精品毛片视频| 日本不卡二区| 重囗味另类老妇506070| 人妻无码久久一区二区三区免费| 亚洲一区视频| 中文字幕在线视频精品| 高清shemale亚洲人妖| 变态另类丨国产精品| 国产精品人成在线观看免费 | 麻豆av免费观看| 中文字幕一区二区在线观看| 久久无码精品丰满人妻| 色婷婷综合久久久久中文一区二区| 一二三四区在线| 亚洲电影免费观看| 3p在线观看| 久久久久久久网站| 日本黄色一区| 国产中文一区二区| 天天影视天天精品| 91丨porny丨探花| 奇米在线7777在线精品| 国产老头和老头xxxx×| 久久久国产综合精品女国产盗摄| 亚洲成人生活片| 色综合欧美在线| 狠狠躁日日躁夜夜躁av| 综合网日日天干夜夜久久| av剧情在线观看| 国产综合视频在线观看| 亚洲国产网址| 免费看欧美黑人毛片| 奇米888四色在线精品| 制服丝袜第一页在线观看| 日韩一区中文字幕| 国产91国语对白在线| 欧美成人一区二区三区片免费| av在线电影院| 欧美有码在线观看| 草草视频在线一区二区| 一区在线电影| 日本视频在线一区| 巨胸大乳www视频免费观看| 一片黄亚洲嫩模| 国产精品久久久午夜夜伦鲁鲁| 亚洲人成网7777777国产| 第四色日韩影片| 91精品天堂| 99国产精品一区二区| 不要播放器的av网站| 99久久亚洲一区二区三区青草| 成人免费视频网站入口::| 欧美性受xxxx黑人xyx性爽| 日夜干在线视频| 性欧美亚洲xxxx乳在线观看| 欧美日韩国产一区二区在线观看| 亚洲欧洲一区二区| 日韩和欧美一区二区三区| 毛片网站免费观看| 色婷婷国产精品综合在线观看| 午夜影院在线视频| 韩国精品久久久999| 大桥未久女教师av一区二区| 久久久久亚洲av无码专区喷水| 久久电影网电视剧免费观看| 夫妇露脸对白88av| 欧美综合欧美视频| 成人在线免费看| 国产精品免费电影| 第一会所sis001亚洲| gogogo高清免费观看在线视频| 国产精品毛片大码女人| 亚洲一区二区人妻| 搡老女人一区二区三区视频tv| 成人精品动漫| 国产福利片一区二区| 精品一区二区久久久| 大地资源高清在线视频观看| 欧美日韩成人综合在线一区二区| 欧美激情午夜| 亚洲自拍偷拍色片视频| 欧美在线首页| 黄色国产在线视频| 精品女厕一区二区三区| 视频一区二区三区国产| 国产成人在线一区| 欧美成人激情| 少妇极品熟妇人妻无码| 午夜精品视频在线观看| 你懂的在线免费观看| 国产精品久久久久久亚洲调教| 日韩一区二区三区免费播放| 欧美美女性视频| 亚洲一区在线观看网站| 天天摸天天干天天操| 日本伊人精品一区二区三区介绍| 精品一区亚洲| 亚洲欧美日本一区二区| 一区二区三区四区不卡在线 | 亚洲熟妇无码av在线播放| 成人h动漫精品| 免费av中文字幕| 日韩有码视频在线| 亚洲一区二区三区免费| 欧美成人三级在线视频| 久久久久99精品国产片| 国产精品一级视频| 98精品国产高清在线xxxx天堂| 神马午夜久久| 毛片毛片毛片毛| 亚洲va国产va欧美va观看| 国产精品影院在线| 亚洲自拍欧美另类| 国产精品一卡| 人与动物性xxxx| 亚洲精品国产成人| 精品三级在线| 僵尸世界大战2 在线播放| 日本一二三四高清不卡| 亚洲精品国产一区二| 国产国语videosex另类| 欧美日本不卡| 人妻视频一区二区| 精品动漫一区二区三区在线观看| 欧美性片在线观看| 91成人在线观看喷潮教学| 国产精品久久久久久久久免费桃花 | 91国产丝袜播放在线|