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

Rust 性能提升“最后一公里”:詳解 Profiling 瓶頸定位與優化

開發 前端
在性能優化領域,盲目猜測是最大的禁忌。你需要一把鋒利的“手術刀”,精準地找到問題的根源。在 Rust 生態中,雖然不像 Java 社區那樣擁有 VisualVM 或 JProfiler 這類功能強大的成熟工具,但我們依然可以搭建一套高效的性能分析體系。

一、Profiling:揭示性能瓶頸的“照妖鏡”

二、配置項目:讓 Profiling “武裝到牙齒”

三、全局配置:啟動 Profiling 開關

四、實現 Profile 生成函數:打造你的“數據采集器”

    1.  內存 Profile 生成函數

    2. CPU Profile 生成函數

五、觸發和使用 Profiling:隨時隨地捕捉性能數據

六、性能剖析:火焰圖下的“真相”

七、優化方案:從“每次新建”到“共享復用”

八、優化效果:性能數據“一飛沖天”

一、 Profiling:揭示性能瓶頸的“照妖鏡”

在過去的一年里,我們團隊完成了一項壯舉:將近萬核的 Java 服務成功遷移到 Rust,并收獲了令人矚目的性能提升。我們的實踐經驗已在《RUST練習生如何在生產環境構建萬億流量》一文中與大家分享。然而,在這次大規模遷移中,我們觀察到一個有趣的現象:大多數服務在遷移后性能都得到了顯著提升,但有那么一小部分服務,性能提升卻不盡如人意,僅僅在 10% 左右徘徊。

這讓我們感到疑惑。明明已經用上了性能“王者”Rust,為什么還會遇到瓶頸?為了解開這個謎團,我們決定深入剖析這些“低提升”服務。今天,我就來和大家分享,我們是如何利用 Profiling 工具,找到并解決寫入過程中的性能瓶頸,最終實現更高性能飛躍的!

在性能優化領域,盲目猜測是最大的禁忌。你需要一把鋒利的“手術刀”,精準地找到問題的根源。在 Rust 生態中,雖然不像 Java 社區那樣擁有 VisualVM 或 JProfiler 這類功能強大的成熟工具,但我們依然可以搭建一套高效的性能分析體系。

為了在生產環境中實現高效的性能監控,我們引入了 Jemalloc 內存分配器和 pprof CPU 分析器。這套方案不僅支持定時自動生成 Profile 文件,還可以在運行時動態觸發,極大地提升了我們定位問題的能力。

二、配置項目:讓Profiling“武裝到牙齒”

首先,我們需要在 Cargo.toml 文件中添加必要的依賴,讓我們的 Rust 服務具備 Profiling 的能力。以下是我們的配置,Rust 版本為 1.87.0。

[target.'cfg(all(not(target_env = "msvc"), not(target_os = "windows")))'.dependencies]
# 使用 tikv-jemallocator 作為內存分配器,并啟用性能分析功能
tikv-jemallocator = { version = "0.6", features = ["profiling", "unprefixed_malloc_on_supported_platforms"] }
# 用于在運行時控制和獲取 jemalloc 的統計信息
tikv-jemalloc-ctl = { version = "0.6", features = ["use_std", "stats"] }
# tikv-jemallocator 的底層綁定,同樣啟用性能分析
tikv-jemalloc-sys = { version = "0.6", features = ["profiling"] }
# 用于生成與 pprof 兼容的內存剖析數據,并支持符號化和火焰圖
jemalloc_pprof = { version = "0.7", features = ["symbolize","flamegraph"] }
# 用于生成 CPU 性能剖析數據和火焰圖
pprof = { version = "0.14", features = ["flamegraph", "protobuf-codec"] }

簡單來說,這幾個依賴各司其職:

※ tikv-jemallocator

基于 jemalloc 的 Rust 實現,以其高效的內存管理聞名。

※ jemalloc_pprof

負責將 jemalloc 的內存剖析數據轉換成標準的 pprof 格式。

※ pprof

用于 CPU 性能分析,可以生成 pprof 格式的 Profile 文件。

三、全局配置:啟動Profiling開關

接下來,在 main.rs 中進行全局配置,指定 Jemalloc 的 Profiling 參數,并將其設置為默認的全局內存分配器。

