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

剖析CPU性能火焰圖生成的內(nèi)部原理

商務(wù)辦公
火焰圖是一個非常好的用于分析熱點函數(shù)的工具,只要你關(guān)注性能優(yōu)化,就應(yīng)該學(xué)會使用它來分析你的程序。我們今天的文章不光是介紹了火焰圖是如何生成的,而且還介紹了其底層的工作原理。火焰圖的生成主要分兩步,一是采樣,而是渲染。

大家好,我是飛哥!

在進行CPU性能優(yōu)化的時候,我們經(jīng)常先需要分析出來我們的應(yīng)用程序中的CPU資源在哪些函數(shù)中使用的比較多,這樣才能高效地優(yōu)化。一個非常好的分析工具就是《性能之巔》作者 Brendan Gregg 發(fā)明的火焰圖。

圖片

我們今天就來介紹下火焰圖的使用方法,以及它的工作原理。

一、火焰圖的使用

為了更好地展示火焰圖的原理,我專門寫了一小段代碼,

int main() {
    for (i = 0; i < 100; i++) {
        if (i < 10) {
            funcA();
        } else if (i < 16) {
            funcB();
        } else {
            funcC();
        }
    }
}

完整的源碼我放到了咱們開發(fā)內(nèi)功修煉的Github上了:https://github.com/yanfeizhang/coder-kung-fu/blob/main/tests/cpu/test09/main.c。

接下來我們用這個代碼實際體驗一下火焰圖是如何生成的。在本節(jié)中,我們只講如何使用,原理后面的小節(jié)再展開。

# gcc -o main main.c
# perf record -g ./main

這個時候,在你執(zhí)行命令的當(dāng)前目錄下生成了一個perf.data文件。接下來咱們需要把Brendan Gregg的生成火焰圖的項目下載下來。我們需要這個項目里的兩個perl腳本。

# git clone https://github.com/brendangregg/FlameGraph.git

接下來我們使用 perf script 解析這個輸出文件,并把輸出結(jié)果傳入到 FlameGraph/stackcollapse-perf.pl 腳本中來進一步解析,最后交由 FlameGraph/flamegraph.pl 來生成svg 格式的火焰圖。具體命令可以一行來完成。

# perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > out.svg

這樣,一副火焰圖就生成好了。

圖片

之所以選擇我提供一個 demo 代碼來生成,是因為這個足夠簡單和清晰,方便大家理解。在上面這個火焰圖中,可以看出 main 函數(shù)調(diào)用了 funcA、funcB、funcC,其中 funcA 又調(diào)用了 funcD、funcE,然后這些函數(shù)的開銷又都不是自己花掉的,而是因為自己調(diào)用的一個 CPU 密集型的函數(shù) caculate。整個系統(tǒng)的調(diào)用棧的耗時統(tǒng)計就十分清晰的展現(xiàn)在眼前了。

如果要對這個項目進行性能優(yōu)化。在上方的火焰圖中看雖然funcA、funcB、funcC、funcD、funcE這幾個函數(shù)的耗時都挺長,但它們的耗時并不是自己用掉的。而且都花在執(zhí)行子函數(shù)里了。我們真正應(yīng)該關(guān)注的是火焰圖最上方 caculate 這種又長又平的函數(shù)。因為它才是真正花掉 CPU 時間的代碼。其它項目中也一樣,拿到火焰圖后,從最上方開始,把耗時比較長的函數(shù)找出來,優(yōu)化掉。

另外就是在實際的項目中,可能函數(shù)會非常的多,并不像上面這么簡單,很多函數(shù)名可能都被折疊起來了。這個也好辦,svg 格式的圖片是支持交互的,你可以點擊其中的某個函數(shù),然后就可以展開了只詳細地看這個函數(shù)以及其子函數(shù)的火焰圖了。

怎么樣,火焰圖使用起來是不是還挺簡單的。接下來的小節(jié)中我們再來講講火焰圖生成全過程的內(nèi)部原理。理解了這個,你才能講火焰圖用的得心應(yīng)手。

二、perf采樣

2.1 perf 介紹

在生成火焰圖的第一步中,就是需要對你要觀察的進程或服務(wù)器進行采樣。采樣可用的工具有好幾個,我們這里用的是 perf record。

