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

淺析 Jetty 中的線程優(yōu)化思路

開(kāi)發(fā)
本文介紹了 Jetty 中 ManagedSelector 和 ExecutionStrategy 的設(shè)計(jì)實(shí)現(xiàn),通過(guò)與原生 select 調(diào)用的對(duì)比揭示了 Jetty 的線程優(yōu)化思路。Jetty 設(shè)計(jì)了一個(gè)自適應(yīng)的線程執(zhí)行策略(EatWhatYouKill),在不出現(xiàn)線程饑餓的情況下盡量用同一個(gè)線程偵測(cè) I/O 事件和處理 I/O 事件,充分利用了 CPU 緩存并減少了線程切換的開(kāi)銷(xiāo)。這種優(yōu)化思路

一、什么是 Jetty

Jetty 跟 Tomcat 一樣是一種 Web 容器,它的總體架構(gòu)設(shè)計(jì)如下:

Jetty 總體上由一系列 Connector、一系列 Handler 和一個(gè) ThreadPool組成。

圖片

Connector 也就是 Jetty 的連接器組件,相比較 Tomcat 的連接器,Jetty 的連接器在設(shè)計(jì)上有自己的特點(diǎn)。

Jetty 的 Connector 支持 NIO 通信模型,NIO 模型中的主角是 Selector,Jetty 在 Java 原生 Selector 的基礎(chǔ)上封裝了自己的 Selector:ManagedSelector。

二、Jetty 中的 Selector 交互

2.1 傳統(tǒng)的 Selector 實(shí)現(xiàn)

常規(guī)的 NIO 編程思路是將 I/O 事件的偵測(cè)和請(qǐng)求的處理分別用不同的線程處理。

具體過(guò)程是:

  1. 啟動(dòng)一個(gè)線程;
  2. 在一個(gè)死循環(huán)里不斷地調(diào)用 select 方法,檢測(cè) Channel 的 I/O 狀態(tài);
  3. 一旦 I/O 事件到達(dá),就把該 I/O 事件以及一些數(shù)據(jù)包裝成一個(gè) Runnable;
  4. 將 Runnable 放到新線程中去處理。

這個(gè)過(guò)程有兩個(gè)線程在干活:一個(gè)是 I/O 事件檢測(cè)線程、一個(gè)是 I/O 事件處理線程。

這兩個(gè)線程是"生產(chǎn)者"和"消費(fèi)者"的關(guān)系。

這樣設(shè)計(jì)的好處:

將兩個(gè)工作用不同的線程處理,好處是它們互不干擾和阻塞對(duì)方。

這樣設(shè)計(jì)的缺陷:

當(dāng) Selector 檢測(cè)讀就緒事件時(shí),數(shù)據(jù)已經(jīng)被拷貝到內(nèi)核中的緩存了,同時(shí) CPU 的緩存中也有這些數(shù)據(jù)了。

這時(shí)當(dāng)應(yīng)用程序去讀這些數(shù)據(jù)時(shí),如果用另一個(gè)線程去讀,很有可能這個(gè)讀線程使用另一個(gè) CPU 核,而不是之前那個(gè)檢測(cè)數(shù)據(jù)就緒的 CPU 核。

這樣 CPU 緩存中的數(shù)據(jù)就用不上了,并且線程切換也需要開(kāi)銷(xiāo)。

2.2 Jetty 中的 ManagedSelector 實(shí)現(xiàn)

Jetty 的 Connector 將 I/O 事件的生產(chǎn)和消費(fèi)放到同一個(gè)線程處理。

如果執(zhí)行過(guò)程中線程不阻塞,操作系統(tǒng)會(huì)用同一個(gè) CPU 核來(lái)執(zhí)行這兩個(gè)任務(wù),這樣既能充分利用 CPU 緩存,又可以減少線程上下文切換的開(kāi)銷(xiāo)。

ManagedSelector 本質(zhì)上是一個(gè) Selector,負(fù)責(zé) I/O 事件的檢測(cè)和分發(fā)。

為了方便使用,Jetty 在 Java 原生 Selector 的基礎(chǔ)上做了一些擴(kuò)展,它的成員變量如下:

public class ManagedSelector extends ContainerLifeCycle implements Dumpable
{
    // 原子變量,表明當(dāng)前的ManagedSelector是否已經(jīng)啟動(dòng)
    private final AtomicBoolean _started = new AtomicBoolean(false);
     