// 配置 Jemalloc 內存分析參數
#[export_name = "malloc_conf"]
pub static malloc_conf: &[u8] = b"prof:true,prof_active:true,lg_prof_sample:16\0";


#[cfg(not(target_env = "msvc"))]
use tikv_jemallocator::Jemalloc;


// 將 Jemalloc 設置為全局內存分配器
#[cfg(not(target_env = "msvc"))]
#[global_allocator]
static GLOBAL: Jemalloc = Jemalloc;

這段配置中的 lg_prof_sample:16 是一個關鍵參數。

它表示 jemalloc 會對大約每 2^16 字節(即 64KB)的內存分配進行一次采樣。這個值越大,采樣頻率越低,內存開銷越小,但精度也越低;反之則精度越高,開銷越大。在生產環境中,我們需要根據實際情況進行權衡。

四、實現Profile生成函數:打造你的“數據采集器”

我們將 Profile 文件的生成邏輯封裝成異步函數,這樣就可以在服務的任意時刻按需調用,非常靈活。

內存Profile生成函數

#[cfg(not(target_env = "msvc"))]
async fn dump_memory_profile() -> Result<String, String> {
    // 獲取 jemalloc 的 profiling 控制器
    let prof_ctl = jemalloc_pprof::PROF_CTL.as_ref()
        .ok_or_else(|| "Profiling controller not available".to_string())?;


    let mut prof_ctl = prof_ctl.lock().await;
    
    // 檢查 profiling 是否已激活
    if !prof_ctl.activated() {
        return Err("Jemalloc profiling is not activated".to_string());
    }
   
    // 調用 dump_pprof() 方法生成 pprof 數據
    let pprof_data = prof_ctl.dump_pprof()
        .map_err(|e| format!("Failed to dump pprof: {}", e))?;


    // 使用時間戳生成唯一文件名
    let timestamp = chrono::Utc::now().format("%Y%m%d_%H%M%S");
    let filename = format!("memory_profile_{}.pb", timestamp);


    // 將 pprof 數據寫入本地文件
    std::fs::write(&filename, pprof_data)
        .map_err(|e| format!("Failed to write profile file: {}", e))?;


    info!("Memory profile dumped to: {}", filename);
    Ok(filename)
}

CPU Profile生成函數

類似地,我們使用 pprof 庫來實現 CPU Profile 的生成。

#[cfg(not(target_env = "msvc"))]
async fn dump_cpu_profile() -> Result<String, String> {
    use pprof::ProfilerGuard;
    use pprof::protos::Message;


    info!("Starting CPU profiling for 60 seconds...");


    // 創建 CPU profiler,設置采樣頻率為 100 Hz
    let guard = ProfilerGuard::new(100).map_err(|e| format!("Failed to create profiler: {}", e))?;


    // 持續采樣 60 秒
    tokio::time::sleep(std::time::Duration::from_secs(60)).await;


    // 生成報告
    let report = guard.report().build().map_err(|e| format!("Failed to build report: {}", e))?;


    // 使用時間戳生成文件名
    let timestamp = chrono::Utc::now().format("%Y%m%d_%H%M%S");
    let filename = format!("cpu_profile_{}.pb", timestamp);


    // 創建文件并寫入 pprof 數據
    let mut file = std::fs::File::create(&filename)
        .map_err(|e| format!("Failed to create file: {}", e))?;


    report.pprof()
        .map_err(|e| format!("Failed to convert to pprof: {}", e))?
        .write_to_writer(&mut file)
        .map_err(|e| format!("Failed to write profile: {}", e))?;


    info!("CPU profile dumped to: {}", filename);
    Ok(filename)
}
  •  ProfilerGuard::new()   100  Hz 意味著每秒鐘會隨機中斷程序 100 次,以記錄當前正在執行的函數調用棧
  • tokio::time::sleep(std::time::Duration::from_secs(60)).await 表示 pprof 將會持續采樣 60 秒鐘
  •  guard.report().build() 這個方法用于將收集到的所有采樣數據進行處理和聚合,最終生成一個 Report 對象。這個 Report 對象包含了所有調用棧的統計信息,但還沒有轉換成特定的文件格式
  •  report.pprof() 這是 Report 對象的一個方法,用于將報告數據轉換成 pprof 格式