# perf record -g ./main

上面的命令中 -g 指的是采樣的時候要記錄調(diào)用棧的信息。./main 是啟動 main 程序,并只采樣這一個進程。這只是個最簡單的用法,其實 perf record 的功能非常的豐富。

它可以指定采集事件。當(dāng)前系統(tǒng)支持的事件列表可以用過 perf list 來查看。默認情況下采集的是 Hardware event 下的 cycles 這一事件。假如我們想采樣 cache-misses 事件,我們可以通過 -e 參數(shù)指定。

# perf record -e cache-misses  sleep 5 // 指定要采集的事件

還可以指定采樣的方式。該命令支持兩種采樣方式,時間頻率采樣,事件次數(shù)發(fā)生采樣。-F 參數(shù)指定的是每秒鐘采樣多少次。-c參數(shù)指定的是每發(fā)生多少次采樣一次。

# perf record -F 100 sleep 5           // 每一秒鐘采樣100次
# perf record -c 100 sleep 5           // 每發(fā)生100次采樣一次

還可以指定要記錄的CPU核

# perf record -C 0,1 sleep 5           // 指定要記錄的CPU號
# perf record -C 0-2 sleep 5           // 指定要記錄的CPU范圍

還可以采集內(nèi)核的調(diào)用棧

# perf record -a -g ./main

在使用 perf record 執(zhí)行后,會將采樣到的數(shù)據(jù)都生成到 perf.data 文件中。在上面的實驗中,雖然我們只采集了幾秒,但是生成的文件還挺大的,有 800 多 KB。我們通過 perf script 命令可以解析查看一下該文件的內(nèi)容。大概有 5 萬多行。其中的內(nèi)容就是采樣 cycles 事件時的調(diào)用棧信息。

......
59848 main 412201 389052.225443:     676233 cycles:u:
59849             55651b8b5132 caculate+0xd (/data00/home/zhangyanfei.allen/work_test/test07/main)
59850             55651b8b5194 funcC+0xe (/data00/home/zhangyanfei.allen/work_test/test07/main)
59851             55651b8b51d6 main+0x3f (/data00/home/zhangyanfei.allen/work_test/test07/main)
59852             7f8987d6709b __libc_start_main+0xeb (/usr/lib/x86_64-linux-gnu/libc-2.28.so)
59853         41fd89415541f689 [unknown] ([unknown])
......

除了 perf script 外,還可以使用 perf report 來查看和渲染結(jié)果。

# perf report -n --stdio

圖片

2.2 內(nèi)核工作過程

我們來簡單看一下內(nèi)核是如何工作的。

perf在采樣的過程大概分為兩步,一是調(diào)用 perf_event_open 來打開一個 event 文件,而是調(diào)用 read、mmap等系統(tǒng)調(diào)用讀取內(nèi)核采樣回來的數(shù)據(jù)。整體的工作流程圖大概如下

圖片

其中 perf_event_open 完成了非常重要的幾項工作。

  • 創(chuàng)建各種event內(nèi)核對象
  • 創(chuàng)建各種event文件句柄
  • 指定采樣處理回調(diào)

我們來看下它的幾個關(guān)鍵執(zhí)行過程。在 perf_event_open 調(diào)用的 perf_event_alloc 指定了采樣處理回調(diào)函數(shù)為,比如perf_event_output_backward、perf_event_output_forward等

static struct perf_event *
perf_event_alloc(struct perf_event_attr *attr, ...)
{   
    ...
    if (overflow_handler) {
        event->overflow_handler = overflow_handler;
        event->overflow_handler_context = context;
    } else if (is_write_backward(event)){
        event->overflow_handler = perf_event_output_backward;
        event->overflow_handler_context = NULL;
    } else {
        event->overflow_handler = perf_event_output_forward;
        event->overflow_handler_context = NULL;
    }
    ...
}

當(dāng) perf_event_open 創(chuàng)建事件對象,并打開后,硬件上發(fā)生的事件就可以出發(fā)執(zhí)行了。內(nèi)核注冊相應(yīng)的硬件中斷處理函數(shù)是 perf_event_nmi_handler。