    // 表明是否阻塞在select調(diào)用上
    private boolean _selecting = false;
     
    // 管理器的引用,SelectorManager管理若干ManagedSelector的生命周期
    private final SelectorManager _selectorManager;
     
    // ManagedSelector的id
    private final int _id;
     
    // 關(guān)鍵的執(zhí)行策略,生產(chǎn)者和消費(fèi)者是否在同一個(gè)線程處理由它決定
    private final ExecutionStrategy _strategy;
     
    // Java原生的Selector
    private Selector _selector;
     
    // "Selector更新任務(wù)"隊(duì)列
    private Deque<SelectorUpdate> _updates = new ArrayDeque<>();
    private Deque<SelectorUpdate> _updateable = new ArrayDeque<>();
     
    ...
}

2.2.1 SelectorUpdate 接口

為什么需要一個(gè)"Selector更新任務(wù)"隊(duì)列呢?

對(duì)于 Selector 的用戶來(lái)說(shuō),我們對(duì) Selector 的操作無(wú)非是將 Channel 注冊(cè)到 Selector 或者告訴 Selector 我對(duì)什么 I/O 事件感興趣。

這些操作其實(shí)就是對(duì) Selector 狀態(tài)的更新,Jetty 把這些操作抽象成 SelectorUpdate 接口。

/**
 * A selector update to be done when the selector has been woken.
 */
public interface SelectorUpdate
{
    void update(Selector selector);
}

這意味著不能直接操作 ManagedSelector 中的 Selector,而是需要向 ManagedSelector 提交一個(gè)任務(wù)類(lèi)。

這個(gè)類(lèi)需要實(shí)現(xiàn) SelectorUpdate 接口的 update 方法,在 update 方法中定義要對(duì) 

ManagedSelector 做的操作。

比如 Connector 中的 Endpoint 組件對(duì)讀就緒事件感興趣。

它就向 ManagedSelector 提交了一個(gè)內(nèi)部任務(wù)類(lèi)

ManagedSelector.SelectorUpdate:

_selector.submit(_updateKeyAction);

這個(gè) _updateKeyAction 就是一個(gè)

SelectorUpdate 實(shí)例,它的 update 方法實(shí)現(xiàn)如下:

private final ManagedSelector.SelectorUpdate _updateKeyAction = new ManagedSelector.SelectorUpdate()
{
    @Override
    public void update(Selector selector)
{
        // 這里的updateKey其實(shí)就是調(diào)用了SelectionKey.interestOps(OP_READ);
        updateKey();
    }
};

在 update 方法里,調(diào)用了 SelectionKey 類(lèi)的 interestOps 方法,傳入的參數(shù)是 OP_READ,意思是我對(duì)這個(gè) Channel 上的讀就緒事件感興趣。

2.2.2 Selectable 接口

上面有了 update 方法,那誰(shuí)來(lái)執(zhí)行這些 update 呢,答案是 ManagedSelector 自己。

它在一個(gè)死循環(huán)里拉取這些 SelectorUpdate 任務(wù)逐個(gè)執(zhí)行。

I/O 事件到達(dá)時(shí),ManagedSelector 通過(guò)一個(gè)任務(wù)類(lèi)接口(Selectable 接口)來(lái)確定由哪個(gè)函數(shù)處理這個(gè)事件。

public interface Selectable
{
    // 當(dāng)某一個(gè)Channel的I/O事件就緒后,ManagedSelector會(huì)調(diào)用的回調(diào)函數(shù)
    Runnable onSelected();
 
    // 當(dāng)所有事件處理完了之后ManagedSelector會(huì)調(diào)的回調(diào)函數(shù)
    void updateKey();
}

Selectable 接口的 onSelected() 方法返回一個(gè) Runnable,這個(gè) Runnable 就是 I/O 事件就緒時(shí)相應(yīng)的處理邏輯。

ManagedSelector 在檢測(cè)到某個(gè) Channel 上的 I/O 事件就緒時(shí),ManagedSelector 調(diào)用這個(gè) Channel 所綁定的類(lèi)的 onSelected 方法來(lái)拿到一個(gè) Runnable。

然后把 Runnable 扔給線程池去執(zhí)行。

三、Jetty 的線程優(yōu)化思路

3.1 Jetty 中的 ExecutionStrategy 實(shí)現(xiàn)