五、觸發和使用 Profiling:隨時隨地捕捉性能數據

有了上述函數,我們實現了兩種靈活的觸發方式。

※ 定時自動生成

通過異步定時任務,每隔一段時間自動調用 dump_memory_profile() 和  dump_cpu_profile() 。

fn start_profilers() {
    // Memory profiler
    tokio::spawn(async {
        let mut interval = tokio::time::interval(std::time::Duration::from_secs(300));
        loop {
            interval.tick().await;
            #[cfg(not(target_env = "msvc"))]
            {
                info!("Starting memory profiler...");
                match dump_memory_profile().await {
                    Ok(profile_path) => info!("Memory profile dumped successfully: {}", profile_path),
                    Err(e) => info!("Failed to dump memory profile: {}", e),
                }
            }
        }
    });
    // 同理可以實現CPU profiler
}

※ 手動 HTTP 觸發

通過提供 /profile/memory 和 /profile/cpu 兩個 HTTP 接口,可以隨時按需觸發 Profile 文件的生成。

async fn trigger_memory_profile() -> Result<impl warp::Reply, std::convert::Infallible> {
    #[cfg(not(target_env = "msvc"))]
    {
        info!("HTTP triggered memory profile dump...");
        match dump_memory_profile().await {
            Ok(profile_path) => Ok(warp::reply::with_status(
                format!("Memory profile dumped successfully: {}", profile_path),
                warp::http::StatusCode::OK,
            )),
            Err(e) => Ok(warp::reply::with_status(
                format!("Failed to dump memory profile: {}", e),
                warp::http::StatusCode::INTERNAL_SERVER_ERROR,
            )),
        }
    }
}
//同理也可實現trigger_cpu_profile()函數
fn profile_routes() -> impl Filter<Extract = impl Reply, Error = warp::Rejection> + Clone {
    let memory_profile = warp::post()
        .and(warp::path("profile"))
        .and(warp::path("memory"))
        .and(warp::path::end())
        .and_then(trigger_memory_profile);
    
    
    let cpu_profile = warp::post()
        .and(warp::path("profile"))
        .and(warp::path("cpu"))
        .and(warp::path::end())
        .and_then(trigger_cpu_profile);
    memory_profile.or(cpu_profile)
}

現在,我們就可以通過 curl 命令,隨時在生產環境中采集性能數據了:

curl -X POST http://localhost:8080/profile/memory
curl -X POST http://localhost:8080/profile/cpu

生成的 .pb 文件,我們就可以通過 go tool pprof 工具,啟動一個交互式 Web UI,在瀏覽器中直觀查看調用圖、火焰圖等。

go tool pprof -http=localhost:8080 ./target/debug/otel-storage ./otel_storage_cpu_profile_20250806_032509.pb

六、性能剖析:火焰圖下的“真相”

通過 go tool pprof 啟動的 Web UI,我們可以看到程序的火焰圖。

如何閱讀火焰圖

※ 頂部

代表程序的根函數。

※ 向下延伸

子函數調用關系。

※ 火焰條的寬度

代表該函數在 CPU 上消耗的時間。寬度越寬,消耗的時間越多,越可能存在性能瓶頸。

CPU ProfileCPU Profile

Memory ProfileMemory Profile

在我們的 CPU 火焰圖中,一個令人意外的瓶頸浮出水面:OSS::new 占用了約 19.1% 的 CPU 時間。深入分析后發現, OSS::new 內部的 TlsConnector 在每次新建連接時都會進行 TLS 握手,這是導致 CPU 占用過高的根本原因。

原來,我們的代碼在每次寫入 OSS 時,都會新建一個 OSS 實例,隨之而來的是一個全新的 HTTP 客戶端和一次耗時的 TLS 握手。盡管 oss-rust-sdk 內部有連接池機制,但由于我們每次都創建了新實例,這個連接池根本無法發揮作用!

七、優化方案:從“每次新建”到“共享復用”

問題的核心在于重復創建 OSS 實例。我們的優化思路非常清晰:復用 OSS 客戶端實例,避免不必要的 TLS 握手開銷。