//file:arch/x86/events/core.c
register_nmi_handler(NMI_LOCAL, perf_event_nmi_handler, 0, "PMI");

這樣 CPU 硬件會根據(jù) perf_event_open 調(diào)用時指定的周期發(fā)起中斷,調(diào)用 perf_event_nmi_handler 通知內(nèi)核進行采樣處理

//file:arch/x86/events/core.c
static int perf_event_nmi_handler(unsigned int cmd, struct pt_regs *regs)
{    
    ret = x86_pmu.handle_irq(regs);
    ...
}

該終端處理函數(shù)的函數(shù)調(diào)用鏈經(jīng)過 x86_pmu_handle_irq 到達 perf_event_overflow。其中 perf_event_overflow 是一個關(guān)鍵的采樣函數(shù)。無論是硬件事件采樣,還是軟件事件采樣都會調(diào)用到它。它會調(diào)用 perf_event_open 時注冊的 overflow_handler。我們假設(shè) overflow_handler 為 perf_event_output_forward

void
perf_event_output_forward(struct perf_event *event, ...)
{
    __perf_event_output(event, data, regs, perf_output_begin_forward);
}

在 __perf_event_output 中真正進行了采樣處理

//file:kernel/events/core.c
static __always_inline int
__perf_event_output(struct perf_event *event, ...)
{
    ...
    // 進行采樣
    perf_prepare_sample(&header, data, event, regs);
    // 保存到環(huán)形緩存區(qū)中
    perf_output_sample(&handle, &header, data, event);
}

如果開啟了 PERF_SAMPLE_CALLCHAIN,則不僅僅會把當(dāng)前在執(zhí)行的函數(shù)名采集下來,還會把整個調(diào)用鏈都記錄起來。

//file:kernel/events/core.c
void perf_prepare_sample(...)
{

    //1.采集IP寄存器,當(dāng)前正在執(zhí)行的函數(shù)
    if (sample_type & PERF_SAMPLE_IP)
        data->ip = perf_instruction_pointer(regs);

    //2.采集當(dāng)前的調(diào)用鏈
    if (sample_type & PERF_SAMPLE_CALLCHAIN) {
        int size = 1;

        if (!(sample_type & __PERF_SAMPLE_CALLCHAIN_EARLY))
            data->callchain = perf_callchain(event, regs);

        size += data->callchain->nr;

        header->size += size * sizeof(u64);
    }
    ...
}

這樣硬件和內(nèi)核一起協(xié)助配合就完成了函數(shù)調(diào)用棧的采樣。后面 perf 工具就可以讀取這些數(shù)據(jù)并進行下一次的處理了。

三、FlameGraph工作過程

前面我們用 perf script 解析是看到的函數(shù)調(diào)用棧信息比較的長。

......
59848 main 412201 389052.225443:     676233 cycles:u:
59849             55651b8b5132 caculate+0xd (/data00/home/zhangyanfei.allen/work_test/test07/main)
59850             55651b8b5194 funcC+0xe (/data00/home/zhangyanfei.allen/work_test/test07/main)
59851             55651b8b51d6 main+0x3f (/data00/home/zhangyanfei.allen/work_test/test07/main)
59852             7f8987d6709b __libc_start_main+0xeb (/usr/lib/x86_64-linux-gnu/libc-2.28.so)
59853         41fd89415541f689 [unknown] ([unknown])
......

在畫火焰圖的前一步得需要對這個數(shù)據(jù)進行一下預(yù)處理。stackcollapse-perf.pl 腳本會統(tǒng)計每個調(diào)用棧回溯出現(xiàn)的次數(shù),并將調(diào)用棧處理為一行。行前面表示的是調(diào)用棧,后面輸出的是采樣到該函數(shù)在運行的次數(shù)。

# perf script | ../FlameGraph/stackcollapse-perf.pl
main;[unknown];__libc_start_main;main;funcA;funcD;funcE;caculate 554118432
main;[unknown];__libc_start_main;main;funcB;caculate 338716787
main;[unknown];__libc_start_main;main;funcC;caculate 4735052652
main;[unknown];_dl_sysdep_start;dl_main;_dl_map_object_deps 9208
main;[unknown];_dl_sysdep_start;init_tls;[unknown] 29747
main;_dl_map_object;_dl_map_object_from_fd 9147
main;_dl_map_object;_dl_map_object_from_fd;[unknown] 3530
main;_start 273
main;version_check_doit 16041