前面介紹了 ManagedSelector 的使用交互:

  1. 如何注冊(cè) Channel 以及 I/O 事件
  2. 提供什么樣的處理類(lèi)來(lái)處理 I/O 事件

那么 ManagedSelector 如何統(tǒng)一管理和維護(hù)用戶注冊(cè)的 Channel 集合呢,答案是

ExecutionStrategy 接口。

這個(gè)接口將具體任務(wù)的生產(chǎn)委托給內(nèi)部接口 Producer,而在自己的 produce 方法里實(shí)現(xiàn)具體執(zhí)行邏輯。

這個(gè) Runnable 的任務(wù)可以由當(dāng)前線程執(zhí)行,也可以放到新線程中執(zhí)行。

public interface ExecutionStrategy
{
    // 只在HTTP2中用到的一個(gè)方法,暫時(shí)忽略
    public void dispatch();
 
    // 實(shí)現(xiàn)具體執(zhí)行策略,任務(wù)生產(chǎn)出來(lái)后可能由當(dāng)前線程執(zhí)行,也可能由新線程來(lái)執(zhí)行
    public void produce();
     
    // 任務(wù)的生產(chǎn)委托給Producer內(nèi)部接口
    public interface Producer
    {
        // 生產(chǎn)一個(gè)Runnable(任務(wù))
        Runnable produce();
    }
}

實(shí)現(xiàn) Produce 接口生產(chǎn)任務(wù),一旦任務(wù)生產(chǎn)出來(lái),ExecutionStrategy 會(huì)負(fù)責(zé)執(zhí)行這個(gè)任務(wù)。

private class SelectorProducer implements ExecutionStrategy.Producer
{
    private Set<SelectionKey> _keys = Collections.emptySet();
    private Iterator<SelectionKey> _cursor = Collections.emptyIterator();
 
    @Override
    public Runnable produce()
{
        while (true)
        {
            // 如果Channel集合中有I/O事件就緒,調(diào)用前面提到的Selectable接口獲取Runnable,直接返回給ExecutionStrategy去處理
            Runnable task = processSelected();
            if (task != null)
                return task;
             
           // 如果沒(méi)有I/O事件就緒,就干點(diǎn)雜活,看看有沒(méi)有客戶提交了更新Selector的任務(wù),就是上面提到的SelectorUpdate任務(wù)類(lèi)。
            processUpdates();
            updateKeys();
 
           // 繼續(xù)執(zhí)行select方法,偵測(cè)I/O就緒事件
            if (!select())
                return null;
        }
    }
 }

SelectorProducer 是 ManagedSelector 的內(nèi)部類(lèi)。

SelectorProducer 實(shí)現(xiàn)了 ExecutionStrategy 中的 Producer 接口中的 produce 方法,需要向 ExecutionStrategy 返回一個(gè) Runnable。

在 produce 方法中 SelectorProducer 主要干了三件事:

  1. 如果 Channel 集合中有 I/O 事件就緒,調(diào)用前面提到的 Selectable 接口獲取 Runnable,直接返回給
    ExecutionStrategy 處理。
  2. 如果沒(méi)有 I/O 事件就緒,就干點(diǎn)雜活,看看有沒(méi)有客戶提交了更新 Selector 上事件注冊(cè)的任務(wù),也就是上面提到的
    SelectorUpdate 任務(wù)類(lèi)。
  3. 干完雜活繼續(xù)執(zhí)行 select 方法,偵測(cè) I/O 就緒事件。

3.2 Jetty 的線程執(zhí)行策略

3.2.1 ProduceConsume(PC) 線程執(zhí)行策略

任務(wù)生產(chǎn)者自己依次生產(chǎn)和執(zhí)行任務(wù),對(duì)應(yīng)到 NIO 通信模型就是用一個(gè)線程來(lái)偵測(cè)和處理一個(gè) ManagedSelector 上的所有的 I/O 事件。

后面的 I/O 事件要等待前面的 I/O 事件處理完,效率明顯不高。


圖片


圖中,綠色代表生產(chǎn)一個(gè)任務(wù),藍(lán)色代表執(zhí)行這個(gè)任務(wù),下同。

3.2.2 ProduceExecuteConsume(PEC) 線程執(zhí)行策略

任務(wù)生產(chǎn)者開(kāi)啟新線程來(lái)執(zhí)行任務(wù),這是典型的 I/O 事件偵測(cè)和處理用不同的線程來(lái)處理。

