精品欧美一区二区三区在线观看 _久久久久国色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)

日韩一区二区三区在线视频| 综合在线观看色| 欧日韩在线观看| 最新中文字幕av| 欧美一区一区| 色婷婷久久综合| 国产日韩视频在线播放| 蜜臀av免费在线观看| 视频在线观看一区| 色综合视频一区中文字幕| 中文字幕5566| 精品视频一区二区三区在线观看 | 欧美88888| 精品欧美午夜寂寞影院| 欧美性猛交xxxxxx富婆| 男人添女人荫蒂免费视频| yourporn在线观看视频| 国产成人免费av在线| 国产精品偷伦免费视频观看的| 九九九在线视频| 成人羞羞视频在线看网址| 精品国产99国产精品| 97超碰人人爽| 欧美动物xxx| 亚洲国产中文字幕在线视频综合 | 91黄色免费看| av女优在线播放| 国产欧美久久久久久久久| 91片黄在线观看| 99热最新在线| 97成人免费视频| 丝袜亚洲另类丝袜在线| 性欧美xxxx| 一区视频免费观看| 色爱综合网欧美| 亚洲亚裔videos黑人hd| 一级欧美一级日韩片| 天堂精品在线视频| 欧美久久一区二区| 国产又大又黄又粗又爽| 国产成人精品123区免费视频| 亚洲成人一二三| 久久久国内精品| 成码无人av片在线观看网站| 亚洲欧美在线观看| 亚洲蜜桃在线| 日本美女高清在线观看免费| 欧美激情在线一区二区三区| 日韩福利一区二区三区| 国产在线你懂得| 久久久精品2019中文字幕之3| 久久精品aaaaaa毛片| 香蕉国产在线视频| www.99精品| 精品综合久久久| 欧美日韩在线精品一区二区三区激情综| 岛国一区二区在线观看| 国产精品播放| 色综合视频在线| 成人激情校园春色| 国产一区二区三区无遮挡| 日本精品一二区| 99精品国产一区二区三区不卡 | 欧美日韩激情| 色小说视频一区| 九九热视频在线免费观看| 五月激情久久久| 欧美激情亚洲自拍| 激情五月色婷婷| 久久精品一区二区国产| 国产精品久久久久久久久久新婚| 中文在线观看av| 精品系列免费在线观看| 99精品国产高清一区二区| 亚洲免费成人在线| 91色九色蝌蚪| 在线看成人av电影| 丝袜在线观看| 狠狠躁18三区二区一区| 黄大色黄女片18第一次| 日本精品在线播放 | 91免费的视频在线播放| 亚洲黄色精品视频| 26uuu国产日韩综合| 视频一区二区在线观看| 色av手机在线| 一本色道久久综合狠狠躁的推荐| 国产又大又黄又猛| 91精品国产乱码久久久竹菊| 亚洲美女久久久| 内射一区二区三区| 亚洲免费观看| 国产精品亚洲一区二区三区| 午夜精品在线播放| 97久久精品人人澡人人爽| 日本一区美女| 1区2区3区在线视频| 欧美日韩裸体免费视频| 一级黄色在线播放| 首页亚洲中字| 久久成人精品视频| 国产www在线| 国产麻豆精品theporn| 精品国产一区二区三| 中文字幕日本在线| 精品国产福利在线| 天天摸天天舔天天操| 神马久久影院| 欧美黑人一区二区三区| 一本大道伊人av久久综合| a级精品国产片在线观看| 亚洲欧洲精品一区二区三区波多野1战4 | 熟女视频一区二区三区| 国产精品一区二区av影院萌芽| 欧美一区日韩一区| jizz中文字幕| 亚洲综合精品四区| 大波视频国产精品久久| 日韩理伦片在线| 日韩欧美主播在线| 久久久久亚洲AV成人网人人小说| 日韩在线精品| 欧美整片在线观看| 成人免费公开视频| 18欧美亚洲精品| 三级在线视频观看| 亚洲春色h网| 97精品免费视频| 高清毛片aaaaaaaaa片| 18欧美亚洲精品| 777视频在线| 禁果av一区二区三区| 97视频在线观看亚洲| 亚洲国产综合网| 一区二区欧美精品| 欧美69精品久久久久久不卡| 婷婷久久综合| 国产有码一区二区| 一广人看www在线观看免费视频| 91精品1区2区| 日本美女xxx| 日本在线不卡视频| 午夜精品一区二区在线观看的| 黑人巨大亚洲一区二区久| 国产丝袜一区二区| 无码人妻av一区二区三区波多野| 26uuu精品一区二区三区四区在线| 国产黄页在线观看| 久久精品论坛| 欧美诱惑福利视频| 免费国产在线观看| 日本丰满少妇一区二区三区| 国产ts丝袜人妖系列视频 | 啪啪国产精品| 国语自产精品视频在线看| 欧美亚洲精品在线观看| 亚洲成人1区2区| 一级国产黄色片| 性久久久久久| 日本欧洲国产一区二区| 国产91欧美| 久久精品国产亚洲一区二区| av网站免费大全| 亚洲大片精品永久免费| 中文字幕日韩三级片| 另类图片国产| 一区二区三区四区国产| **日韩最新| 欧美精品久久久久久久| 香港一级纯黄大片| 欧洲av一区二区嗯嗯嗯啊| 亚洲a∨无码无在线观看| 激情综合色综合久久| 成人免费看片'免费看| 久久这里只有精品一区二区| 国产精品wwww| 动漫一区在线| 日韩久久精品成人| 在线播放成人av| 一区二区三区日韩| 日本免费福利视频| 久久精品国产99久久6| 999久久欧美人妻一区二区| 四虎5151久久欧美毛片| 成人a在线视频| www成人免费观看| 色偷偷亚洲男人天堂| 黑人精品一区二区三区| 欧美在线免费播放| 中国一级片在线观看| www.欧美日韩| 久久精品一卡二卡| 亚洲欧美日韩专区| 影音先锋成人资源网站| 羞羞答答一区二区| 成人www视频在线观看| a国产在线视频| 色吧影院999| 午夜性色福利影院| 欧美一级在线视频| 日本精品入口免费视频| 亚洲尤物视频在线| 91无套直看片红桃在线观看| 99视频有精品| www.久久久久久久久久久| 国产亚洲精品bv在线观看| 中文精品视频一区二区在线观看| 免费看久久久| 97久久天天综合色天天综合色hd| 性高爱久久久久久久久| 欧美黑人xxxⅹ高潮交| 欧美13一16娇小xxxx| 亚洲精品456在线播放狼人| av小说天堂网| 欧美挠脚心视频网站| 手机av免费观看| 午夜国产不卡在线观看视频| 国产精品久久久久久久久免费看 | 亚洲国产午夜| 日韩欧美一区二区视频在线播放| 免费欧美网站| 国产免费亚洲高清| 另类图片综合电影| 欧美精品成人91久久久久久久| 在线视频自拍| 国产亚洲成精品久久| 色婷婷av一区二区三区之e本道| 欧美精品欧美精品系列| 99成人精品视频| 精品国产成人在线| 久久久精品人妻一区二区三区四 | 91九色综合| 日本成人免费在线| 国产拍在线视频| 欧美激情一二三| 激情av在线| 欧美乱大交xxxxx| 男人影院在线观看| 中文字幕国产日韩| 国产中文字幕在线播放| 日韩久久精品电影| 天天干天天操av| 亚洲白拍色综合图区| 精品人妻伦一区二区三区久久| 欧美色爱综合网| 奴色虐av一区二区三区| 色婷婷精品大在线视频| 亚洲免费在线视频观看| 疯狂蹂躏欧美一区二区精品| 波多野结衣国产| 韩曰欧美视频免费观看| youjizz在线视频| 一本一本大道香蕉久在线精品| 69xxxx国产| 欧美色大人视频| 国产乱人乱偷精品视频| 欧美一区午夜视频在线观看| 性欧美一区二区三区| 日韩视频一区二区三区在线播放| 国产熟女一区二区三区四区| 欧美大片日本大片免费观看| 亚洲精品一区二区三区四区| 亚洲国产精品免费| 青青草av免费在线观看| 亚洲日韩中文字幕| 91高清在线| 欧美成人在线免费| free性护士videos欧美| 欧美一区二区大胆人体摄影专业网站| 自拍偷拍欧美视频| 国产精品网红直播| 看亚洲a级一级毛片| 国产精品视频免费一区| 欧美日韩一区二区三区四区不卡| 日本精品二区| 亚洲网色网站| 欧美网站免费观看| 日本视频免费一区| 免费看的av网站| 91啪九色porn原创视频在线观看| 欧美黄色一级生活片| 最新成人av在线| 日本在线观看中文字幕| 在线精品观看国产| 99国产在线播放| 亚洲激情成人网| av播放在线观看| 欧美日韩成人免费| 桃花岛tv亚洲品质| 91久热免费在线视频| 欧美成a人免费观看久久| 视频一区在线免费观看| 午夜欧美精品久久久久久久| 丝袜老师办公室里做好紧好爽| 久久av中文字幕片| 国产十八熟妇av成人一区| 欧美国产激情二区三区| 久久精品国产av一区二区三区| 欧美自拍偷拍一区| 成人毛片视频免费看| 日韩中文第一页| 九色porny自拍视频在线播放 | 久久久久久香蕉| 国产成人午夜精品5599 | 天天综合天天色| 久久精品亚洲精品| 欧美黄色网页| 国产a一区二区| 国产精品一区二区av交换| 免费看欧美黑人毛片| 美腿丝袜在线亚洲一区| 国产亚洲无码精品| 亚洲精品国产精品乱码不99| 欧美 亚洲 另类 激情 另类 | 捆绑凌虐一区二区三区| 中文字幕在线不卡一区二区三区 | 亚洲中字在线| www.555国产精品免费| 亚洲欧洲成人自拍| 免费黄色片视频| 亚洲精品久久久一区二区三区| 久久久久久国产精品免费无遮挡 | 在线视频免费观看一区| 日韩电影中文字幕一区| 四虎影院观看视频在线观看| 成人在线中文字幕| 第九色区aⅴ天堂久久香| 国内外成人免费激情视频| 不卡电影一区二区三区| 欧美爱爱小视频| 欧美一级生活片| 777电影在线观看| 国产精品扒开腿做爽爽爽视频| 国产精品x8x8一区二区| 欧美中日韩在线| 国产福利一区在线| 欧美日韩中文字幕在线观看| 日韩一区二区在线观看| 国产成人l区| 51国偷自产一区二区三区的来源| 国产电影一区二区在线观看| 精品亚洲一区二区三区四区| 国产精品丝袜一区| 亚洲第一区av| 最近2019年好看中文字幕视频 | 国产在线免费av| 欧美性xxxxx极品少妇| 国产精品一区二区三区四区色| 日本成人黄色片| 欧美另类69xxxxx| 五月婷婷之综合激情| 欧美国产精品劲爆| 中文字幕乱伦视频| 在线午夜精品自拍| 欧美日韩破处视频| 中文字幕中文字幕99| 国产一区视频导航| 免费在线观看国产精品| 亚洲福利视频二区| 女厕盗摄一区二区三区| 久久久久资源| 日本亚洲三级在线| 好吊日在线视频| 欧美成人一区二区| 国产直播在线| 欧美一区二区高清在线观看| 免费一级片91| 欧美做爰爽爽爽爽爽爽| 欧美va亚洲va国产综合| 17videosex性欧美| 免费av在线一区二区| 青青草国产精品97视觉盛宴| 天堂а√在线中文在线鲁大师| 欧美一级午夜免费电影| 色在线中文字幕| 婷婷四月色综合| 国产丶欧美丶日本不卡视频| 欧美三日本三级少妇99| 亚洲色图av在线| 精品视频在线一区| av免费观看大全| 中国色在线观看另类| 99久久精品国产色欲| 久久久久久欧美| 欧美亚洲国产精品久久| 在线播放黄色av| 欧美色视频日本版| 黄色网页在线播放| 国产专区一区二区| 日av在线不卡| 国产主播在线观看| 亚洲色图色老头| 日韩精品久久久久久久软件91 | 精品在线一区二区三区| 日本少妇在线观看| 中文字幕日韩欧美在线视频| 一区二区三区四区精品视频| 国产一级片黄色| 亚洲一区二区精品视频| 91大神xh98hx在线播放|