亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Netty NIO核心組件詳解:Buffer、Channel、Selector原理與實(shí)戰(zhàn)

Netty NIO核心組件詳解:Buffer、Channel、Selector原理與實(shí)戰(zhàn) 1. 從一次線上故障說起為什么我要回頭啃Netty的NIO底座前兩年我接手過一個(gè)即時(shí)通訊服務(wù)的性能優(yōu)化項(xiàng)目單機(jī)壓測(cè)的時(shí)候QPS死活上不去CPU占用率卻高得離譜。當(dāng)時(shí)第一反應(yīng)是業(yè)務(wù)代碼寫得有問題排查了一圈發(fā)現(xiàn)線程池配置、鎖競(jìng)爭(zhēng)、序列化都沒毛病。最后用火焰圖一照大量時(shí)間耗在了傳統(tǒng)阻塞IO的線程上下文切換上。那一刻我才真正意識(shí)到很多人用Netty只是停留在“會(huì)調(diào)API”的層面對(duì)底層的Buffer、Channel、Selector這三件套的理解其實(shí)是模糊的。而恰恰是這三個(gè)組件決定了Netty為什么能扛住高并發(fā)。這篇文章我想把Netty的NIO核心組件徹底講透。不是那種照著源碼念一遍的講法而是結(jié)合我自己踩過的坑、調(diào)過的參數(shù)、看過的線上數(shù)據(jù)把Buffer、Channel、Selector這三個(gè)東西的來龍去脈、設(shè)計(jì)取舍、實(shí)操要點(diǎn)全部攤開。適合已經(jīng)用過Netty但對(duì)底層一知半解的開發(fā)者也適合剛接觸NIO、想搞清楚“為什么不用傳統(tǒng)IO”的朋友。讀完你至少能做到知道每個(gè)組件解決什么問題、參數(shù)怎么調(diào)、坑在哪里、出問題怎么排查。2. NIO三件套的整體設(shè)計(jì)思路拆解2.1 為什么傳統(tǒng)BIO在高并發(fā)場(chǎng)景下必然吃力要理解NIO的價(jià)值得先看清楚BIO的問題在哪。傳統(tǒng)阻塞IO的模型是一個(gè)線程對(duì)應(yīng)一個(gè)連接read操作沒數(shù)據(jù)就卡在那里等accept沒新連接也卡著等。這個(gè)模型在連接數(shù)少的時(shí)候很直觀代碼也好寫。但連接數(shù)一上來比如同時(shí)維持幾千個(gè)連接你就得開幾千個(gè)線程。每個(gè)線程占1MB左右的棧空間光內(nèi)存就吃掉幾個(gè)G更別說線程切換的開銷了。我實(shí)測(cè)過一個(gè)簡(jiǎn)單的Echo服務(wù)BIO模型在500并發(fā)連接時(shí)上下文切換次數(shù)每秒能到幾萬次CPU的sy系統(tǒng)態(tài)占比超過40%。這就是典型的“線程比活還多”的浪費(fèi)。NIO的核心思路是把“等待”這件事從線程身上剝離出來交給操作系統(tǒng)的一個(gè)機(jī)制去統(tǒng)一管理這個(gè)機(jī)制就是IO多路復(fù)用而Selector就是Java層面對(duì)它的封裝。2.2 Buffer、Channel、Selector三者的協(xié)作關(guān)系這三個(gè)組件不是孤立的它們構(gòu)成了一個(gè)完整的數(shù)據(jù)流轉(zhuǎn)閉環(huán)。我用一個(gè)生活化的類比來解釋把Channel想象成一條快遞管道數(shù)據(jù)是包裹Buffer是你家門口的快遞柜包裹必須先放進(jìn)柜子你才能取Selector則是小區(qū)門口的保安他同時(shí)盯著幾百條管道哪條管道有包裹到了就通知你去對(duì)應(yīng)的柜子取。具體到數(shù)據(jù)流客戶端發(fā)來的數(shù)據(jù)操作系統(tǒng)先讀到內(nèi)核緩沖區(qū)然后通過Channel“搬運(yùn)”到用戶態(tài)的Buffer里你從Buffer里讀數(shù)據(jù)做業(yè)務(wù)處理。反過來寫數(shù)據(jù)時(shí)你把數(shù)據(jù)寫進(jìn)Buffer再通過Channel刷出去。Selector的作用是讓你一個(gè)線程就能監(jiān)控多個(gè)Channel的就緒狀態(tài)不用為每個(gè)Channel開一個(gè)線程去死等。這個(gè)協(xié)作關(guān)系是理解整個(gè)NIO的鑰匙后面所有的細(xì)節(jié)都是圍繞它展開的。2.3 Netty在這三者之上做了什么增強(qiáng)原生JDK的NIO API其實(shí)挺難用的Buffer的flip、rewind、clear這幾個(gè)方法經(jīng)常把人繞暈Selector的空輪詢bug也是出了名的。Netty沒有直接用JDK的ByteBuffer而是自己實(shí)現(xiàn)了ByteBuf把讀寫指針分離讀的時(shí)候不用flip寫的時(shí)候自動(dòng)擴(kuò)容還支持池化復(fù)用。Channel方面Netty抽象出了ChannelPipeline和ChannelHandler把數(shù)據(jù)流轉(zhuǎn)變成了一條責(zé)任鏈。Selector這塊Netty用EventLoop把Selector的輪詢和任務(wù)執(zhí)行整合在一起還通過反射替換了Selector的實(shí)現(xiàn)來規(guī)避空輪詢問題。所以學(xué)Netty的NIO組件我的建議是分兩層看先搞懂JDK原生NIO的Buffer、Channel、Selector各自是什么、怎么用再看Netty在它們基礎(chǔ)上做了哪些封裝和優(yōu)化。跳過第一層直接看Netty很多設(shè)計(jì)你會(huì)覺得莫名其妙只停留在第一層又用不好Netty。下面我按這個(gè)思路逐個(gè)拆。3. Buffer詳解數(shù)據(jù)的中轉(zhuǎn)站到底怎么用3.1 Buffer的核心屬性與讀寫模式切換Buffer本質(zhì)上就是一塊內(nèi)存區(qū)域但它比普通數(shù)組多了幾個(gè)關(guān)鍵屬性capacity容量、position當(dāng)前位置、limit限制位、mark標(biāo)記位。這四個(gè)屬性的組合決定了Buffer當(dāng)前處于什么狀態(tài)。capacity是固定的創(chuàng)建時(shí)就定死了position表示下一個(gè)要讀或?qū)懙奈恢胠imit表示讀或?qū)懙倪吔鏼ark是臨時(shí)記錄position用的。新手最容易懵的是讀寫模式的切換。你往Buffer里寫數(shù)據(jù)時(shí)position不斷后移limit等于capacity。寫完之后要讀必須調(diào)用flip()這個(gè)方法把limit設(shè)為當(dāng)前position然后把position歸零。讀完數(shù)據(jù)要重新寫調(diào)用clear()position歸零limit恢復(fù)為capacity。如果只讀了一部分想重讀用rewind()position歸零但limit不動(dòng)。我見過太多人因?yàn)橥薴lip導(dǎo)致讀不到數(shù)據(jù)或者讀完之后沒clear導(dǎo)致下次寫入位置錯(cuò)亂。記住一個(gè)口訣寫轉(zhuǎn)讀用flip讀完重寫用clear重讀一遍用rewind。這三個(gè)方法搞清楚了Buffer就掌握了一半。3.2 堆內(nèi)內(nèi)存與堆外內(nèi)存的選擇邏輯ByteBuffer.allocate()分配的是堆內(nèi)內(nèi)存allocateDirect()分配的是堆外內(nèi)存。這兩者的區(qū)別不是紙面上的概念而是直接影響性能的。堆內(nèi)內(nèi)存的讀寫就是操作Java對(duì)象速度快但要做IO操作時(shí)JVM需要把數(shù)據(jù)從堆內(nèi)拷貝到堆外多了一次拷貝。堆外內(nèi)存可以直接被操作系統(tǒng)訪問省掉了這次拷貝但分配和回收的成本高而且不受JVM堆管理用不好容易內(nèi)存泄漏。我的經(jīng)驗(yàn)是頻繁創(chuàng)建銷毀的小Buffer用堆內(nèi)長(zhǎng)期復(fù)用的大Buffer用堆外。Netty默認(rèn)用PooledByteBufAllocator底層就是池化的堆外內(nèi)存通過內(nèi)存池復(fù)用來抵消分配成本。如果你自己寫NIO代碼建議對(duì)大的、生命周期長(zhǎng)的Buffer用DirectByteBuffer并且一定要手動(dòng)復(fù)用不要每次new。注意DirectByteBuffer的回收依賴GC如果分配速度超過回收速度會(huì)觸發(fā)Full GC嚴(yán)重時(shí)直接OOM。生產(chǎn)環(huán)境一定要限制堆外內(nèi)存大小通過-XX:MaxDirectMemorySize參數(shù)控制。3.3 Netty ByteBuf的讀寫指針分離設(shè)計(jì)Netty的ByteBuf把讀指針和寫指針分開了readerIndex和writerIndex各管各的讀的時(shí)候不用flip寫的時(shí)候也不用clear。這個(gè)設(shè)計(jì)看起來只是省了幾個(gè)方法調(diào)用實(shí)際上解決了一個(gè)大問題讀寫可以交錯(cuò)進(jìn)行不需要頻繁切換模式。比如你在解碼一個(gè)協(xié)議包的時(shí)候可能需要先讀頭部判斷長(zhǎng)度再讀body中間還可能回退幾個(gè)字節(jié)重新讀用JDK的ByteBuffer做這些操作會(huì)非常別扭。ByteBuf還支持動(dòng)態(tài)擴(kuò)容寫滿了自動(dòng)擴(kuò)默認(rèn)最大到Integer.MAX_VALUE。它還提供了slice()、duplicate()、retainedSlice()等零拷貝的視圖方法可以在不復(fù)制數(shù)據(jù)的情況下操作部分內(nèi)容。這些特性讓Netty在處理粘包拆包、協(xié)議解析時(shí)非常順手。3.4 Buffer使用中的常見陷阱與實(shí)操建議第一個(gè)坑是忘記考慮字節(jié)序。JDK的ByteBuffer默認(rèn)是大端序Big EndianNetty的ByteBuf默認(rèn)也是大端。但有些協(xié)議用的是小端序讀出來的數(shù)字會(huì)完全不對(duì)。解決辦法是顯式調(diào)用order(ByteOrder.LITTLE_ENDIAN)切換。第二個(gè)坑是Buffer復(fù)用時(shí)的狀態(tài)殘留。如果你把Buffer放進(jìn)對(duì)象池復(fù)用下次取出來之前一定要clear()或者至少把position和limit重置否則殘留的mark或者limit會(huì)導(dǎo)致詭異的問題。我遇到過一次線上事故就是因?yàn)閺?fù)用的Buffer沒有重置mark導(dǎo)致某次讀取時(shí)回退到了錯(cuò)誤的位置解析出來的數(shù)據(jù)錯(cuò)位。第三個(gè)坑是DirectBuffer的監(jiān)控。堆外內(nèi)存不歸JVM堆管常規(guī)的堆監(jiān)控看不到。建議用Netty自帶的PlatformDependent工具類或者JMX來監(jiān)控堆外內(nèi)存使用量設(shè)置合理的告警閾值。4. Channel詳解數(shù)據(jù)通道的抽象與實(shí)現(xiàn)4.1 Channel的核心接口與生命周期Channel在NIO里代表一個(gè)連接可以是網(wǎng)絡(luò)連接的SocketChannel也可以是文件操作的FileChannel。它的核心方法就幾個(gè)read(ByteBuffer)、write(ByteBuffer)、close()、isOpen()。但就是這幾個(gè)方法配合Selector使用的時(shí)候有很多講究。Channel有四種狀態(tài)open、connected、closed、registered。open表示通道創(chuàng)建了connected表示連接建立了對(duì)SocketChannel而言closed表示關(guān)閉了registered表示注冊(cè)到了某個(gè)Selector上。這四個(gè)狀態(tài)的轉(zhuǎn)換順序和時(shí)機(jī)直接決定了你的事件處理邏輯是否正確。比如你收到一個(gè)read事件但Channel可能已經(jīng)處于半關(guān)閉狀態(tài)了這時(shí)候讀操作會(huì)返回-1你得正確處理這個(gè)返回值不能當(dāng)成正常數(shù)據(jù)。4.2 ServerSocketChannel與SocketChannel的分工服務(wù)端啟動(dòng)的時(shí)候先創(chuàng)建一個(gè)ServerSocketChannel綁定端口注冊(cè)到Selector上監(jiān)聽ACCEPT事件。當(dāng)有客戶端連接進(jìn)來accept()方法返回一個(gè)SocketChannel這個(gè)SocketChannel代表和這個(gè)客戶端的連接再把它注冊(cè)到Selector上監(jiān)聽READ事件。之后這個(gè)連接上的數(shù)據(jù)讀寫都通過這個(gè)SocketChannel進(jìn)行。這里有個(gè)容易忽略的點(diǎn)accept返回的SocketChannel默認(rèn)是阻塞的必須顯式調(diào)用configureBlocking(false)設(shè)為非阻塞否則注冊(cè)到Selector上會(huì)直接拋異常。我見過好幾個(gè)新手卡在這里報(bào)錯(cuò)信息又不直觀排查半天。另外ServerSocketChannel可以同時(shí)注冊(cè)到多個(gè)Selector上嗎答案是可以但一般沒必要。一個(gè)Selector負(fù)責(zé)accept多個(gè)Selector負(fù)責(zé)讀寫這是主從Reactor模式的基礎(chǔ)Netty的bossGroup和workerGroup就是這么分工的。4.3 Channel的注冊(cè)機(jī)制與SelectionKeyChannel注冊(cè)到Selector上會(huì)返回一個(gè)SelectionKey這個(gè)Key是Channel和Selector之間的紐帶。Key上可以附加一個(gè)Attachment對(duì)象通常用來存這個(gè)Channel對(duì)應(yīng)的會(huì)話狀態(tài)、緩沖區(qū)等。Netty里就是把Channel本身作為Attachment存進(jìn)去這樣事件觸發(fā)時(shí)能直接拿到Channel。SelectionKey有四個(gè)常量表示感興趣的事件OP_READ、OP_WRITE、OP_CONNECT、OP_ACCEPT。你可以用位運(yùn)算組合多個(gè)事件。比如key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE)。但要注意OP_WRITE大多數(shù)時(shí)候都是就緒的因?yàn)橹灰l(fā)送緩沖區(qū)有空位就可以寫。如果你一直注冊(cè)著OP_WRITESelector會(huì)一直返回這個(gè)事件導(dǎo)致CPU空轉(zhuǎn)。正確的做法是需要寫的時(shí)候才注冊(cè)O(shè)P_WRITE寫完立刻取消。4.4 Netty Channel的增強(qiáng)Pipeline與Handler機(jī)制Netty的Channel比JDK的Channel復(fù)雜得多它內(nèi)部綁定了一條ChannelPipelinePipeline上掛了一串ChannelHandler。數(shù)據(jù)進(jìn)來先經(jīng)過入站Handler鏈出去經(jīng)過出站Handler鏈。這個(gè)設(shè)計(jì)把網(wǎng)絡(luò)層的字節(jié)流處理和業(yè)務(wù)層的邏輯處理徹底解耦了。舉個(gè)例子一個(gè)典型的服務(wù)端Pipeline可能是這樣的ByteToMessageDecoder把字節(jié)流解碼成消息對(duì)象- IdleStateHandler檢測(cè)空閑連接- 業(yè)務(wù)Handler處理具體請(qǐng)求。每個(gè)Handler只關(guān)心自己的事職責(zé)單一組合靈活。這種設(shè)計(jì)比在JDK NIO里寫一個(gè)大大的if-else要優(yōu)雅得多也更容易維護(hù)和測(cè)試。4.5 Channel使用中的性能考量與注意事項(xiàng)第一個(gè)注意點(diǎn)是Channel的關(guān)閉要優(yōu)雅。直接close()可能會(huì)導(dǎo)致發(fā)送緩沖區(qū)里的數(shù)據(jù)丟失。正確的做法是先shutdownOutput()等對(duì)方讀完再關(guān)閉。Netty提供了ChannelFuture和closeFuture來支持異步關(guān)閉可以注冊(cè)監(jiān)聽器在關(guān)閉完成后做清理。第二個(gè)注意點(diǎn)是寫操作的背壓?jiǎn)栴}。如果對(duì)方接收慢你的發(fā)送緩沖區(qū)會(huì)堆積最終導(dǎo)致OOM。Netty通過Channel.isWritable()和寫緩沖區(qū)水位線WRITE_BUFFER_WATER_MARK來感知背壓你可以在寫之前判斷isWritable不可寫的時(shí)候暫停發(fā)送等channelWritabilityChanged回調(diào)再繼續(xù)。第三個(gè)注意點(diǎn)是Channel是線程安全的嗎JDK的SocketChannel本身不是線程安全的多個(gè)線程同時(shí)讀寫會(huì)出問題。Netty的Channel通過EventLoop保證了所有IO操作都在同一個(gè)線程上執(zhí)行所以你不需要加鎖但也不能在Handler里做耗時(shí)操作否則會(huì)阻塞整個(gè)EventLoop上的其他Channel。5. Selector詳解多路復(fù)用的核心引擎5.1 Selector的工作原理與IO多路復(fù)用模型Selector的本質(zhì)是操作系統(tǒng)提供的IO多路復(fù)用機(jī)制的Java封裝。在Linux上底層是epoll在Windows上是IOCP的模擬在Mac上是kqueue。它的工作方式是你把多個(gè)Channel注冊(cè)到Selector上然后調(diào)用select()方法這個(gè)方法會(huì)阻塞直到至少有一個(gè)Channel就緒或者超時(shí)或者被喚醒。返回后你遍歷selectedKeys()拿到就緒的Channel逐個(gè)處理。這個(gè)模型的核心優(yōu)勢(shì)是一個(gè)線程管理多個(gè)連接。假設(shè)你有10000個(gè)連接但同一時(shí)刻只有100個(gè)有數(shù)據(jù)可讀那么用Selector的話一個(gè)線程輪詢一次就能找到這100個(gè)處理完繼續(xù)輪詢。而BIO模型下10000個(gè)線程都在阻塞等待只有100個(gè)有活干其余9900個(gè)都在浪費(fèi)資源。5.2 select、poll、epoll的差異與選擇這三個(gè)是Linux下IO多路復(fù)用的三種實(shí)現(xiàn)。select和poll的區(qū)別不大都是把文件描述符集合從用戶態(tài)拷貝到內(nèi)核態(tài)然后內(nèi)核遍歷檢查。它們的瓶頸在于文件描述符數(shù)量有限制select默認(rèn)1024每次調(diào)用都要全量拷貝和遍歷連接數(shù)多了性能急劇下降。epoll解決了這些問題它用紅黑樹管理文件描述符不需要每次全量拷貝用就緒鏈表存儲(chǔ)就緒的事件不需要全量遍歷沒有文件描述符數(shù)量限制。所以高并發(fā)場(chǎng)景下epoll是絕對(duì)的首選。JDK在Linux上默認(rèn)就是用epoll你可以通過-Djava.nio.channels.spi.SelectorProvider參數(shù)查看或指定。5.3 Selector的空輪詢問題與Netty的解決方案JDK的Selector有一個(gè)著名的空輪詢bug在某些情況下select()方法會(huì)立即返回但selectedKeys()是空的沒有任何就緒的Channel。如果代碼里沒有正確處理這種情況就會(huì)陷入死循環(huán)CPU直接飆到100%。這個(gè)bug在JDK 6u4到JDK 7u4之間比較嚴(yán)重后來雖然修了但在某些內(nèi)核版本和特定場(chǎng)景下仍會(huì)出現(xiàn)。Netty的解決方案很巧妙它在NioEventLoop里記錄了select操作的次數(shù)和耗時(shí)如果發(fā)現(xiàn)連續(xù)多次select都立即返回且沒有就緒事件就認(rèn)為觸發(fā)了空輪詢?nèi)缓笾亟⊿elector把原來注冊(cè)的Channel全部遷移到新的Selector上。這個(gè)邏輯在select()方法的循環(huán)里通過一個(gè)selectCnt計(jì)數(shù)器來控制。閾值默認(rèn)是512次可以通過系統(tǒng)屬性調(diào)整。5.4 Selector的喚醒機(jī)制與wakeup的坑Selector.select()是阻塞的有時(shí)候你需要從其他線程喚醒它比如有新任務(wù)要提交到EventLoop上執(zhí)行。這時(shí)候調(diào)用selector.wakeup()就能讓select()立即返回。但wakeup()有個(gè)坑如果調(diào)用wakeup()的時(shí)候select()并沒有在阻塞那么下一次select()會(huì)立即返回一次相當(dāng)于“消費(fèi)”掉了這次喚醒。這會(huì)導(dǎo)致一次無意義的空輪詢。Netty處理這個(gè)問題的方式是在wakeup之后設(shè)置一個(gè)標(biāo)記下次select之前檢查這個(gè)標(biāo)記如果發(fā)現(xiàn)是多余的喚醒就跳過。這個(gè)細(xì)節(jié)在寫自定義NIO框架的時(shí)候很容易忽略導(dǎo)致CPU空轉(zhuǎn)。5.5 Selector的實(shí)操配置與調(diào)優(yōu)建議第一個(gè)建議是合理設(shè)置select的超時(shí)時(shí)間。如果設(shè)成0就是無限阻塞直到有事件才返回。如果設(shè)成正數(shù)就是最多阻塞那么久。Netty默認(rèn)用1秒的超時(shí)這樣即使沒有IO事件也能定期醒來處理定時(shí)任務(wù)和系統(tǒng)任務(wù)。如果你自己寫建議設(shè)一個(gè)合理的超時(shí)不要用0。第二個(gè)建議是selectedKeys()的清理。每次處理完一個(gè)Key必須調(diào)用iterator.remove()否則這個(gè)Key會(huì)一直留在集合里下次select返回時(shí)還會(huì)被處理。這個(gè)錯(cuò)誤非常常見表現(xiàn)就是同一個(gè)事件被反復(fù)處理。第三個(gè)建議是Selector的關(guān)閉。程序退出或者重建Selector時(shí)要遍歷所有注冊(cè)的Key取消注冊(cè)并關(guān)閉對(duì)應(yīng)的Channel最后再關(guān)閉Selector本身。否則會(huì)留下文件描述符泄漏。6. 三件套協(xié)同工作的完整實(shí)操流程6.1 服務(wù)端啟動(dòng)的完整代碼骨架下面這段代碼是我自己寫的一個(gè)最小NIO服務(wù)端骨架去掉了業(yè)務(wù)邏輯只保留三件套的協(xié)作流程。你可以直接拿去改。public class NioServer { public static void main(String[] args) throws IOException { // 1. 創(chuàng)建Selector Selector selector Selector.open(); // 2. 創(chuàng)建ServerSocketChannel并配置非阻塞 ServerSocketChannel serverChannel ServerSocketChannel.open(); serverChannel.configureBlocking(false); serverChannel.bind(new InetSocketAddress(8080)); // 3. 注冊(cè)ACCEPT事件 serverChannel.register(selector, SelectionKey.OP_ACCEPT); // 4. 創(chuàng)建Buffer用于讀寫 ByteBuffer readBuffer ByteBuffer.allocateDirect(1024); while (true) { // 5. 阻塞等待就緒事件超時(shí)1秒 int readyCount selector.select(1000); if (readyCount 0) { continue; } // 6. 遍歷就緒的Key IteratorSelectionKey it selector.selectedKeys().iterator(); while (it.hasNext()) { SelectionKey key it.next(); it.remove(); // 必須移除否則重復(fù)處理 if (key.isAcceptable()) { // 處理新連接 ServerSocketChannel ssc (ServerSocketChannel) key.channel(); SocketChannel clientChannel ssc.accept(); clientChannel.configureBlocking(false); clientChannel.register(selector, SelectionKey.OP_READ); System.out.println(新連接: clientChannel.getRemoteAddress()); } else if (key.isReadable()) { // 處理讀事件 SocketChannel clientChannel (SocketChannel) key.channel(); readBuffer.clear(); int len clientChannel.read(readBuffer); if (len -1) { // 連接關(guān)閉 key.cancel(); clientChannel.close(); continue; } readBuffer.flip(); byte[] data new byte[readBuffer.remaining()]; readBuffer.get(data); System.out.println(收到: new String(data)); // 回寫數(shù)據(jù) ByteBuffer writeBuffer ByteBuffer.wrap(echo: .getBytes()); clientChannel.write(writeBuffer); } } } } }這段代碼雖然簡(jiǎn)單但包含了三件套協(xié)作的所有關(guān)鍵點(diǎn)Selector的創(chuàng)建和輪詢、Channel的注冊(cè)和事件處理、Buffer的讀寫和flip。你可以基于它擴(kuò)展成支持多客戶端、支持協(xié)議解析的完整服務(wù)。6.2 參數(shù)計(jì)算Buffer大小與Selector超時(shí)怎么定Buffer的大小不是拍腦袋定的。我的經(jīng)驗(yàn)公式是Buffer大小 單條消息最大長(zhǎng)度 × 2。為什么要乘2因?yàn)門CP是流式的一次read可能讀到半條消息也可能讀到一條半。留出余量可以避免頻繁擴(kuò)容。如果消息長(zhǎng)度差異很大建議用Netty的LengthFieldBasedFrameDecoder來動(dòng)態(tài)處理。Selector的超時(shí)時(shí)間要根據(jù)業(yè)務(wù)來定。如果服務(wù)需要處理定時(shí)任務(wù)比如心跳檢測(cè)超時(shí)時(shí)間應(yīng)該小于心跳間隔。比如心跳是5秒一次超時(shí)可以設(shè)1秒這樣每秒醒來一次檢查有沒有需要發(fā)送的心跳。如果純IO服務(wù)沒有定時(shí)任務(wù)超時(shí)可以設(shè)長(zhǎng)一點(diǎn)比如5秒減少無意義的喚醒。6.3 實(shí)操現(xiàn)場(chǎng)一次粘包問題的排查記錄有一次線上服務(wù)出現(xiàn)數(shù)據(jù)錯(cuò)亂客戶端發(fā)的是JSON服務(wù)端解析出來偶爾會(huì)多出半截或者少半截。抓包看數(shù)據(jù)本身沒問題那就是服務(wù)端讀取的問題。排查發(fā)現(xiàn)代碼里每次read之后直接當(dāng)成完整消息處理了沒有考慮TCP粘包。TCP是字節(jié)流協(xié)議沒有消息邊界。發(fā)送方連續(xù)發(fā)兩條消息接收方可能一次read就讀到兩條拼在一起的數(shù)據(jù)也可能分兩次讀到一條消息的兩半。解決辦法有三種固定長(zhǎng)度、分隔符、長(zhǎng)度字段。我最后用的是長(zhǎng)度字段方案消息頭4個(gè)字節(jié)表示body長(zhǎng)度先讀4字節(jié)再根據(jù)長(zhǎng)度讀body。用Netty的話直接上LengthFieldBasedFrameDecoder指定長(zhǎng)度字段偏移和長(zhǎng)度就行。6.4 性能壓測(cè)三件套配置對(duì)吞吐量的影響我做過一組對(duì)比測(cè)試環(huán)境是4核8G的機(jī)器客戶端用JMeter模擬1000并發(fā)服務(wù)端分別用BIO和NIO。BIO在500并發(fā)時(shí)響應(yīng)時(shí)間開始明顯上升1000并發(fā)時(shí)大量超時(shí)。NIO在1000并發(fā)下依然穩(wěn)定平均響應(yīng)時(shí)間在10ms以內(nèi)。進(jìn)一步調(diào)優(yōu)發(fā)現(xiàn)幾個(gè)關(guān)鍵點(diǎn)Buffer用DirectBuffer比HeapBuffer吞吐量高約15%Selector超時(shí)從0改成1秒后CPU占用率從30%降到15%EventLoop線程數(shù)設(shè)置為CPU核數(shù)的2倍時(shí)吞吐量最高再多反而下降。這些數(shù)據(jù)不一定適用于所有場(chǎng)景但方向可以參考。7. 常見問題與排查技巧實(shí)錄7.1 問題速查表問題現(xiàn)象可能原因排查方法解決方案CPU 100%空轉(zhuǎn)Selector空輪詢jstack看線程棧是否在select循環(huán)重建Selector或升級(jí)JDK讀不到數(shù)據(jù)忘記flip檢查Buffer的position和limit讀之前調(diào)用flip()數(shù)據(jù)錯(cuò)亂粘包/拆包抓包對(duì)比收發(fā)數(shù)據(jù)加長(zhǎng)度字段或分隔符連接泄漏Channel未關(guān)閉lsof查看文件描述符數(shù)量確保close()被調(diào)用寫數(shù)據(jù)丟失緩沖區(qū)未flush檢查write后是否flush調(diào)用flush()或shutdownOutput()內(nèi)存溢出DirectBuffer泄漏監(jiān)控堆外內(nèi)存限制MaxDirectMemorySize事件重復(fù)處理selectedKeys未remove檢查迭代器remove調(diào)用每次處理完remove7.2 獨(dú)家避坑技巧第一個(gè)技巧用strace跟蹤系統(tǒng)調(diào)用。當(dāng)你不確定Selector底層在干什么的時(shí)候strace -e epoll_wait,epoll_ctl -p pid可以看到實(shí)際的epoll調(diào)用情況。如果epoll_wait頻繁返回0說明有空輪詢?nèi)绻鹐poll_ctl調(diào)用異常多說明Channel注冊(cè)/注銷太頻繁。第二個(gè)技巧給EventLoop線程起名字。Netty默認(rèn)的線程名是nioEventLoopGroup-2-1這種看不出是哪個(gè)服務(wù)。建議在創(chuàng)建EventLoopGroup時(shí)傳入ThreadFactory把線程名改成有意義的比如order-service-io-1。這樣jstack的時(shí)候一眼就能定位。第三個(gè)技巧監(jiān)控Selector的selectedKeys數(shù)量。正常情況下這個(gè)數(shù)量應(yīng)該和并發(fā)量正相關(guān)如果突然飆升到幾千可能是某個(gè)Channel一直就緒但沒被處理導(dǎo)致堆積??梢栽贓ventLoop里加個(gè)定時(shí)任務(wù)打印這個(gè)指標(biāo)。7.3 一個(gè)真實(shí)的內(nèi)存泄漏排查過程有個(gè)服務(wù)運(yùn)行幾天后堆外內(nèi)存持續(xù)增長(zhǎng)最終OOM。用jmap看堆內(nèi)正常用NMTNative Memory Tracking看堆外一直在漲。排查代碼發(fā)現(xiàn)有個(gè)地方在異常分支里創(chuàng)建了DirectByteBuffer但沒有釋放而且這個(gè)分支被頻繁觸發(fā)。DirectByteBuffer的回收依賴Cleaner而Cleaner的執(zhí)行又依賴GC堆內(nèi)壓力不大的時(shí)候GC不頻繁導(dǎo)致堆外內(nèi)存遲遲不釋放。解決辦法有兩個(gè)一是用Netty的ByteBuf代替DirectByteBufferNetty有引用計(jì)數(shù)用完release()就能立即回收二是如果非要用DirectByteBuffer在finally塊里顯式調(diào)用Cleaner或者用反射調(diào)用free()方法。我最后改成了Netty的PooledByteBufAllocator問題解決。8. 從NIO三件套到Netty的進(jìn)階路線如果你已經(jīng)把Buffer、Channel、Selector這三塊搞明白了接下來可以往幾個(gè)方向深入。第一個(gè)方向是Reactor模式理解單Reactor單線程、單Reactor多線程、主從Reactor多線程這三種模型的差異以及Netty為什么選擇主從Reactor。第二個(gè)方向是零拷貝研究Netty的CompositeByteBuf、FileRegion、以及Linux的sendfile系統(tǒng)調(diào)用是怎么減少數(shù)據(jù)拷貝的。第三個(gè)方向是內(nèi)存池看Netty的PooledByteBufAllocator怎么用jemalloc的思想管理內(nèi)存怎么做到高并發(fā)下的高效分配和回收。我自己走下來的體會(huì)是NIO三件套是地基Netty是建在地基上的大樓。地基不牢樓越高越危險(xiǎn)。很多人上來就學(xué)Netty的API用起來沒問題但一旦遇到性能瓶頸或者詭異bug就束手無策了?;仡^把三件套啃透你會(huì)發(fā)現(xiàn)Netty的很多設(shè)計(jì)都是順理成章的排查問題也有了方向。最后分享一個(gè)我常用的調(diào)試手段在EventLoop的run方法里加一段日志記錄每次select的耗時(shí)和就緒Key的數(shù)量。正常情況下select耗時(shí)應(yīng)該接近超時(shí)時(shí)間就緒Key數(shù)量波動(dòng)不大。如果select耗時(shí)接近0且Key數(shù)量為0那就是空輪詢?nèi)绻鸎ey數(shù)量持續(xù)很高那就是處理速度跟不上就緒速度需要考慮增加EventLoop線程或者優(yōu)化Handler邏輯。這個(gè)簡(jiǎn)單的監(jiān)控幫我定位過好幾次線上問題比任何高級(jí)工具都直接。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
激情五月天丁香社区| 蜜臀久久99精品| 日韩欧美日韩| 欧美人妻制服| 国产肏屁眼视频| 天天干天天操天天干天天操| 亚洲精品国产精品成人| 亚洲美女黄色| 特级大荫道BBwBBwBBW| 精品熟女一区=区三区| 老外又粗又长一晚做五次| 欧美日日人人天天| 无码人妻精品一区二区三区九九| 夜色五月天| Blackedraw视频一区二区| 久久岛国| 久久高潮妇女视频| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 久操在97| 超硑97精品| www.婷婷五月天| 国产日韩欧美中文在线播放| 操逼无码操逼| 久久久久夜夜夜夜| 曰本特级特黄特色黄色A级网站高清在线免费看| 综合网色| 99九九精品| 亚洲一级性爱视频免费看| 亚洲色交| 91东北熟女| 久热精品在线| 欧美精品不卡一二三四在线91| 99爱久久视频频| 五月婷婷激情| 国产精品大香蕉| 欧美大香蕉专区网| 日本三级R| 国产日韩精品人妻久久久久色欲网站| 久久精品 六十路 熟女 欧美| 国产精品另类一区大香蕉| 日韩中文字幕2020| 青青草在线视频欧美| 不卡在线一区,精品一区二区三区中| 九月丁香综合网| 性色av蜜臀av色欲aV| 超碰国产精品无码| 少妇高潮流水av免费| 91欧美综合| 国产中文字幕在线观看| 67914在线兔费成人视频| 色在线69堂| 色网在线| 偷拍2020| 色五月av| 国产女同在线观看视频| 黄色片,com| 免费日韩黄片| 无码精品一区二区三区潘金莲| 人人贴人人摸| 少妇高潮对白在线观看| 91亚洲人电影| 操死我了嗯嗯嗯| 2020久久免费视频| 一级一性爱免费视频| 97在线免费观看| 欧美精品宗合| 可以免费观看的AV| 青青草伊人久久| 一牛一区二区三区久久| 加勒比性爱成人在线| 日本高清一本二本免费不卡| 国产无码三级视频在线观看| 国产性爱在线视频一区二区| 九九Av| 色蜜AV| 伊人久久大香蕉线AV五月天| 久久有码视频| 欧美不卡在线一区二区| 91日本在线观看| 日夜啪电影| 91红杏| 最新精品久久蜜桃| 欧美性色欧美| 收看日本人日bb| 狠狠色噜噜狠狠狠狠狠色综合久久| 操婷婷逼| 亚洲九九爱| 精品日韩| 777奇米影视777四色| 粉嫩国产精品久久粉嫩| 日本高清一本二本免费不卡| 亚洲国产一级黄色视频| www.99热| 久久久精品中文字幕麻豆| 伊人九九九| 秋霞成人一级在线观看| 亚洲天堂性爱| 69一区二区| 亚洲成人av电影在线| 欧美日韩99| 97er欧美性| 亚洲欧美天堂| 色五月激情综合网| 欲色啪| 日本熟女不卡视频| 亚洲中文字幕97久久精品少妇| 人人澡综合涩| 亚州熟女乱伦| 91强在线播放| 亚州操逼图| 夜夜夜久久| 淫纸中9区| 欧美日本中字另类在线| 97精品在线| 激情熟女12P| 国产视频一区二区在线| 亚洲乱妇p22| 岛国网址国产 | 综合色图亚洲欧美| 搡老女人911熟妇老熟女| 欧美一级A片在线看视频性色| 97日视频| 草草影院最新网址| 九九九影院| 13小男生GAY自慰脱裤子| 中日无幕一二三四区| 青青草原香蕉日本Ap| 亚洲乱伦图片视频| 国产91丝袜 在线播放| 一区二区娱乐网站| 天天舔日美女视频| 99热9| 久久久少妇诱惑精品视频| 国产精品毛片?v一区二区三区| 亚洲中文字幕有码视频一区二区三区| 97天天综合| 亚洲欧美日韩综合在线尤物| 午夜亚洲| 欧美躁死她一区二区| 九九热精品视频六| 69超碰综合| 久久这里只有精品9| 激情丁香五月婷婷| 久久久久久久精| 婷婷激情四射| 人妻少妇久久中文字幕一区二区 麻豆 | 午夜情侣自拍网站| 免费观看性欧美一级| 久久综合日韩亚洲欧美| 国产一区二区三区导航| 欧美色图另类图片| 女色视频社区| 日韩中文字幕国产| 久久久精品视频欧州站| 啊啊啊啊啊在线观看网址| 3PAV乱伦视频| 亚洲男人的天堂在线看| 免费强奸av| 精品人妻高清麻豆av| 婷婷综合视频| 搡老熟女免费视频| 亚洲日韩东京热一区| 美女写真| 久久高潮妇女视频| 素颜老阿姨乱情色| 丁香五月AV| 亚洲国产精品成人综合| 俺也射| 大香蕉九九| 狠狠久久手机视频精品| 九九九精品一区二区无码| 天天色综亚洲91污| 国产久久免费精品视频| 97亚洲综合在线| 在线综合 亚洲 欧美中文字幕| 综合免费无码中文| 欧美日韩在线视频网站| 蜜乳中文字幕a在线| 伦在线97| 99久久无色码| 五月天婷婷基地| 欧洲综合无码| JuliaAnn丝袜熟女系列| 97久久精品不卡| 久久婷婷一区二| 亚洲五码一区二区三区| 国语对白露脸XXXXXX| 欧美色图97| 乱理日韩中文| 人人天天欧洲| 韩日精品四区| 日本精品第一视频在'| 亚洲国产一级黄色视频| 97亚洲色图| 无码视频一区二区| juliaann精品熟女一区| 久久人妻精品| 国产精品免费视频人成| 岛国网址国产| 性暴力欧美猛交在线直播| 亚洲全色网| 夜夜嗨免费视频| 久久啊啊啊视频| 97九色人妻| 色欲天天综合网| 欧美成人午夜免费福利785| 富女玩鸭子一级毛片| 狠狠爱夜夜| 99在线精品观看视频中文| 97这里只精品| 91色伦| 久久原创中文| 夜夜嗨免费视频| 色天堂在线观看| 殴洲老熟女| 久日91在线| 97 国产一区| 男人的天堂.com| 97高清啪啪| 久久久久中出| 麻豆精品A片免费观看| 欧美老熟另类| 大香蕉琪琪日本女优不卡| 国产乱弄免费在线视频。| 久久久久密| 亚洲最大的黄色电影网站。| 欧美日韩222| 好湿好紧好爽 视频| 青青草视频久久| 日韩三级一区 | 日韩综合色网| 全国男人天堂网| 国产日韩美女小穴视频网站不卡| 大香蕉综合网| 自拍偷拍国产欧美日韩韩| 91精品微拍福利| 玖玖爱免费观看视频| 在线观看黄色电话| 婷婷五月天成人| 大香蕉 222| 91天美传媒精品| 久久妇| 欧美狠狠狠| 精品少妇999| 明星性猛交ⅹxxx乱大交| 亚洲熟伦熟妇AV无码春色| 美女操逼A A| 亚洲国产麻豆一区二区三区| 99啪啪| 狼人综合婷婷激情四射 | 色综合一区二区三巨| 日本免费一区二| 亚洲色情在线影视| 欧美姓爱综合网| 秋霞一级鲁丝片A片| 人人操人人操草草| 丰满少妇一区二区三区专区| 91精品婷婷国产综合久久竹菊| 久久久精品一区二区| 精品国产乱码久久久影院| 1240青青草一区二区三区视频天爱| 少妇久久久| 操逼片中文| 一区二区你上我| 精品96久久| 国产一区二区在线看| 一级毛片电影免费看| 亚洲天堂人妻熟妇视频| 日日黄色三级网站| 日韩日本欧美在线观看| 色婷婷久久| 青青欧美| 92性色国产午夜福利在线661| 五月婷婷AV| 97超碰逼| 秋霞 色色| 欧美黄色片AAAAA| 91丝袜激情在线| 亚洲 欧美 色图| 亚洲AV秘 精品久久老牛影视| 日本一级一级一级一级| 囯产精品强| 18禁在线视频| 偷拍欧美激情| 日少妇视频| 天天躁日日躁AAA片李宗瑞| 无码一区二区三区四区五区六区七区八区九区十区视频 | 在线综合网| 人人搞人人插人人操| 密臀在线免费观看| 新视频sss国产| 大屁股人妻女教师撅着屁股| 日韩99神马视频播放| 1240青青草一区二区三区视频天爱| 玖玖爱免费观看视频| 国产传媒美日韩av| 精品一区二区三区国产| 久久天天躁日日躁狠狠躁| 黄页| 天天欧美欧美亚洲网| 国产中午字一暮区| 成人福利视频网| 婷婷五月天无码 | 9999久久久久| 伊香蕉综合久久久久久久噜噜噜| 性做久久久久久久| 精品欧美日韩在线观看| 欧美熟女操屄| 亚洲人妻久久久| 日韩欧美经典在线观看| 久久大香蕉97| 天天干2019| 女性喷水高潮在线观看| 国产天天骚| 蜜乳AV.COM| 亚洲色图欧美另类在线| 色播综合| 97超碰人人模人人拍人人| 久久久不能久久久久| 成人精品无码| 久久久久久91香蕉国产| 熟女精品va中文字幕| 日本黄色XXX| 午夜黄色免费在线观看| 一区二区不卡视| 欧美久久毛片基地| 国产av波波国产精品| 校园春色欧美| 熟女丝袜视频| 中国一级操逼视频| yazhououmeizongya| 男人的天堂亚洲| 少妇一级无码精品| 97精品久久久久中文字幕| 99精品久久久久久久婷婷蜜桃| 久久精品无码专区| 麻豆性爱视频在线播放| 啪啪啪大香蕉| 亚洲伊人久久综合97| 很很很很操| 色色激情五月天| 人妻一区二区三区四区视频| 嫩草 我啊~嗯~在线| 免费视频a级毛片免费视频| 精品91日日夜夜超清资源| 日韩中文字幕av在线播放| 免费亚洲黄色视频在线观看| 人妻丝袜一区二区三区在线| 国产欧美日韩臀| 中文字幕 国产 精品| 蜜臀久久99精品久久久久| 操b网站亚洲无码| 成人三级片无码| 久久久久97| 九9精品| 自拍丝袜美腿人妻| 99综合网| 亚洲成人性爱在线观看| 国产狂喷潮在线精品| 超碰社区97| 精品小视频在线| 另类图片五月天| 一牛影视成人片免费| 综合欧美亚洲| 性欧美91| 欧美线天码中字| 91久久国产综合精品| 国产丝袜视频| 久热伊人| 久久肏大逼| 亚欧毛片基地国产毛片基地| 五月天亚洲色图| 91精品国产91久久久久久久久久久久| 性性久久| 97欧美色资源| 青青草视频导航官网| 欧美精品四区| 国产免费一区二区在线A片视频| 中国大陆国产高清AⅤ毛片| 国产在线能看的你懂的| 亚洲成人ab| 色九九久九九| 精品国产乱子伦一区二区三区,精品一| 啊啊啊久久久视频| 懂色av中文字幕一区二区三区天美| 97免费视频网| 亚洲精品欧洲精品| 五十路熟女工口| 97欧美色资源| 99re这里| 干美女人妻| 国产精品色| 欧洲站一级二级三级h| 美女91色黄18| 国内外毛片在线观看| www被窝色com| 天天综合欧美黑人| 超碰99re| 日韩免费av片高清无码| 国内偷自视频区视频综合 | 女同在线视频一区| 熟妇女人妻呻吟久久AV| 打av高清| 欧美日韩精品青青| 熟人人妻少妇精品久久| 久久久久久9| 四虎精品永久在线播放| 尤物网址| 男女一级A片大黄,一进一出| www.色五月| 欧美综合骚| 色欲人妻一区二区在线| 日日干夜夜欢| 91狠狠综合久久| 一区二区三区国产在线播放 | 97综合久久| 操操操五月天婷婷丁香影院| 欧美,日韩,亚洲视频| 柠檬AV导航| 亚洲国产第一页综合视频| 成人AV素股で擦久久| 午夜天堂精品久久| 久久精品一区一起草| 国产熟女一区二区| 蜜乳视频网站| 日本三级中国三级99人妇网站| 男人的天堂2018.| 九草九九九| 久久97超碰| 蜜乳Av成人片网站| 丁香五月天社区| 亚洲限制级| 久久精品国产亚洲粉嫩| 18啪啪手机免费性爱| 成人黑料社久久| 综精品久久久aaaa| 欧美综合中文| 国产精品无码久久久久2025| 人妻丝袜无 码视频专区| 麻豆性爱视频在线播放| 国产91 丝袜在线播放| 搡老女人老妇女AAA一VU麻豆| 久久久久国产无av| 久久m| 欧美人妻制服| 深夜国产一区二区三区在线看| 色婷婷亚洲婷婷| 91精品国久久久久久无码| 97色香蕉| 911粉嫩人妻| 麻豆久久久久久久久丝袜| 青青草华人在线欧美在线| 久久精品国产AV一区二区三区| 99视频精品| 亚洲日韩XXX| 福利视频香蕉免费一区二区在线| 韩国一级婬片A片AAAAA| 国产十八禁视频| 97无码视频在线播放| 激情五月天视频| 干B| 亚洲精品国产精品成人| 偷拍欧美综合| 超碰久超碰久| 色五月综合| 肉丝中文无码高清| 无码高清专| 人妻少妇三级| 高清无码在线播放网站| 中文字幕片| 日本中文熟女视频| 夜夜操夜夜爽夜夜高潮| 丰满人妻一区二区三区色-百度| 欧美成人午夜免费福利785| 久久大精品乱码视频人妻熟女| 明星性猛交ⅹxxx乱大交| 乱精品一区字幕二区| 视频在线97| 性爱av网站| 日韩精品影视| 丰满人妻av一区二区三区 | A 在线网址| 亚洲色图国产另类| 日韩精品国产一区二区| 人妻少妇精品久久久| 欧美日日操| 操淫穴亚洲五月丁香 | 欧美97av| 日韩一区二区精品视频| 嗯嗯啊啊操我| 天天看特黄的免费网站| 成人性爱全视频观看| 啊啊啊轻点在线观看| 黄片不用下载在线观看| 九九热av| 天天天肏屄欧美| 狠狠久久手机视频精品| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 天天肏夜夜肏| 操穴国产| 97人人操人人摸| 人妻少妇无码| 久久发布国产伦子伦精品| 亚洲一区中文精品| 午夜精品人妻二区三区| 中文字幕第页| 国产精品一区二区校花| 日本幼女18+| 日韩久久超碰色| 日韩免费大片一级播放| 中文字幕福利视频一区二区三区在线观看| 欧美躁死她一区二区| 日日干天天干夜夜爽| 亚洲人人夜夜澡人人爽| 香蕉在线一区二区三区| 日本成人A片网站| 久久久免费高清中文视频| 狠狠中文字幕| 99久久精品无码一区二区| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 丰满人妻一区| 国产超碰国产97| 亚洲AV操| 欧美999| 尤物视频网 刘玥| 亚洲丝袜二区| 日韩人妻免费精品| 人人操人人爽人人操人人| 9997se| 大香蕉 222| 国产精品成人无码av| 亚洲av综合伊人久久| 精品人妻一区二区蜜桃视频| 少妇人妻精品| 青青国产精品在线| 欧美一级色| 17c在线成人免费A片观看| 亚洲天堂另类| 久操影视| 精品久久久久久久久久久久| 欧美熟女少妇| 国产原创剧情在线丝袜| 亚洲91在线播放影院| 在线免费观看高清无码视频| 美女9118禁| 精品人妻视频一区二区在线播放| 99re只有精品| 日韩 人妻 精品| AA丁香综合激情| 亚洲欧美日韩精品久| 国产强奸乱伦xd| 91在线免费精品视频| 欧美人妻制服| 视频二区美腿制服人妻欧美| 超碰综合97在线| 91美女色视频亚洲| 欧美中字二区| 欧美伦乱爱| 日日夜夜青青草母狗| 九九九九九九亚洲| 亚洲最大的黄色电影网站。| 九色 人妻 大香蕉| 欧美九九爱| 夜夜骑操视频| 天天看特黄的免费网站| 动漫区日韩区欧美区| 91热情品| 伦理弟一页| 98福利在线视频| 少妇色综合| 日韩av情韩国爱禁区av一区二区| 欧美传媒一区| 亚洲日韩狠狠撸视频| 欧美成人精品一区二区男人蜜臀| 欧美在线第五页| 久久久三区二区一区| 玖玖无码超碰| 亚洲图片第一页| 国产视频人人网| 亚洲国产精品无码AV久久久| 久久riav中文精品| 国产女人91精品嗷嗷嗷嗷| 综合久久中文字幕综合日韩精品| 天天爽天天干| 蜜桃中文字日产乱幕4区| 操学生天天| 国产精品久久久久久9999| 我爱操| 国产精品自拍视频| 中文精品一区二去| 日韩精品一区二区三区色欲| 2011国产精品| 亚洲欧美一区二区不卡视频播放 | 浪人综合网| 国产无马av| 欧美三级一级| 久9爱经典视频| 亚洲色交| 狠狠中文字幕| 亚洲另类在线观看| 久9久9精品| 欧美综合色,www| CCYY草草影院地址入口| 国产一区二区欧美日本| 欧洲综合视频| 91在线国产后入风骚翘臀美女素人| 亚洲美女精品九九视频| 人妻一区视频| 日韩精品三区四区| 中文字幕免费看| 欧美成人免费在线观看| aⅴ日韩成人电影av在线免费看av大全| 亚洲日韩一区电影| 久久久成人精品| 欧美裸体美女日麻屄| 国产一级作爱毛片| 欧美五区| 在线视频97| 日本熟女中文| 日本五十路在线| 99re免费| 综合色图区| 日韩少妇在线视频| 日本αv| 蜜臀少妇一区二区| 久草线上视频免费看| 强奸乱伦AV一天堂网| 婷婷导航| 人妻少妇无码| 欧美人妻久久精品二区三区| 色狠人在线99| 大肥女高潮bbwbbwhd视频| 久久色情| 男人的天堂三级| 欧美精品xxxwww| 九九热超碰97亚洲最新香蕉| 91精品国产一区三一| 日韩性爱再线视频| 91激情综合| 国产人妖的免费的视频| 日韩精品高清资源在线| 亚洲欧美综合| 你操综合| 综合97| 久久久久13| 精品69网| 97五月天| 国产精品噜噜噜日日日| www.狠狠| 欧美 亚洲 第一页 | 清纯唯美激情| 99在线免费观看| 色亚洲欧美| 激情四射五月天| 18精品一二区| 色色国产| 97天堂| 激情四射婷婷四五月天| 一区二区影视| 国产农村妇女一区二区| 免费试看60秒| 色女网日韩| 国产精品麻豆免费视频| 国产精品suv一区| 日韩乱伦AⅤ| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 囯产乱伦一区二区三女| 国产女主播视频在线观看| 乱伦系列一区二区| 九九热re99re6在线精品| 五月丁香成人网| 国产精品操| 国产婷婷一区| 欧美一区二区三区另类精品| 啊啊啊啊啊啊啊在线| 黄色性爱网网| 久久国产乱子伦精品免费女,网站| 欧美一级三级| 日韩欧美大片免费高清啪啪| 国产二区三区粉嫩在线| 夜嗨影院| 伊人超碰97| 嗯嗯嗯,草死我| 欧美十八禁导航成人| 偷拍欧美亚洲| 高清不卡国产| 在线观看中文av字幕| 中国91AV| 97国产亚洲中文在线| 亚洲成a人在线观看久| 欧美日韩狠狠爱| 一区二区三区国产精产| 操逼国产免费| 人妻铁牛TV| 天堂资源站| 操久久久久久| 亚洲高清无码在线桃色| 91成人无码| 涩涩久久精品| 爱爱动态120秒| 国产理论视频在线播放| 97免费在线观看| 无码操逼天堂| 色鬼在线综合| 久热久| 欧美日韩国产三级黄色| 久久久久久久| 男人的天堂无码| 操操操操操操| 精品少妇一区二区三区免费观看| 天天操天天干一区二区 | 男人天堂.AB| 国内毛片免费h片在线| 日韩熟女操逼| 91美女小视频| 人妻夜爽夜夜爽| 啊啊啊要高潮了| 男人下部插入女人下部 | 中出20p| 婷婷精品国产一区二区三区日韩| 久久久久久国产精品| 国产51色综合久久免费| 中文操逼字幕| 免费看一级a性色生活片久久无| 综合97| 婷婷人妻激情| 亚洲素人网| 97香蕉人人乳| 97视频观看| 五月丁香综合网| 久久欧美性爱视频| 亚洲无吗在线视频| 大黄片做爱的大的| 久久受www免费人成| 呦呦一区| 精品亚洲| 蜜臀久久99精品久久久久| 超碰在线免费一区二区三区| 欧美色图99| 大但人体久久久久| 国产人妻精品一区二区三区秋霞| 91九九九小逼| 欧美视频激情久久久久久| 色女综合| 综合 青草 伊久久 影院 综合 | 亚洲97资源| 欧美手机在线综合| 激情内射| 少妇高潮一区二区三区在线| 美女天天干| 新怡红院| 亚洲男人的天堂va亚洲男人社| 蜜汁欧美| 俞拍久久国应视频| 亚州综合网| 国产区日韩区在线观看| 天天看天天日天天操| 天天日天天操天天射河南省| 婷婷色色五月天福利| 国产色产精品在线观看| 亚洲一区中文精品| 精品国产一区二区三区四区在线看| 成人97人人超碰人人| 国产美女自拍AV| 中国国产精品一区视频| 国产欧美日韩精品中文| www久久99| 欧美久久九九| 日韩情色AV| 国偷自 一区| 97超级久久| 91精品人| 日韩丰满熟妇| 乱伦日本中文自拍| 大香蕉久久| 多毛小伙内射老太婆 | 丝袜美腿丝袜| 色九九久九九| 欧美中文字幕日韩在线| 国产 三级自拍| 亚州 综合 色图| 嗯嗯嗯嗯啊啊啊好紧好大| 日本天堂网| 情色五月天网| 99少妇| 强奸乱伦AV一天堂网| 黑人操一区二区| 五月天偷拍| 秋霞一区二区三区四区五区六区七区| 1204人成网站色www| 亚洲欧美情色| 欧美久久人人网| 国产玖玖| 欧洲亚洲天堂精品 | 黄色电影在线播放综合网站| 一区在线观看中文字幕| 爆乳免费黄网站| 天美传媒精品一区二区三区| 日韩视频中文字幕| 国产又大又硬又长又粗| 日韩中文字幕熟妇人妻| 天天性射网| 十八禁视频一区二区| 性一交一乱一交A片久久四色| 春色校园综合网| 97日韩欧美亚洲| 无码一区二区精品视频久久久春药| 国产亚洲日本精品在线| 亚91亚洲网| 欧美 色 亚洲| 国产午夜无码片在线观看影视| 99久久com免费视频′| 亚洲欧美变态| 欧 美 自 拍 偷 拍| 亚 欧 美 综合| 欧洲自拍第一页| 国产对白刺激视频| 亚洲情色1区| 神马麻豆福利院| 大地资源在线观看中文第二页 | 国产AV精久久| 国产60区。| 无码人妻精品酒店| 色情成人五月天| 国产精品夜夜夜| xxx0国产在线播放| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 1000部熟女视频在线观看| 天天干少妇| 91白虎| 欧美一级A片在线看视频性色| 最新av在线| 人人摸.人人色| wwe 天天干.com| 亚洲伊人久久综合97| 99re6国产精品99re在线| 亚洲无码一区成人免费午夜| 国产福利精品最新在线| 熟女露脸激情自拍视频| 全免费a敌肛交毛片免费| 一级黄碟在线看| 国产亚洲精品激情| 亚洲自拍一区夜夜操| 国产9 9在线 | 亚洲| 怡红院怡春院| 国产日韩精品suv| 成人熟女视频一区二区三区| 亚洲AV无码秘 蜜桃臀国精产品| www鬼畜国产男人的天堂| 精品在线蜜臀| 久久99国产综合精品女同| 男人天堂网站| 91色鬼| 欧美日韩另类在线| 91路www| av日韩在线观看电影| 后入式五六区| 人人扣人人操| 极品色综合| 欧美综合骚| 国产午夜精品理论片a大结局| 麻豆国产原创AV色哟哟| 秋霞一级A片黄色视频| 日本男人插女人的逼黄色| 亚州一区二区成人片免费| 大香蕉色欲AV| 九九激情网| 国产后入| 嗯嗯啊好大| 久久99午夜精品一区人妻| 青青草一本道福利视频| 人妻啊啊人妻啊| av网站免费线看| 久久久禁| www久久久| 强被迫伦姧在线观看无码网站| 青青青青草av在线观看| 亚洲成人福利电影免费| 亚洲激情在线| 亚洲男人天堂网久久| 岛国片国产成人亚洲播放| 后入合集| 欧美 传媒 麻豆 日韩 偷拍| 伊人影院综合是一个与深夜成人在线| 97操97干| 天天综合网91入口| 久久男女激情视频网站| 人人操人人色网| 超碰97亚洲区| 亚洲骚女一区二区三区| 搡老女人老妇女AAA一VU麻豆| 久久久78| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 国产中文日韩欧美一区二区三区人妻丝袜美腿 | 黄色二级片网站| 国产一级做a爰大片免费久久| 啊啊啊啊啊啊好多水| 国产精品久久久久久久久久久久久久久 | 国产最火爆久久国产网站网站| 日日AAvv| a人欧美综合天堂麻豆| 国产67194| 国产亚洲精品美女久久久| 成人性交午夜免费片| 国产天美传媒精品| 久热伊人99re| 欧美综合区| 亚洲色系另类精品国产| 亚洲激情视频| 欧美专区17页| 中文字幕日韩人妻视频一区二区三区交换夫妻| 日韩无码专区| 三级三级三级a级全黄三| 大肥女高潮bbwbbwhd视频| 丰满少妇精品一区二区| 午夜精品久久久久| 又大又长又爽| 亚洲激情综合| 搡老熟女老女人老熟妇免费视频| 亚洲性爱电影| 日本色色色网站免费看不卡| 亚洲天堂电影网99999| 天天内射| 97色色色综合网站| 嗯嗯嗯啊啊啊在线免费观看| 婷婷五月色| 簧片免费看视频| 久久精品中文字幕无码l| 影音先锋日本一区二区| 久久大| 亚洲天堂男人网| 婷婷激情四射| 少妇三p| 亚洲欧美综合图片| 色97国产69香蕉| 加勒比综合a∨| 97网址97| 精彩久久中文| 久久机热| 伊人久日| 限制级中的三级片中的黑粗大屌屌日人妻熟女| 另类av综合久久| 少妇三P| 日本不卡二三区| 亚洲免费97免费| 亚洲欧美国产中文字幕| 中 文字幕一区二区三四 五 区日 日 骚| 用力操死我| 狠狠操一区二区| 蜜桃久久精品一区二区三区| 97在线欧洲| 欧亚日韩三区| 亚洲系列欧美| 久久久草草精品| 91四海无码日韩欧美| 亚洲中文丝袜美腿诱惑字幕| 加勒比99999| 九九久久久| 蜜臀在线视频| 欧美中文字幕日韩在线| 国产最新小视频在线播放下载 | 超碰这里只有精品| 97精品在线| 欧美天天影院| 91人妻在线视频| 亚洲欧美国产中文视频| 99久久久无码精品国产人| 99色热国产视频精品| 人妻精品一区二区在线| 六月丁香网| 欧美美女在线高潮999| 久久综合超碰| 日本免费二区三区| 好爽视频在线观看视频 | 少妇毛片久久| 熟妇人妻一区二区三在线| 亚洲情色综合网| 91亚洲影视| www.亚洲黄色| 美女被艹尤物视频| 国产高清1234区| 超碰538| 怡红院久久老司机| 无码动漫av中文字幕| 日韩欧美中文日韩欧美色| 国产亚洲色婷婷久久99精品91| 天天肏美女| 嗯嗯啊啊的视频| 夜夜爽夜夜爽| 久久久亚洲欧美综合| 亚洲成人av色网| 久久一二三四不卡 | 亚洲欧洲无码一区夜| 91亚洲图片| 亚洲欧洲综合成人av一区| 九热视频| 97日视频| 欧美色乱| 永久免费发布性爱网| 91女在线观看| nuu12国产麻豆精品| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 国产精品 久久久精品一牛| 日本日逼视频网| 中文字日本乱码| 校园春色AV天堂| 美女极品一区二区三区| 精品久久久久,69国产成人精| 亚洲欧洲无码一区夜| 麻豆久久一区二区三区| 日韩av在线免费网站| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 亚洲春色一区二区三区| 国产精品亚洲美女久久久久| 9精品在线| 欧美天天综合| 综合啪啪| 97超碰免费生活| 成人五级久久| 色穴精品| 亚洲熟女诱惑| 久久婷婷综合国际产色怕| 德国一二三不卡| 久久草在线综合视频| 老熟女中文字幕高清| 一级做受视频免费是看美女| 99热综合| 国语精品av| 日韩中文字幕二区| 久久精品男人的天堂| 亚洲囯产精品女人久久久| 一区二区三区四区五区高清无码永久视频| 国语精品av| 抽插无码高清一区| 无码九九九九| 亚洲高清无码AAA久久久精品| 好舒服视频| 免费?级毛片无码?∨蜜芽试看| 精品久久久久9999| 日本操逼无码| 久久不卡一区二区| 欧美激情激情xxxx欧美专区| 曰韩精品九九无码| 易易A毛视频| 色婷婷六月| 精品国产乱码久久久| 婷婷色婷婷| 国产精品在线免费| 青青草日韩无码| 色色九区| 农村妇女一级二级三级视频| 蜜臀99久| 97午夜剧场日韩| 亚洲一区日韩精品中文字幕| 久9久| 国产精品探花色| 99色婷婷中文字幕乱色| 日本性爰一道本| 校园春色宗合网| 91在线精品| 亚洲一区二区av| 色综合美国| 婷婷伊人五月| 日本黄色裸日本黄色裸体| 日韩在线一区二区| 无码操逼天堂| 天美麻花大全视频| 亚洲天堂资源网| 日韩二级| 极品尤物自安慰| 亚洲成人AB| 中文啪啪视频| 秋霞一级A片黄色视频| 久久一区二区加油站| 2024人人操人人摸| 性天堂| 五月开心久久AV官网| 一区二区三区激情在线观看| 蜜臀AV一区二区三区| 蜜桃传媒一区二区亚洲| 黄色人人| 久草色在线观看| 超碰亚洲欧美日韩无| 欧美性生活免费网| 人妻少妇无码| 大香蕉十区| 在免费jIzzjIzz在线视频| 天天操天天舔| 99国产精品免费| 婷婷五月天久久久| 国产精品不卡一区二区电影| 天天综合麻豆视频| 黑丝少妇在线观看| 男人天堂黄片| 国产一线二线三线av| 久久只有精品一区二区三区| 爱av免费| 中日韩一区二区三区欧美| 破处bbq| 熟妇一区二区三区| 久久99精品视频| 国产高清吃奶免费视频网站| 91久久国产精品| 青青草日本中文字幕| 色欲天天综合网| 少妇无码av专区线| 色香欲综合| 欧美激色| 91九色丨国产丨爆乳| 六月激情婷婷| 亚洲第一精品在线视频| 无码78| 欧美综合自拍亚洲综合图| 欧美最婬乱婬爆婬性视频| 日韩在线观看中文字幕视频| 免费少妇一区二区| 久久少妇| 91丝袜人妻| 欧美天天综合站| 校园春色综合色| 玖色AV| 久久婷婷热| 久久三| 日韩高清黄片| 日韩肏逼视频| 欧美劲爆第一页| nuu12国产麻豆精品| 欧美午夜视频| 操操操操操操| 久久久久久久久久久人妻| 1024日韩| 激情久久久| 亚洲精品影视老司机| 熟女这里只有精品6| www国产无码| 久久久久久久91| 中文字幕国产| 精品视频久久区| 久久日本熟妇熟色高清 | 搡老女人911熟妇老熟女| 男女国产精品| 超碰诱惑| 久久久久成人网| 欧日韩一二三f区| 97视频免费在线| 亚洲AV不卡在线观看| 天堂综合| 亚洲自拍青操视频| 国产热RE99久久6国产精品首| 超碰调教97| 九色97| 五月婷婷丁香六月| 婷色五月| 狠狠色婷婷7777久| 狠狠狠狠狠狠| 色婷婷丁香五月| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 亚洲棕合电彰| 高潮嗯啊性感美女久久久| 超碰 av 女人天堂|