缺點(diǎn)是不能利用 CPU 緩存,并且線程切換成本高。

圖片

圖中,棕色代表線程切換,下同。

3.2.3 ExecuteProduceConsume(EPC) 線程執(zhí)行策略

任務(wù)生產(chǎn)者自己運(yùn)行任務(wù),這種方式可能會(huì)新建一個(gè)新的線程來(lái)繼續(xù)生產(chǎn)和執(zhí)行任務(wù)。

它的優(yōu)點(diǎn)是能利用 CPU 緩存,但是潛在的問(wèn)題是如果處理 I/O 事件的業(yè)務(wù)代碼執(zhí)行時(shí)間過(guò)長(zhǎng),會(huì)導(dǎo)致線程大量阻塞和線程饑餓。

圖片

3.2.4 EatWhatYouKill(EWYK) 改良線程執(zhí)行策略

這是 Jetty 對(duì) ExecuteProduceConsume 策略的改良,在線程池線程充足的情況下等同于 ExecuteProduceConsume;

當(dāng)系統(tǒng)比較忙線程不夠時(shí),切換成 ProduceExecuteConsume 策略。

這么做的原因是:

ExecuteProduceConsume 是在同一線程執(zhí)行 I/O 事件的生產(chǎn)和消費(fèi),它使用的線程來(lái)自 Jetty 全局的線程池,這些線程有可能被業(yè)務(wù)代碼阻塞,如果阻塞的多了,全局線程池中線程自然就不夠用了,最壞的情況是連 I/O 事件的偵測(cè)都沒(méi)有線程可用了,會(huì)導(dǎo)致 Connector 拒絕瀏覽器請(qǐng)求。

于是 Jetty 做了一個(gè)優(yōu)化

在低線程情況下,就執(zhí)行

ProduceExecuteConsume 策略,I/O 偵測(cè)用專門(mén)的線程處理, I/O 事件的處理扔給線程池處理,其實(shí)就是放到線程池的隊(duì)列里慢慢處理。

四、總結(jié)

本文基于 Jetty-9 介紹了 ManagedSelector 和 ExecutionStrategy 的設(shè)計(jì)實(shí)現(xiàn),介紹了 PC、PEC、EPC 三種線程執(zhí)行策略的差異,從 Jetty 對(duì)線程執(zhí)行策略的改良操作中可以看出,Jetty 的線程執(zhí)行策略會(huì)優(yōu)先使用 EPC 使得生產(chǎn)和消費(fèi)任務(wù)能夠在同一個(gè)線程上運(yùn)行,這樣做可以充分利用熱緩存,避免調(diào)度延遲。

這給我們做性能優(yōu)化也提供了一些思路:

  1. 在保證不發(fā)生線程饑餓的情況下,盡量使用同一個(gè)線程生產(chǎn)和消費(fèi)可以充分利用 CPU 緩存,并減少線程切換的開(kāi)銷(xiāo)。
  2. 根據(jù)實(shí)際場(chǎng)景選擇最適合的執(zhí)行策略,通過(guò)組合多個(gè)子策略也可以揚(yáng)長(zhǎng)避短達(dá)到1+1>2的效果。

參考文檔:

  1. Class EatWhatYouKill
  2. Eat What You Kill
  3. Thread Starvation with Eat What You Kill
責(zé)任編輯:龐桂玉 來(lái)源: vivo互聯(lián)網(wǎng)技術(shù)
相關(guān)推薦

2009-07-16 09:54:44

LookupEventSwing線程

2024-12-02 10:04:04

2009-07-09 18:16:33

MyEclipse優(yōu)化

2014-08-13 10:41:08

linux線程

2011-10-13 09:44:49

MySQL

2011-05-30 10:36:49

MySQL

2009-08-21 11:31:59

異步和多線程的區(qū)別

2013-10-16 15:36:53

iOS優(yōu)化

2011-06-24 11:12:39

Qt 多線程 線程

2011-06-24 11:03:31

Qt 多線程 線程

2009-06-11 17:03:29

Java線程

2011-12-20 21:12:46

用戶體驗(yàn)

2010-07-14 09:01:07

架構(gòu)設(shè)計(jì)

2011-07-18 18:01:34

buffer cach

2009-07-11 10:47:15

綜合布線設(shè)計(jì)寫(xiě)字樓