上面 perf script 5 萬多行的輸出,經(jīng)過 stackcollapse.pl 預(yù)處理后,輸出只有不到 10 行。數(shù)據(jù)量大大地得到了簡化。在 FlameGraph 項目目錄下,能看到好多 stackcollapse 開頭的文件

圖片

這是因為各種語言、各種工具采樣輸出是不一樣的,所以自然也就需要不同的預(yù)處理腳本來解析。

在經(jīng)過 stackcollapse 處理得到了上面的輸出結(jié)果后,就可以開始畫火焰圖了。flamegraph.pl 腳本工作原理是:將上面的一行繪制成一列,采樣數(shù)得到的次數(shù)越大列就越寬。另外就是如果同一級別如果函數(shù)名一樣,就合并到一起。比如現(xiàn)在有一下數(shù)據(jù)文件:

funcA;funcB;funcC 2
funcA; 1
funcD; 1

我可以通過手工畫一個類似的火焰圖,如下:

圖片

其中 funcA 因為兩行記錄合并,所以占據(jù)了 3 的寬度。funcD 沒有合并,占據(jù)就是1。另外 funcB、funcC都畫在A上的上方,占據(jù)的寬度都是2。

總結(jié)

火焰圖是一個非常好的用于分析熱點函數(shù)的工具,只要你關(guān)注性能優(yōu)化,就應(yīng)該學(xué)會使用它來分析你的程序。我們今天的文章不光是介紹了火焰圖是如何生成的,而且還介紹了其底層的工作原理。火焰圖的生成主要分兩步,一是采樣,而是渲染。

在采樣這一步,主要依賴的是內(nèi)核提供的 perf_event_open 系統(tǒng)調(diào)用。該系統(tǒng)調(diào)用在內(nèi)部進行了非常復(fù)雜的處理過程。最終內(nèi)核和硬件一起協(xié)同合作,會定時將當(dāng)前正在執(zhí)行的函數(shù),以及函數(shù)完整的調(diào)用鏈路都給記錄下來。

在渲染這一步,Brendan Gregg 提供的腳本會出 perf 工具輸出的 perf_data 文件進行預(yù)處理,然后基于預(yù)處理后的數(shù)據(jù)渲染成 svg 圖片。函數(shù)執(zhí)行的次數(shù)越多,在 svg 圖片中的寬度就越寬。我們就可以非常直觀地看出哪些函數(shù)消耗的 CPU 多了。

最后再補充說一句是,我們的火焰圖只是一個采樣的渲染結(jié)果,并不一定完全代表真實情況,但也夠用了。

責(zé)任編輯:武曉燕 來源: 開發(fā)內(nèi)功修煉
相關(guān)推薦

2023-12-31 19:41:04

PHP性能終端

2009-09-14 10:35:15

Linq內(nèi)部執(zhí)行原理

2022-07-14 08:02:57

Netty網(wǎng)絡(luò)模塊

2016-09-02 12:34:52

2019-12-06 11:18:07

LinuxCPU架構(gòu)

2025-02-04 10:58:16

2025-07-14 00:20:00

2009-12-31 11:37:05

MPLS網(wǎng)絡(luò)

2015-07-28 10:06:03

C#內(nèi)部實現(xiàn)剖析

2010-09-06 12:50:09

PPP鏈路

2016-12-19 14:35:32

Spark Strea原理剖析數(shù)據(jù)

2010-03-01 16:48:02

Python模塊

2023-06-07 15:25:19

Kafka版本日志

2010-02-04 15:38:39

Android 手機

2009-09-22 15:22:08

Hibernate性能

2021-04-22 09:20:20

KubernetesKubectl FlaLinux

2021-02-02 08:11:50

火焰圖組件技術(shù)

2023-09-18 23:37:50

Kubernetes架構(gòu)

2010-06-12 14:35:46

UML對象圖

2010-06-29 11:00:25

UML類圖實例
點贊
收藏

51CTO技術(shù)棧公眾號