優化前

每次寫入都新建 OSS 客戶端。

fn write_oss() {
    // 每次寫入都新建一個OSS實例
    let oss_instance = create_oss_client(oss_config.clone());
    tokio::spawn(async move {
        // 獲取寫入偏移量、文件名
        // 構造OSS寫入所需資源和頭信息
        // 寫入OSS
        let result = oss_instance
            .append_object(data, file_name, headers, resources)
            .await;
}
fn create_oss_client(config: OssWriteConfig) -> OSS {
    OSS::new(
    ……
    )
}

這種方案在流量較小時可能問題不大,但在萬億流量的生產環境中,頻繁的實例創建會造成巨大的性能浪費。

優化前

※ 共享實例

讓每個處理任務( DecodeTask )持有 Arc<OSS> 共享智能指針,確保所有寫入操作都使用同一個 OSS 實例。

let oss_client = Arc::new(create_oss_client(oss_config.clone()));
let oss_instance = self.oss_client.clone(); 
// ...
let result = oss_instance
    .append_object(data, file_name, headers, resources)
    .await;

※ 自動重建機制

為了應對連接失效或網絡問題,我們引入了自動重建機制。當寫入次數達到閾值或發生寫入失敗時,我們會自動創建一個新的 OSS 實例來替換舊實例,從而保證服務的健壯性。

// 使用原子操作確保多線程環境下的計數安全
let write_count = self.oss_write_count.load(std::sync::atomic::Ordering::SeqCst);
let failure_count = self.oss_failure_count.load(std::sync::atomic::Ordering::SeqCst);


// 檢查是否需要重建實例...
fn recreate_oss_client(&mut self) {
 
    let new_oss_client = Arc::new(create_oss_client(self.oss_config.clone()));
    self.oss_client = new_oss_client;
    self.oss_write_count.store(0, std::sync::atomic::Ordering::SeqCst);
    self.oss_failure_count.store(0, std::sync::atomic::Ordering::SeqCst);
    // 記錄OSS客戶端重建次數指標
    OSS_CLIENT_RECREATE_COUNT
        .with_label_values(&[])
        .inc();
    info!("OSS client recreated");
}

八、優化效果:性能數據“一飛沖天”

優化后的服務上線后,我們觀察到了顯著的性能提升。

CPU 資源使用率

同比下降約 20%。

圖片圖片

OSS 寫入耗時

同比下降約 17.2%,成為集群中最短的寫入耗時。

※ OSS寫入耗時

圖片圖片

※ OSS相關資源只占千分之一

圖片圖片

內存使用率內存使用率

平均下降 8.77%,這部分下降可能也得益于我們將內存分配器從 mimalloc 替換為 jemalloc 的綜合效果。

圖片圖片

這次優化不僅解決了特定服務的性能問題,更重要的是,它驗證了在 Rust 中通過 Profiling 工具進行深度性能分析的可行性。即使在已經實現了初步性能提升的 Rust 服務中,仍然存在巨大的優化空間。

未來,我們將繼續探索更高效的 Profiling 方案,并深入挖掘其他潛在的性能瓶頸,以在萬億流量的生產環境中實現極致的性能和資源利用率。

 引用 

責任編輯:武曉燕 來源: 得物技術
相關推薦

2015-04-23 10:30:42

華為

2022-07-29 09:03:17

AIOPS運維工具

2025-02-11 00:11:00

NULL運算篩選

2022-07-26 07:35:30

數據庫HTAP系統

2012-04-10 09:05:49

無線交換機

2015-12-11 10:46:01

2012-09-24 15:07:09

云ERP恩信科技云應用

2022-04-19 08:09:11

PON光纖網絡

2011-12-25 20:54:57

移動支付

2017-02-21 13:30:42

數據網絡終端

2017-02-21 12:30:21

數據中心智能終端網絡

2017-09-04 16:49:25

2023-12-12 08:31:44

智能運維場景

2009-09-07 11:47:22

無線交換機

2015-11-03 13:55:44

物聯網最后一公里

2015-08-26 20:04:43

2018-01-12 05:13:35

2019-12-16 09:33:08

浪潮
點贊
收藏

51CTO技術棧公眾號

超碰免费在线97| 色哟哟欧美精品| 欧美日韩精品高清| 国产传媒一区二区| 欧美亚洲色综久久精品国产| 呦呦在线视频| 国内精品久久久久久久久电影网 | 美女网站一区二区| 91精品在线免费观看| 精品国产_亚洲人成在线| 你懂得在线观看| 日韩a**中文字幕| 成人黄色综合网站| 两个人的视频www国产精品| 丁香婷婷激情网| 日本一区高清| 亚洲激情偷拍| 欧美一区二区视频免费观看| 亚洲国产欧美日韩| www.com亚洲| 久久综合欧美| 欧美日韩精品中文字幕| 国产精品久久久久久久久久直播| 久久av红桃一区二区禁漫| 精品3atv在线视频| a在线播放不卡| 高清一区二区三区四区五区| 日本wwwwwww| 黄色美女视频在线观看| 成人小视频在线观看| 欧美激情伊人电影| 男男一级淫片免费播放| zzzwww在线看片免费| 99精品久久99久久久久| 97色在线播放视频| 丰满圆润老女人hd| 日韩av福利| 亚洲大片一区二区三区| 久久亚裔精品欧美| 日日夜夜狠狠操| 海角社区69精品视频| 亚洲成人网在线观看| a级黄色一级片| 免费成人av电影| 蜜桃av一区二区| 浅井舞香一区二区| 阿v天堂2014| 欧美风情在线视频| 亚洲色图欧美激情| 岛国视频一区免费观看| 国产精品欧美亚洲| 亚洲网站在线| 久久99精品久久久久久琪琪| 日韩少妇一区二区| 欧洲一区在线| 欧美性xxxx极品hd欧美风情| 日韩一区二区电影在线观看| 一本久道久久综合无码中文| 亚洲情侣在线| 日韩成人中文字幕| 欧美成人福利在线观看| 中文字幕中文字幕在线十八区 | 日韩欧美高清在线| 日韩在线观看a| 日本精品一区二区在线观看| 日韩中文字幕亚洲一区二区va在线| 中文字幕亚洲无线码a| 欧美熟妇另类久久久久久多毛| bbw在线视频| 国产精品视频一二三区| 91网站在线看| 好看的av在线| 天天综合网91| 精品亚洲夜色av98在线观看| 日本黄色福利视频| 无遮挡爽大片在线观看视频| 国产精品灌醉下药二区| 狠狠色噜噜狠狠色综合久| 色屁屁草草影院ccyycom| 久久精品国产免费看久久精品| 国内免费久久久久久久久久久| 日本一级淫片色费放| 色135综合网| 精品亚洲aⅴ在线观看| 最近中文字幕免费视频| 国产精品调教| 91精品国产一区二区三区| 日韩欧美中文视频| 超薄肉色丝袜脚交一区二区| 亚洲最大成人综合| 性欧美18一19内谢| 高清在线观看av| 99精品黄色片免费大全| 日韩资源av在线| a毛片在线免费观看| 久久久久久久尹人综合网亚洲| 欧美大片第1页| 在线日韩国产网站| 亚洲高清不卡| 欧美激情视频一区二区| www..com国产| 最新亚洲视频| 国产精品久久久91| 久久精品视频5| 99精品国产福利在线观看免费 | 精品一区二区三区免费毛片| 国产天堂在线| 亚洲一区国产视频| 在线无限看免费粉色视频| 后进极品白嫩翘臀在线播放| 欧美性色欧美a在线播放| 日韩精品一区二区三区久久| aa视频在线观看| 欧美日韩亚洲另类| 久久婷婷综合色| 久久九九热re6这里有精品| 精品国产伦一区二区三区观看体验 | 欧美日韩激情一区| 国产又粗又长又爽| 91精品久久久久久综合五月天| 欧美精品自拍偷拍动漫精品| 香港日本韩国三级网站| 香蕉成人影院| 亚洲国产精品va在线看黑人| 精品亚洲乱码一区二区 | 国产精品美女久久久久高潮| 免费在线国产精品| 欧美人与禽性xxxxx杂性| 亚洲精品乱码久久久久久| 成年人黄色在线观看| 性欧美freesex顶级少妇| 精品人在线二区三区| 国产又黄又嫩又滑又白| 青青草国产成人a∨下载安卓| 中文字幕日韩欧美| 久久精品一二区| 日韩中文字幕91| 国内不卡一区二区三区| 欧美日本韩国一区二区| 亚洲午夜私人影院| 免费国偷自产拍精品视频| 欧美国产美女| 欧美激情videoshd| 国产裸体永久免费无遮挡| 国产成人一级电影| 狠狠色综合一区二区| 午夜羞羞小视频在线观看| 婷婷国产在线综合| 成人一区二区三| 日本午夜精品久久久| 在线观看91久久久久久| 国产精品老熟女一区二区| 亚洲精品偷拍| 国产乱码精品一区二区三区日韩精品| 午夜dj在线观看高清视频完整版| 在线成人免费视频| 日韩av手机在线免费观看| 在线精品一区| 国产精品免费一区二区三区| 日本在线视频中文有码| 日韩女同互慰一区二区| 欧美日韩人妻精品一区二区三区| 国产酒店精品激情| 久久青青草原一区二区| 天天综合视频在线观看| 五月婷婷欧美视频| 亚洲国产日韩欧美在线观看| 成人毛片免费看| 国产日韩中文在线| av女名字大全列表| 国产精品电影一区二区| www.五月天色| 国产成人一区二区三区影院| 国产精品都在这里| 在线中文资源天堂| 福利视频第一区| 亚洲精品乱码久久| 亚洲综合婷婷| 动漫一区二区在线| 中文在线а√在线8| 亚洲视频在线免费看| 久久av高潮av无码av喷吹| 青青草国产精品亚洲专区无| 国产亚洲精品自在久久| 中国色在线日|韩| 色妞久久福利网| 一级做a爰片久久毛片| 国产亚洲女人久久久久毛片| 97在线国产视频| 国产在线视频欧美一区| 国产午夜精品美女视频明星a级| 国产一级做a爱免费视频| 久久99精品久久久| 视频一区亚洲| 日韩在线视频一区二区三区| 欧美性一区二区三区| 亚洲成人av综合| 综合欧美亚洲日本| 中文字幕第100页| 欧美精品网站| 国产欧美精品在线| 91官网在线| 精品国产乱码久久久久久1区2区 | 成人久久一区二区三区| 国产一二三区在线视频| 精品毛片三在线观看| 日日操免费视频| 免费成人av资源网| 久久久久久av无码免费网站下载| 高清不卡一区| 777午夜精品福利在线观看| 少妇喷水在线观看| 欧美日韩国产美女| 特级西西444www大精品视频免费看| 中文字幕在线不卡国产视频| chinese麻豆新拍video| 国模大尺度一区二区三区| 懂色av一区二区三区四区五区| 欧美理论电影在线精品| 91影院在线免费观看视频| 午夜精品久久久久久久久久蜜桃| 久久久久国产精品免费网站| 视频免费一区| 一本色道久久综合狠狠躁篇怎么玩| 黄色片一区二区三区| 午夜精品一区二区三区电影天堂| 国产成人精品视频免费| 久久蜜臀中文字幕| 免费看黄色一级大片| 欧美手机在线| 久久青青草原| 秋霞蜜臀av久久电影网免费| yellow视频在线观看一区二区| 肉肉视频在线观看| 日韩最新av在线| 不卡视频免费在线观看| 欧美日韩中文字幕一区二区| 最近免费中文字幕大全免费版视频| 亚洲国产一区二区三区| 波多野结衣不卡视频| 成人av在线网| 国产精品99久久久精品无码| 亚洲少妇一区| 亚洲高清精品中出| 神马久久一区二区三区| 你懂的视频在线一区二区| 久久综合社区| 国产一区二区三区四区五区在线| 国产精品nxnn| 精品久久精品久久| 色88888久久久久久影院| 欧美专区日韩视频| 丝袜老师在线| 日韩美女视频免费在线观看| 久久综合网导航| 亚洲精品美女网站| 日韩一区免费视频| 日韩成人中文电影| 久久免费看视频| 国产亚洲视频在线| 在线观看麻豆| 久久综合电影一区| 伊人影院蕉久影院在线播放| 欧美精品国产精品日韩精品| 波多野结衣在线高清| 97在线视频精品| 美女福利一区二区| 欧美老女人性视频| 四虎亚洲成人| 午夜精品一区二区三区在线视| 欧美在线极品| 久久99视频精品| 92久久精品| 国产va免费精品高清在线观看| 日本大片在线播放| 97视频色精品| 国产激情久久| 日本电影亚洲天堂| 日韩五码电影| 国产精品久久久久久久av大片 | 欧美午夜精品一区二区三区| 91在线精品入口| 色国产综合视频| 日韩和一区二区| 色素色在线综合| 国产视频一区二区三区四区五区| 亚洲精品在线电影| 成人av毛片| 亚洲欧美日韩国产成人| 国精产品一品二品国精品69xx| 日韩高清av在线| 日本免费中文字幕在线| 韩国欧美亚洲国产| 亚洲精品tv| 久久久久久九九| 亚洲国产不卡| 黄色一级视频播放| 91欧美在线| 国产91xxx| 欧美精品导航| 午夜视频你懂的| 成人动漫视频在线| 成人午夜免费影院| 福利微拍一区二区| 精品国产一级片| 中日韩美女免费视频网址在线观看| 婷婷在线播放| 国产精品视频色| av在线日韩| 超碰97在线资源| 免费电影一区二区三区| 人妻激情另类乱人伦人妻| 久久永久免费| 欧美三级理论片| 大白屁股一区二区视频| 免费一级特黄3大片视频| 亚洲高清久久久| 中文字幕永久免费视频| 丁香五六月婷婷久久激情| 中文字幕人妻互换av久久| 亚洲娇小xxxx欧美娇小| 日本福利在线观看| 久久这里只有精品99| 91精品论坛| 国产九色91| 日韩在线不卡| 极品美女扒开粉嫩小泬| 国产成人在线网站| 黄视频网站免费看| 欧美午夜片在线看| 黄色av网站在线看| 欧美最顶级丰满的aⅴ艳星| 视频一区中文字幕精品| 日韩国产精品毛片| 免费在线观看成人| 一级特黄曰皮片视频| 亚洲成人av资源| www.com在线观看| 美女av一区二区| 在线观看的网站你懂的| 91av在线网站| 女一区二区三区| 日本熟妇人妻xxxx| 成人午夜视频福利| 久久久久成人片免费观看蜜芽| 亚洲一区二区三区不卡国产欧美| 中文字幕一级片| 亚洲精品自拍第一页| 久久爱91午夜羞羞| 久久青青草原一区二区| 久久天天综合| 波多野结衣办公室33分钟| 亚洲成av人片一区二区三区| 午夜精品久久久久久久96蜜桃| 久久精品国产欧美亚洲人人爽| 手机av在线播放| 成人性教育视频在线观看| 亚洲区小说区图片区qvod| 亚洲一区二区四区| 欧美日韩1区2区3区| 国偷自产av一区二区三区麻豆| 亚洲日本电影在线| 999av视频| 久久人人97超碰精品888| 国产精品45p| www.日本xxxx| 国产精品午夜免费| 国产91精品看黄网站在线观看| 亚洲成人动漫在线播放| 欧美jizzhd欧美| 97激碰免费视频| 国产乱人伦丫前精品视频| 国产高清精品在线观看| 丁香另类激情小说| 欧美另类视频在线观看| 精品国精品国产| 欧美精品总汇| 亚洲国产精品www| 国产99久久久久| av在线播放中文字幕| 欧美日韩电影在线| 日日夜夜天天综合入口| 精品卡一卡二| 久久精品国产色蜜蜜麻豆| 欧美色图一区二区| 国产婷婷色综合av蜜臀av| 日韩经典一区| 亚洲日本精品一区| 成人黄色综合网站| 亚洲国产精品无码久久久| 另类视频在线观看| 免费看久久久| 日韩精品你懂的| 中文字幕在线观看一区| 天堂中文资源在线观看| 国产精品美女www爽爽爽视频| 极品中文字幕一区| 国产免费嫩草影院| 亚洲精品乱码久久久久久金桔影视 | 男人添女荫道口喷水视频|