2010-06-12 14:59:34

IBM工作負(fù)載

2022-03-02 11:13:50

Web前端開(kāi)發(fā)

2009-07-14 10:13:38

MyEclipse優(yōu)化

2009-10-16 10:20:37

Python的GIL

2009-07-03 17:18:34

Servlet多線程
點(diǎn)贊
收藏

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

一区二区视频在线免费| 97激碰免费视频| 91av视频免费观看| 欧美日韩色网| xnxx国产精品| 国产精品视频最多的网站| 九九这里只有精品视频| 国产一区二区在线视频你懂的| 粉嫩av一区二区三区免费野| 亚洲精品一区二区三区蜜桃久| 97在线播放免费观看| 欧美三级不卡| 一级做a爰片久久毛片美女图片| 五月婷婷之婷婷| 97人澡人人添人人爽欧美| 欧美激情一区二区三区不卡| av蓝导航精品导航| 精品久久久久久久久久久国产字幕| 91精品国产91久久久久久黑人| 亚洲激情在线观看| 91热视频在线观看| 成人福利视频| 亚洲一区欧美一区| 亚洲精品高清视频| 国产精品国产高清国产| 国产一区不卡在线| 国产精品高潮在线| 亚洲综合一二三| 五月婷婷亚洲| 一区二区在线视频| 亚洲一区二区乱码| 午夜视频一区二区在线观看| 色菇凉天天综合网| 国产一级爱c视频| av在线播放国产| 日本一区二区高清| 久久久亚洲综合网站| www精品国产| 精品一区二区在线免费观看| 热久久这里只有| 亚洲视频免费播放| 精品动漫3d一区二区三区免费| 丝袜亚洲欧美日韩综合| 蜜桃精品成人影片| 国内自拍欧美| 精品毛片乱码1区2区3区| 不用播放器的免费av| 成人黄色免费网站| 欧美专区日韩专区| 激情综合网俺也去| 日韩毛片免费观看| 91国产免费观看| 熟妇人妻va精品中文字幕 | 国产一区二区三区四区福利| 欧美xxxxx精品| 国产精品chinese在线观看| 欧美xxxx在线观看| 成年女人免费视频| 麻豆成人入口| 精品香蕉一区二区三区| 好吊日免费视频| 欧美自拍一区| 亚洲久久久久久久久久久| 日韩片在线观看| 亚洲区小说区图片区qvod按摩| 精品无人区太爽高潮在线播放| www.色天使| 免费看成人吃奶视频在线| 国内欧美日韩| 国产精品456| 91传媒在线免费观看| 精品国产av 无码一区二区三区| 麻豆91精品91久久久的内涵| 成人在线视频网| 国产人妻精品一区二区三| 国产大陆a不卡| 国产综合欧美在线看| 久久综合九色综合久| 国产欧美日韩另类视频免费观看 | 我要看一级黄色大片| 成人av集中营| 日韩一区二区三区精品视频| 中文字幕人妻熟女在线| 图片婷婷一区| www.日韩.com| 日韩激情一区二区三区| 久久午夜精品| 国产日韩欧美在线视频观看| www.亚洲天堂.com| 91麻豆视频网站| 一区二区三区精品国产| 日本电影在线观看| 日韩欧美国产视频| 免费网站在线观看黄| a级日韩大片| 日韩一区在线免费观看| 欧美va亚洲va香蕉在线| 国产精品久久久毛片| 欧美视频三区| 亚洲精品网址在线观看| 永久免费未视频| 伊人久久亚洲影院| 国产精品第二页| 亚洲美女综合网| 国产日韩高清在线| 激情六月天婷婷| 色资源二区在线视频| 欧美日韩视频在线观看一区二区三区| 超碰人人cao| 国产欧美日韩一区二区三区四区 | 亚洲最大福利视频网站| 四虎在线免费看| 亚洲视频免费看| 免费日韩视频在线观看| 亚洲精品黑牛一区二区三区| 亚洲视频视频在线| 久草中文在线视频| 久久成人麻豆午夜电影| 久久综合福利| 青草在线视频| 欧美日韩国产高清一区| 最新中文字幕视频| 欧美精品观看| 成人精品一区二区三区电影免费| 深夜福利在线看| 一区二区欧美视频| 亚洲理论中文字幕| 欧美男gay| 97超级碰在线看视频免费在线看 | 九九视频免费看| 美女诱惑一区二区| 欧美性bbwbbwbbwhd| 1区2区3区在线| 日韩欧美卡一卡二| 亚洲精品久久久久久国| 亚洲AV无码精品国产| 精品亚洲成a人| 日本一区高清不卡| xx欧美xxx| 亚洲精品动漫久久久久| 国产一级大片在线观看| 国产一区二区0| 欧美日韩一区二区三区电影| 国产精品麻豆成人av电影艾秋| 亚洲欧美福利视频| 可以在线观看av的网站| 成人高清视频免费观看| 久久人人爽人人爽人人av| 爱情电影网av一区二区| 日韩在线www| 国产一区二区三区视频免费观看| 国产精品色眯眯| 欧美婷婷精品激情| 久久亚洲专区| 成人黄色大片在线免费观看| 在线免费观看黄色| 欧美日韩亚洲综合一区| 天堂在线中文视频| 全国精品久久少妇| 少妇精品久久久久久久久久| 国产91欧美| 色妞一区二区三区| 国产三级漂亮女教师| 亚洲六月丁香色婷婷综合久久| 天天操天天干天天做| 亚洲成av人电影| 官网99热精品| 波多野结衣中文在线| 亚洲黄页视频免费观看| 尤物视频免费观看| 国产精品久久久久久久久果冻传媒| 色悠悠久久综合网| 亚洲人体av| 国产精品露出视频| 2022成人影院| 色先锋资源久久综合5566| 国产女人爽到高潮a毛片| 一区二区三区不卡在线观看| 亚洲第一黄色网址| 日韩vs国产vs欧美| 熟女熟妇伦久久影院毛片一区二区| 国产aⅴ精品一区二区四区| 欧美成人午夜影院| 午夜国产在线观看| av中文在线| 欧美性猛交99久久久久99按摩| 极品粉嫩小仙女高潮喷水久久| 久久久一二三| 在线电影看在线一区二区三区| 国产精品成人**免费视频| 欧美日韩成人网| 青青九九免费视频在线| 欧美美女激情18p| 日韩人妻无码一区二区三区99| 国产亚洲视频系列| 中文字幕第三区| 男人的天堂亚洲在线| 中文字幕一区二区三区四区五区 | 国产精品亚洲一区| 欧美黑人一区| 九九精品视频在线| 九色在线播放| 欧美成人女星排名| 最新中文字幕免费| 亚洲h动漫在线| 日本免费网站视频| 91欧美一区二区| a级大片免费看| 天堂在线亚洲视频| 国产精品videossex国产高清 | 亚洲欧美综合一区| 国产无遮挡裸体免费久久| 国产精品免费久久久久久| 92久久精品| 久久久99久久精品女同性| 日韩有码电影| 精品日韩一区二区三区| 夜夜躁很很躁日日躁麻豆| 岛国精品视频在线播放| 一区二区视频免费看| 日本一区二区三区免费乱视频| 中国黄色片视频| 狠狠久久亚洲欧美| 国产真人无码作爱视频免费| 999亚洲国产精| 日本一区二区三区四区五区六区| 三级毛片在线免费看| 国产一区美女| 欧美日韩最好看的视频| 第四色在线一区二区| 91久久综合亚洲鲁鲁五月天| 久久99久久99精品免观看软件| 97久久精品人人澡人人爽缅北| 国产调教视频在线观看| 中文字幕亚洲欧美日韩在线不卡| 视频国产一区二区三区| 精品不卡在线视频| 精品国产av一区二区| 欧美疯狂做受xxxx富婆| 青青国产在线视频| 欧美色图在线视频| 国产三级av片| 舔着乳尖日韩一区| 日本一区二区三区免费视频| 亚洲制服丝袜一区| 激情四射综合网| 一区二区三区四区五区视频在线观看| 久久久久久久麻豆| 亚洲欧美一区二区三区国产精品| 亚洲色图 激情小说| 国产精品你懂的在线欣赏| 久久精品无码一区| 欧美国产成人在线| 成人信息集中地| 国产精品国产三级国产普通话蜜臀| 欧美亚洲色综久久精品国产| 亚洲国产高清不卡| 制服丨自拍丨欧美丨动漫丨| 国产精品久久久久久妇女6080| 999福利视频| 亚洲视频小说图片| 国产一级二级毛片| 欧美日韩亚洲网| 中文字幕手机在线视频| 在线影视一区二区三区| 伊人网站在线观看| 7777女厕盗摄久久久| 国产av无码专区亚洲av麻豆| 欧美不卡一区二区三区| 天天摸夜夜添狠狠添婷婷| 精品免费av一区二区三区| 久久精品在线播放| 久久香蕉av| 97超碰国产精品女人人人爽| 日韩中文在线播放| 91亚洲精品久久久| 欧美韩一区二区| 欧美一区二区综合| 亚洲精品成人影院| 欧美日本视频在线观看| 青娱乐精品视频| 性生活一级大片| 91在线码无精品| 免费观看特级毛片| 亚洲一二三四在线观看| 黄色一级视频免费看| 欧美日韩精品久久久| 精品久久国产视频| 亚洲欧美国产精品久久久久久久 | 99久久综合国产精品| 伊人网在线视频观看| 亚洲欧美综合网| 日本三级欧美三级| 在线区一区二视频| 国产suv精品一区二区69| 日韩精品黄色网| 青青影院在线观看| 97免费视频在线播放| 欧美成人毛片| 国模精品一区二区三区| 国产精品久久久久久麻豆一区软件 | 欧美中文在线观看国产| 亚洲伦理一区二区| 免费观看国产成人| 综合激情一区| 欧美一级黄色片视频| 国产精品亚洲综合一区在线观看| 少妇精品一区二区三区| 亚洲精品视频在线观看网站| 成人h动漫精品一区二区下载 | 香蕉网在线视频| 久久久久久麻豆| 久久亚洲成人av| 在线成人高清不卡| 九色蝌蚪在线| 国a精品视频大全| japansex久久高清精品| 日韩欧美国产二区| 99视频一区| 黑人无套内谢中国美女| 国产精品久久久久一区二区三区共| 午夜精品三级久久久有码| 日韩欧美精品在线| 最新97超碰在线| 日韩免费在线免费观看| 日韩精品导航| 青青青在线视频播放| 国产成人自拍网| 成人免费毛片xxx| 欧美婷婷六月丁香综合色| 午夜福利一区二区三区| 午夜欧美大片免费观看| 精品国产鲁一鲁****| 亚洲一区三区电影在线观看| 爽好久久久欧美精品| 日本少妇色视频| 福利视频导航一区| 男人天堂综合网| 久久久久久久久电影| 亚洲国产欧美国产第一区| 国产欧美综合一区| 国产在线精品一区二区三区不卡| 最新日韩免费视频| 欧美三级中文字幕在线观看| 成人不用播放器| 国产97在线播放| 成人情趣视频网站| 久久精品影视大全| 中文字幕av一区 二区| 成年人视频免费| 一色桃子一区二区| 成人免费一区| 中文字幕在线中文字幕日亚韩一区| 另类调教123区| 小泽玛利亚一区| 欧美一区二区在线免费播放| 国产精品扒开做爽爽爽的视频| 成人黄色片在线| 中文字幕日韩一区二区不卡 | 婷婷在线精品视频| 666欧美在线视频| 在线黄色网页| 国产伦精品一区二区三区视频免费 | 91久久久久久白丝白浆欲热蜜臀| 婷婷精品国产一区二区三区日韩| 日本aⅴ精品一区二区三区| 成人黄色短视频| 日韩视频永久免费| 高清视频在线观看三级| 欧美午夜精品久久久久免费视 | 欧美电影一二区| 三上悠亚 电影| 五月婷婷色综合| 国产女人在线观看| 成人性生交大片免费观看嘿嘿视频| 欧美激情日韩| 国产乱了高清露脸对白| 欧美主播一区二区三区美女| 九七电影韩国女主播在线观看| 丁香婷婷久久久综合精品国产| 亚洲永久字幕| 老司机深夜福利网站| 欧美不卡一区二区| 美女写真久久影院| 午夜久久久久久久久久久| 不卡一区中文字幕| 中文字幕av网站| 久久久久久久久久久人体| 色综合综合网| 国产裸体视频网站| 色婷婷av一区二区三区大白胸| 麻豆视频在线观看免费网站| 狠狠色噜噜狠狠色综合久| 日本中文一区二区三区| 国产亚洲成人av| 自拍视频国产精品| 牛牛精品成人免费视频| 色婷婷.com| 久久免费电影| 91久久久国产精品|