久久久久久免费| 黄色欧美在线| 97久久精品人人爽人人爽蜜臀| 亚洲欧美日韩国产中文专区| 大陆极品少妇内射aaaaaa| 黄色av一区二区| 好吊妞视频这里有精品| ...xxx性欧美| 国产精品一区二区三区免费视频| 国产性生活毛片| 污污的视频在线观看| 日产国产欧美视频一区精品| 亚洲精品成人久久| 91九色丨porny丨国产jk| 国产99对白在线播放| 日韩精品首页| 欧美亚洲精品一区| 欧美一区二区三区电影在线观看| 日韩精品一卡二卡| 欧美三级电影在线| 午夜国产精品一区| 精品一区二区视频| 97超碰人人干| 丝袜连裤袜欧美激情日韩| 亚洲一区二区三区精品在线| 97在线中文字幕| 久操免费在线视频| 亚洲精品午夜| 亚洲国产日韩一级| 国偷自产av一区二区三区小尤奈| 日本少妇毛茸茸高潮| 国产伦乱精品| 精品国产乱码久久久久久天美 | 国产精品一区二区三区四| 成人免费在线电影网| 亚洲一区二区三区四区五区中文| 91视频免费进入| 国产精品第九页| 日韩在线黄色| 在线观看精品一区| 在线免费观看成人网| 国产免费不卡av| 欧美三级免费| 亚洲精品国精品久久99热| 国产日韩一区二区在线| 国产小视频在线观看| 日韩av在线发布| 日韩一区二区av| 能看毛片的网站| а√天堂资源官网在线资源| 成a人片亚洲日本久久| 国产91精品久久久久久久| 久久午夜福利电影| 涩涩涩久久久成人精品| 一区二区三区影院| 狠狠色噜噜狠狠色综合久| 日韩在线视频不卡| 久久久久免费av| 日韩一级视频免费观看在线| 日韩 欧美 视频| 三级网站免费看| 日本免费视频在线观看| 黄网站免费久久| 午夜精品一区二区三区在线视频| 亚洲专区区免费| 国产精品18| 天天影视网天天综合色在线播放| 日韩国产一区久久| 亚洲国产精品视频在线| 久久国产直播| 超薄丝袜一区二区| 女人被狂躁c到高潮| 色综合一区二区日本韩国亚洲| 亚洲一区二区三区视频在线 | 国产乱码精品一区二区亚洲| 69堂国产成人免费视频| 国模无码视频一区二区三区| 3d成人动漫在线| bt7086福利一区国产| 国产精品视频免费在线| 色播视频在线播放| 国产精品亚洲综合久久| 亚洲视频综合网| 久久久久久久久久久影视| 亚洲美女尤物影院| 亚洲青青青在线视频| 免费中文日韩| 亚洲国产成人精品一区二区三区| 日本欧美大码aⅴ在线播放| 欧美夫妻性视频| 亚洲最大成人综合网| 成人精品动漫一区二区三区| 欧美精品视频www在线观看| 日韩国产欧美亚洲| 在线观看小视频| 国产精品美日韩| 欧美成人综合一区| 丰满人妻一区二区三区四区53 | 久久天堂电影网| 伊人网在线视频观看| 亚洲国产aⅴ精品一区二区| 欧美天堂亚洲电影院在线播放| 欧美大片在线播放| 在线电影福利片| 中文字幕一区二区日韩精品绯色| 欧美精品七区| 青青免费在线视频| av电影一区二区| 超碰97人人人人人蜜桃| 国产精品久久久久久免费 | 国产亚洲一卡2卡3卡4卡新区| 精品乱人伦一区二区三区| 亚洲精品视频三区| 久久久久久久性潮| 欧美性色黄大片| 少妇性l交大片| 成人在线爆射| 色噜噜久久综合| 91av在线免费播放| 校园春色亚洲色图| 在线区一区二视频| 精品亚洲一区二区三区四区| 456成人影院在线观看| 色国产精品一区在线观看| 欧美性久久久久| 成人影院网站| 在线这里只有精品| 韩国视频一区二区三区| 99久久伊人| 欧美丰满少妇xxxxx高潮对白| 伊人成人222| 国产亚洲精aa在线看| 91精品国产乱| 女性生殖扒开酷刑vk| 国产三级精品三级在线观看国产| 精品国产免费一区二区三区香蕉| 五月天丁香社区| 日韩大胆成人| 亚洲色图第三页| a资源在线观看| 婷婷亚洲五月| 欧美国产精品va在线观看| 国产精品99精品无码视| 亚洲免费一区二区| 国产精品露脸av在线| 国产精品女人久久久| 国产大片一区二区| 精品免费视频123区| 国产三级在线观看| 亚洲男人的天堂一区二区| 亚洲精品蜜桃久久久久久| 卡通欧美亚洲| 欧美美女喷水视频| 无码国产精品一区二区免费式直播 | 青青草福利视频| 成人中文在线| 欧美激情18p| 中文字幕在线看人| 国产麻豆视频精品| 国产一区在线免费| а天堂8中文最新版在线官网| 亚洲精品免费在线观看| 日韩美女爱爱视频| 日韩中文在线播放| 精品国产髙清在线看国产毛片| 日本高清www| 一区二区日韩欧美| 国产精品高清在线| 亚洲精品一区二区三区新线路| 国产日产欧美一区二区视频| 欧美日韩视频免费| 日本在线中文字幕一区二区三区| 日韩精品中文字幕在线一区| 欧美性猛交xxxx乱| 狠狠久久婷婷| 91免费高清视频| 精品三级久久久久久久电影聊斋| 欧美成人综合在线| av在线不卡免费看| 亚洲欧洲国产精品久久| av男人的天堂在线观看| 欧美日本国产视频| 97伦伦午夜电影理伦片| 国产精品多人| 91精品在线看| 日本在线看片免费人成视1000| 亚洲不卡在线观看| 能看毛片的网站| 婷婷六月综合| 91精品国产综合久久久久久蜜臀 | 欧美日韩成人在线观看| 中文字幕手机在线视频| 99久久精品国产网站| 亚洲五码在线观看视频| 国产精品成人国产| 一区二区欧美久久| 无码人妻丰满熟妇区bbbbxxxx | 国产精品高清一区二区三区| 成人在线直播| 欧美午夜电影一区| 亚洲а∨天堂久久精品2021| 激情成人综合| 国产精品自拍首页| 国内在线免费视频| 欧美成人激情免费网| 国产suv精品一区二区68| 日日摸夜夜添夜夜添亚洲女人| 六十路精品视频| 92久久精品| 91麻豆精品91久久久久久清纯| 黄色正能量网站| 一区二区日本视频| 国产一区二区三区色淫影院| 日韩少妇视频| 日韩欧美一区在线| 极品盗摄国产盗摄合集| 蜜臀99久久精品久久久久久软件| 欧美日韩一区在线播放| 成人免费看黄| 国产亚洲人成网站在线观看| 久久久成人免费视频| 99久久伊人久久99| 五十路熟女丰满大屁股| 久久草在线视频| 97精品视频在线播放| 婷婷丁香一区二区三区| 精品动漫一区二区| 欧美成人午夜精品免费| 亚洲一区黄色| 日本一区二区三区四区在线观看| 婷婷午夜社区一区| 亚洲视频自拍偷拍| 这里只有久久精品视频| 国产精品高潮呻吟| 亚洲精品国产久| 亚洲国产三级| 女同一区二区| 精品美女一区| 久热99视频在线观看| 亚洲精品久久久久久久久久| 亚洲va欧美va国产va天堂影院| 日本免费福利视频| 日本少妇一区二区| 国产精品12p| 欧美freesex8一10精品| 国产精品高潮呻吟久久av野狼| 日韩有码第一页| 日韩欧美精品网址| 貂蝉被到爽流白浆在线观看| 国产精品亚洲午夜一区二区三区 | 久久久精品五月天| 亚洲欧美日韩精品综合在线观看| 日韩毛片免费看| 欧美激情在线狂野欧美精品| 色网站在线免费观看| 在线视频欧美精品| 欧美特黄一级片| 高清不卡一二三区| 久久久久久久久久福利| 婷婷久久一区| 国产一区二区无遮挡| 日韩免费va| 欧美高清视频在线| 成人高清免费观看mv| 日韩亚洲欧美在线| av片免费观看| 亚洲综合激情小说| 欧洲美一区二区三区亚洲| 国产激情精品久久久第一区二区| 2022亚洲天堂| 欧美日韩ab| 亚洲ai欧洲av| 亚洲欧洲av| 99在线影院| 欧美一级免费| 国产成人一区二区在线| 免费男女羞羞的视频网站在线观看| 亚洲欧洲视频在线| 狠狠躁夜夜躁av无码中文幕| 欧美日韩日日骚| 天天干天天干天天| 亚洲一区二区高清| 在线观看亚洲网站| 中文字幕不卡的av| 国产色视频一区二区三区qq号| 国产成人精品亚洲日本在线桃色| 中文字幕av专区| 久久天堂成人| 欧美日韩精品在线一区二区| 中文字幕一区二区三区在线视频| 日韩欧美视频一区二区| 欧美国产极品| 国产一区二区无遮挡| 99ri日韩精品视频| 亚洲最大的免费| 亚洲精品伦理| 国产精品永久免费在线| 日韩成人动漫| 日韩av手机在线观看| 都市激情国产精品| 亚洲3p在线观看| 国产剧情av在线播放| 久久久久国产视频| 国精一区二区三区| 欧美精品久久久久久久久| 国模雨婷捆绑高清在线| 欧美激情精品久久久| 先锋成人av| 欧美激情综合亚洲一二区| 欧美日韩色网| 久久久噜噜噜久久久| 女同一区二区免费aⅴ| 欧美黑人一级爽快片淫片高清| 超碰在线免费播放| 欧美成人精品影院| 手机av在线播放| 久久免费少妇高潮久久精品99| av福利导福航大全在线| 高清一区二区三区四区五区| 爱看av在线入口| 91精品国产免费久久久久久| 国产传媒在线观看| 国产成人短视频| 巨大黑人极品videos精品| 国产精品丝袜久久久久久不卡| 嫩草伊人久久精品少妇av杨幂| 国产欧美日韩91| 日本一区二区乱| 国产偷久久久精品专区| 台湾色综合娱乐中文网| 欧美日韩在线精品| 成人精品中文字幕| 青春草在线视频免费观看| 欧美精品啪啪| 欧美 国产 日本| 日韩**一区毛片| 免费黄视频在线观看| 成人av午夜电影| 亚洲成人黄色av| 亚洲欧美日本在线| 日韩黄色三级视频| 91成人看片片| 无码人妻丰满熟妇区毛片18| 在线观看一区视频| www日韩视频| 久久久久久爱| www.亚洲成人| 国产高清在线免费| 亚洲成人你懂的| 91精品国产高清一区二区三密臀| 成人午夜在线视频| 国产三级三级三级看三级| 久久激情久久| 成人综合久久网| 最新国产乱人伦偷精品免费网站| 欧洲一区二区日韩在线视频观看免费 | 国产精品女主播| 国产精品18| 欧美一区二区在线| 欧美激情1区| 欧美黄色一级片视频| 国产精品99久久久久久久vr| 一二三不卡视频| 亚洲六月丁香色婷婷综合久久 | 亚洲精品护士| 在线观看免费黄网站| 成人一区二区三区视频| 精品日韩在线视频| 亚洲va在线va天堂| 在线视频 91| 日韩精品免费看| 好操啊在线观看免费视频| 青草青草久热精品视频在线网站| 99tv成人影院| 日本一区二区三区www| 一区免费在线| 日本高清久久久| 国产亚洲成aⅴ人片在线观看 | 一区二区三区免费在线观看视频| 亚洲欧美偷拍三级| 中文字幕视频免费观看| 日韩国产欧美精品在线| 青草影视电视剧免费播放在线观看| 国产精品流白浆视频| 伊人成综合网yiren22| 国产一级做a爰片久久毛片男| 国产精品美女久久久| 麻豆tv在线观看| 亚洲欧美日韩国产中文在线| 在线观看你懂的网站| 精品亚洲aⅴ在线观看| 超免费在线视频| 99理论电影网| 一本到12不卡视频在线dvd| 在线观看国产一级片| 国产午夜亚洲精品不卡| 波多野结衣视频网站| 日韩成人网免费视频| 国产精品xx| 噜噜噜噜噜久久久久久91|