青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

sherrylso

C++博客 首頁 新隨筆 聯系 聚合 管理
  18 Posts :: 0 Stories :: 124 Comments :: 0 Trackbacks

         本文主要探討一下windows平臺上的完成端口開發及其與之相關的幾個重要的技術概念,這些概念都是與基于IOCP的開發密切相關的,對開發人員來講,又不得不給予足夠重視的幾個概念:
1) 基于IOCP實現的服務吞吐量
2)IOCP模式下的線程切換
3)基于IOCP實現的消息的亂序問題。

一、IOCP簡介
    提到IOCP,大家都非常熟悉,其基本的編程模式,我就不在這里展開了。在這里我主要是把IOCP中所提及的概念做一個基本性的總結。IOCP的基本架構圖如下:
 

如圖所示:在IOCP中,主要有以下的參與者:
--》完成端口:是一個FIFO隊列,操作系統的IO子系統在IO操作完成后,會把相應的IO packet放入該隊列。
--》等待者線程隊列:通過調用GetQueuedCompletionStatus API,在完成端口上等待取下一個IO packet。
--》執行者線程組:已經從完成端口上獲得IO packet,在占用CPU進行處理。
除了以上三種類型的參與者。我們還應該注意兩個關聯關系,即:
--》IO Handle與完成端口相關聯:任何期望使用IOCP的方式來處理IO請求的,必須將相應的IO Handle與該完成端口相關聯。需要指出的時,這里的IO Handle,可以是File的Handle,或者是Socket的Handle。
--》線程與完成端口相關聯:任何調用GetQueuedCompletionStatus API的線程,都將與該完成端口相關聯。在任何給定的時候,該線程只能與一個完成端口相關聯,與最后一次調用的GetQueuedCompletionStatus為準。
二、高并發的服務器(基于socket)實現方法
        一般來講,實現基于socket的服務器,有三種實現的方式(thread per request的方式,我就不提了:)):
第一、線程池的方式。使用線程池來對客戶端請求進行服務。使用這種方式時,當客戶端對服務器的連接是短連接(所謂的短連接,即:客戶端對服務器不是長時間連接)時,是可以考慮的。但是,如若客戶端對服務器的連接是長連接時,我們需要限制服務器端的最大連接數目為線程池線程的最大數目,而這應用的設計本身來講,是不好的設計方式,scalability會存在問題。
第二、基于Select的服務器實現。其本質是,使用Select(操作系統提供的API)來監視連接是否可讀,可寫,或者是否出錯。相比于前一種方式,Select允許應用使用一個線程(或者是有限幾個線程)來監視連接的可讀寫性。當有連接可讀可寫時,應用可以以non-bolock的方式讀寫socket上的數據。使用Select的方式的缺點是,當Select所監視的連接數目在千的數量級時,性能會打折扣。這是因為操作系統內核需要在內部對這些Socket進行輪詢,以檢查其可讀寫性。另一個問題是:應用必須在處理完所有的可讀寫socket的IO請求之后,才能再次調用Select,進行下一輪的檢查,否則會有潛在的問題。這樣,造成的結果是,對一些請求的處理會出現饑餓的現象。
        一般common的做法是Select結合Leader-Follower設計模式使用。不過不管怎樣,Select的本質造成了其在Scalability的問題是不如IOCP,這也是很多high-scalabe的服務器采用IOCP的原因。
第三、IOCP實現高并發的服務器。IOCP是實現high-scalabe的服務器的首選。其特點我們專門在下一小姐陳述。
三、IOCP開發的幾個概念
第一、服務器的吞吐量問題。
      我們都知道,基于IOCP的開發是異步IO的,也正是這一技術的本質,決定了IOCP所實現的服務器的高吞吐量。
       我們舉一個及其簡化的例子,來說明這一問題。在網絡服務器的開發過程中,影響其性能吞吐量的,有很多因素,在這里,我們只是把關注點放在兩個方面,即:網絡IO速度與Disk IO速度。我們假設:在一個千兆的網絡環境下,我們的網絡傳輸速度的極限是大概125M/s,而Disk IO的速度是10M/s。在這樣的前提下,慢速的Disk 設備會成為我們整個應用的瓶頸。我們假設線程A負責從網絡上讀取數據,然后將這些數據寫入Disk。如果對Disk的寫入是同步的,那么線程A在等待寫完Disk的過程是不能再從網絡上接受數據的,在寫入Disk的時間內,我們可以認為這時候Server的吞吐量為0(沒有接受新的客戶端請求)。對于這樣的同步讀寫Disk,一些的解決方案是通過增加線程數來增加服務器處理的吞吐量,即:當線程A從網絡上接受數據后,驅動另外單獨的線程來完成讀寫Disk任務。這樣的方案缺點是:需要線程間的合作,需要線程間的切換(這是另一個我們要討論的問題)。而IOCP的異步IO本質,就是通過操作系統內核的支持,允許線程A以非阻塞的方式向IO子系統投遞IO請求,而后馬上從網絡上讀取下一個客戶端請求。這樣,結果是:在不增加線程數的情況下,IOCP大大增加了服務器的吞吐量。說到這里,聽起來感覺很像是DMA。的確,許多軟件的實現技術,在本質上,與硬件的實現技術是相通的。另外一個典型的例子是硬件的流水線技術,同樣,在軟件領域,也有很著名的應用。好像話題扯遠了,呵呵:)
第二、線程間的切換問題。
         服務器的實現,通過引入IOCP,會大大減少Thread切換帶來的額外開銷。我們都知道,對于服務器性能的一個重要的評估指標就是:System\Context Switches,即單位時間內線程的切換次數。如果在每秒內,線程的切換次數在千的數量級上,這就意味著你的服務器性能值得商榷。Context Switches/s應該越小越好。說到這里,我們來重新審視一下IOCP。
     完成端口的線程并發量可以在創建該完成端口時指定(即NumberOfConcurrentThreads參數)。該并發量限制了與該完成端口相關聯的可運行線程的數目(就是前面我在IOCP簡介中提到的執行者線程組的最大數目)。當與該完成端口相關聯的可運行線程的總數目達到了該并發量,系統就會阻塞任何與該完成端口相關聯的后續線程的執行,直到與該完成端口相關聯的可運行線程數目下降到小于該并發量為止。最有效的假想是發生在有完成包在隊列中等待,而沒有等待被滿足,因為此時完成端口達到了其并發量的極限。此時,一個正在運行中的線程調用GetQueuedCompletionStatus時,它就會立刻從隊列中取走該完成包。這樣就不存在著環境的切換,因為該處于運行中的線程就會連續不斷地從隊列中取走完成包,而其他的線程就不能運行了。
     完成端口的線程并發量的建議值就是你系統CPU的數目。在這里,要區分清楚的是,完成端口的線程并發量與你為完成端口創建的工作者線程數是沒有任何關系的,工作者線程數的數目,完全取決于你的整個應用的設計(當然這個不宜過大,否則失去了IOCP的本意:))。
第三、IOCP開發過程中的消息亂序問題。
     使用IOCP開發的問題在于它的復雜。我們都知道,在使用TCP時,TCP協議本身保證了消息傳遞的次序性,這大大降低了上層應用的復雜性。但是當使用IOCP時,問題就不再那么簡單。如下例:
  
       三個線程同時從IOCP中讀取Msg1, Msg2,與Msg3。由于TCP本身消息傳遞的有序性,所以,在IOCP隊列內,Msg1-Msg2-Msg3保證了有序性。三個線程分別從IOCP中取出Msg1,Msg2與Msg3,然后三個線程都會將各自取到的消息投遞到邏輯層處理。在邏輯處理層的實現,我們不應該假定Msg1-Msg2-Msg3順序,原因其實很簡單,在Time 1~Time 2的時間段內,三個線程被操作系統調度的先后次序是不確定的,所以在到達邏輯處理層,
Msg1,Msg2與Msg3的次序也就是不確定的。所以,邏輯處理層的實現,必須考慮消息亂序的情況,必須考慮多線程環境下的程序實現。
        在這里,我把消息亂序的問題單列了出來。其實在IOCP的開發過程中,相比于同步的方式,應該還有其它更多的難題需要解決,這也是與Select方式相比,IOCP的缺點,實現復雜度高。
結束語:
    ACE的Proactor Framework, 對windows平臺的IOCP做了基于Proactor設計模式的,面向對象的封裝,這在一定程度上簡化了應用開發的難度,是一個很好的異步IO的開發框架,推薦學習使用。 
Reference:
    Microsoft Technet,Inside I/O Completion Ports

posted on 2007-08-26 16:06 愛上龍卷風 閱讀(16557) 評論(23)  編輯 收藏 引用

Feedback

# re: 完成端口(IOCP)編程探討[未登錄] 2007-09-05 07:15 小明
對于你提出的第三個問題,亂序問題

一般寫IOCP程序,都會讓每個socket和一個buffer關聯
只要讓WSARecv保證每次按次序的寫到buffer
然后邏輯層也按照次序的來讀取信息(需要有鎖來控制)
這樣就不會有亂序問題了。

不知道你對于這個問題有什么高招?  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2007-09-06 10:11 NULL
回答下上面的問題,你的問題就有問題,如果只有一個recv投遞,那就不會存在亂序的問題,如果你投遞n個,按順序1.2.3,但是你怎么保證recv不是按照2.3.1返回的呢?  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2007-10-20 15:30 RedFox
我也是進來討論你提出的第三個問題的。

通常的做法是一個 Socket 用一個 WSARecv 異步操作,有完成事件時,先處理完這個異步操作時,才再次發出下一個 WSARecv 異步操作。這樣就不會有你說的消息亂序問題了。

而你說的一次對同一個 socket 提交 n 個 WSARecv 操作。我認為是不可取的。
  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2007-10-21 20:15 愛上龍卷風
@RedFox
你應該弄錯了,的確,如果按照你的說法,就是單線程了,沒有多線程。
當然沒有問題。但是,你的performance是沒法保證的,幾乎沒有什么
throughput的。
  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2007-10-21 20:17 愛上龍卷風
@小明
對于你的問題,我同意NULL的解釋  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2007-10-22 08:41 RedFox
可能是我水平不夠。
的確,我是對每個 socket 做一個 WSARecv. 處理完這個 WSARecv 後我再發起下一個 WSARecv. 如果有 1000個連接,而 IOCP 裡就有 1000個 IO請求包。

而你說的一個 socket 就發起 N 個 WSARecv. 首先,讀到的數據次序不能保證,再次,如果 socket 關閉時,你也會收到 N 個關閉消息,你應該在哪個關閉消息時去釋放資源呢?  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2007-11-11 14:19 愛上龍卷風
@RedFox
你說的收到N 個關閉消息,指的是你自己定義的嗎?
不管怎么樣,引用計數技術應該能幫到你。  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-01-07 17:12 唐新發
錯別字:小組不是小姐
第三、IOCP實現高并發的服務器。IOCP是實現high-scalabe的服務器的首選。其特點我們專門在下一小姐陳述。  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-01-07 23:08 abettor.org
@RedFox
我贊同你的看法。
但是,是否有更高效的辦法呢?
我覺得如果業務邏輯層速度很慢的化,可以把按上述方法WSARecv到的數據再放到一個池里緩沖一下。不知道會不會適得其反。  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-01-11 22:09 愛上龍卷風
@abettor.org
應該不是業務邏輯層速度很慢的問題,cpu的指令執行都是很快的,除非你訪問慢速的IO設備。
對于業務邏輯層,應該提高的是并發的吞吐量。

  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-03-31 09:05 RedFox
@abettor.org

IOCP 只處理封包,收到一個完整的包後,就POST到工作線程池,由工作線程池進行分配線程處理  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-05-24 23:46 iunknown
@愛上龍卷風
你應該弄錯了,的確,如果按照你的說法,就是單線程了,沒有多線程。
當然沒有問題。但是,你的performance是沒法保證的,幾乎沒有什么
throughput的。


關于這一點,有實現過一個用單線程負責 IO 操作,線程池負責業務邏輯處理的 server framework 。負責 IO 的單線程,主要是執行 WSARecv, WSASend ,GetQueuedCompletionPort,具體的業務邏輯不在這個線程里面執行。
用這個框架實現過一個 echo server ,進行大壓力測試,發現 throughput 還是很高的。可以認為在目前的 CPU 速度下,只是執行 WSARecv,WSASend,GetQueuedCompletionPort ,還是足夠快的。
如果在同一臺機運行 client 和 server,測試的結果是可以達到每秒 send 10萬, recv 10萬。  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-05-24 23:49 iunknown
@RedFox
我也是進來討論你提出的第三個問題的。

通常的做法是一個 Socket 用一個 WSARecv 異步操作,有完成事件時,先處理完這個異步操作時,才再次發出下一個 WSARecv 異步操作。這樣就不會有你說的消息亂序問題了。

而你說的一次對同一個 socket 提交 n 個 WSARecv 操作。我認為是不可取的。


也是用這個方法來實現的,這樣做會比較簡單,可以避免消息的亂序問題。而且在關閉 socket 釋放資源的時候,也相對容易控制。  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-05-29 16:56 愛上龍卷風
@iunknown
關于你提到的框架,本質上是多線線程的。負責 IO 的線程數目理論上本來就應該是你機器cpu的個數。前提是你保證你的io設計是異步執行的。  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-06-09 17:14 iunknown
@愛上龍卷風
>>>關于你提到的框架,本質上是多線線程的。負責 IO 的線程數目理論上本來就應該是你機器cpu的個數。前提是你保證你的io設計是異步執行的。

框架中用到了多線程,不過用于處理 IOCP 的線程(或者稱為用于處理前端網絡 IO 的線程)就只有一個。后端的線程池是用于處理具體的業務的,不會涉及前端的網絡 IO 的。前端的網絡 IO 可以非常清晰地剝離出來,由一個單獨的線程來負責。在 input 的時候,在前端的 IO 線程中讀入數據,放入 inputqueue,線程池負責 inputqueue;output 的時候,線程池把結果放入 outputqueue ,前端 IO 線程負責處理 outputqueue 。  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-06-09 17:19 iunknown
這里有一個用 zero byte buffer 策略集成 iocp 到 libevent 的方案。
具體的源代碼:http://spserver.googlecode.com/files/libevent-1.4.4-iocp-3.zip

vc6 的 dsw 文件在 libevent-1.4.4-iocp-3/libevent-iocp 目錄中。
這個方案就是單線程負責 IO ,里面有 echo_iocp.exe 和 testiocpstress.exe ,可以試試看它的性能。

方案的描述可以看看
http://monkeymail.org/archives/libevent-users/2008-June/001269.html  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-06-23 23:41 飯中淹
多個recv可以在overlapped上進行順序綁定
recv請求的順序,決定了它收到的數據的先后順序。
只要進行簡單的排序,就可以保證recv的數據的順序正確。

如果用多個recv的話,可以直接去掉recvbuf了。對于一個socket,去掉recvbuf相當于是減少了內存復制,因為Io層會把WSARecv進去的buf拿來直接作為緩沖來保存收到的數據。

如果不去掉recvbuf,那么多recv就看起來不是那么有意義了。



另外,iocp的程序可以寫的比較Open一點,不要老想著節省內存。對于buffer和overlapped結構,可以分別用一個池來管理,而不是固定寫死。這樣不需要等待處理完一次受到的buffer,就能緊接著發出下一次recv,而且在這個過程中overlapped這個結構還能夠重用,效率自然就會提升的。




  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2008-10-23 17:15 r2100
@NULL
回答下上面的問題,你的問題就有問題,如果只有一個recv投遞,那就不會存在亂序的問題,如果你投遞n個,按順序1.2.3,但是你怎么保證recv不是按照2.3.1返回的呢?
分別給1.2.3的overlapped做上記號1.2.3,返回時加個排序就可以了。

  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2009-10-19 17:42 @jurver
我同意@RedFox的觀點。
1.給一個socket投遞多個Recv,只有在數據需要復制到自己的緩沖區(有可能有多個緩沖區)的情況。多數情況下并不需要。對一個socket投遞多個recv請求。由于接收到的數據也是按發送的順序,而完成端口是按隊列來處理的。所以接收的數據是按投遞的接收請求復制到自己的緩沖區。舉例:你的本意是接受1.“hello”;2."MM";3."GG".而假設發送的順序是3;2;1;,那么第一個recv原本希望得到1 "hello",可是現在得到了 3“GG”。就會和你本意相差甚遠,所以多個Recv投遞是不理想的。根本不可取。還不如接收到數據,復制出來。再接收。  回復  更多評論
  

# re: 完成端口(IOCP)編程探討[未登錄] 2010-01-29 18:06 wang
樓主的設計 優點是可以增大吞吐量
擁有多個掛起的讀操作增加了服務器的吞吐量,這是因為TCP/IP包將會被直接寫到我們傳入的buffer而不是TCP/IP棧(不會有雙緩沖)。

其它同學的設計也有優點,采用什么樣的設計 取決于你的業務,

但如何 避免亂序呢? 我想到一個辦法 每個掛起的讀 都有一個序列號,讀成功后按照這些序列號 再排序 組合包 。

歡迎探討 wanglovec@163.com QQ: 50713022  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2011-04-06 17:37 Geph0rce
@唐新發
小節  回復  更多評論
  

# re: 完成端口(IOCP)編程探討[未登錄] 2012-07-04 16:10 1
good  回復  更多評論
  

# re: 完成端口(IOCP)編程探討 2012-12-25 14:06 ILOLI
@@jurver
你這樣收到數據亂序是發送端的問題,和接收端沒有半毛錢的關系。  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲黄色大片| 欧美一区二区三区久久精品茉莉花 | 欧美激情视频给我| 欧美成人精品福利| 亚洲福利视频免费观看| 亚洲你懂的在线视频| 免费观看成人网| 欧美性一区二区| 国产精品欧美一区喷水| 国产区亚洲区欧美区| 在线欧美亚洲| 日韩一级视频免费观看在线| 夜夜嗨av一区二区三区免费区| 亚洲午夜羞羞片| 欧美国产一区二区| 羞羞视频在线观看欧美| 91久久中文| 欧美激情五月| 久久嫩草精品久久久精品| 午夜宅男欧美| 欧美一区二区三区精品电影| 亚洲调教视频在线观看| 亚洲国内精品| 久久久久久久999精品视频| 久久亚洲精品伦理| 最新亚洲电影| 香蕉国产精品偷在线观看不卡| 久久久国产91| 欧美午夜精品| 亚洲黄色高清| 久久久www| 亚洲美女免费精品视频在线观看| 亚洲一二三区在线| 欧美成人免费在线| 国精品一区二区三区| 日韩五码在线| 久久综合网络一区二区| 中文网丁香综合网| 欧美大片在线观看一区二区| 国产日韩欧美中文| 亚洲专区一区二区三区| 亚洲国产视频一区二区| 欧美在线视频一区二区三区| 欧美性色视频在线| 日韩一区二区精品视频| 免费高清在线视频一区·| 亚洲在线一区二区| 欧美日韩hd| 亚洲精品日韩综合观看成人91| 久久久久久久一区二区三区| 亚洲午夜国产成人av电影男同| 欧美激情va永久在线播放| 亚洲第一区在线观看| 久久理论片午夜琪琪电影网| 亚洲欧美日韩一区二区三区在线观看 | 久久九九热re6这里有精品| 国产精品久久久对白| 亚洲一区二区欧美日韩| 欧美日韩一区二区三区免费| 欧美巨乳在线| 欧美日本成人| 国产日韩精品一区二区浪潮av| 久久精品视频免费播放| 欧美激情视频一区二区三区免费 | 久久视频这里只有精品| 这里是久久伊人| 欧美日韩精品不卡| 亚洲一区二区三区国产| 欧美女激情福利| 久久久久综合网| 欧美精品999| 欧美日韩视频在线| 国产精品网站在线| 午夜视频一区在线观看| 日韩视频免费在线| 欧美色欧美亚洲另类七区| 国产精品99久久久久久久vr | 日韩网站免费观看| 亚洲欧洲日本国产| 欧美日本精品一区二区三区| 99精品欧美一区| 一本久道久久久| 欧美一级久久久| 久久久www成人免费无遮挡大片 | 国内精品久久久久影院 日本资源| 久久国产欧美| 亚洲欧洲日本国产| 国产精品yjizz| 久久国产一区二区| 免费观看在线综合| 亚洲少妇在线| 久久av老司机精品网站导航| 亚洲国产网站| 午夜激情亚洲| 亚洲毛片网站| 性欧美1819sex性高清| 最新国产成人av网站网址麻豆| 日韩午夜免费| 好吊色欧美一区二区三区四区| 亚洲高清免费视频| 国产欧美一区二区三区在线看蜜臀 | 欧美成人亚洲成人日韩成人| 亚洲伊人伊色伊影伊综合网| 久久精品国产精品亚洲| 中文在线一区| 国外成人在线| avtt综合网| 欧美在线高清视频| 一区二区精品在线| 久久人人爽人人爽| 午夜日韩福利| 欧美激情精品久久久久久久变态 | 欧美在线视频导航| 欧美伦理a级免费电影| 久久在线视频在线| 国产精品美腿一区在线看| 亚洲国产精品成人va在线观看| 国产日韩精品在线观看| 中文国产成人精品| 野花国产精品入口| 久久欧美肥婆一二区| 久久国内精品视频| 欧美性jizz18性欧美| 亚洲欧洲午夜| 在线日本高清免费不卡| 久久99在线观看| 欧美在线国产精品| 欧美视频国产精品| 亚洲美女毛片| 日韩视频永久免费| 免费成人高清视频| 欧美mv日韩mv亚洲| 在线免费精品视频| 久久久久久久精| 久久视频国产精品免费视频在线| 国产精品毛片大码女人| 亚洲特级片在线| 亚洲一区图片| 国产精品久久久久久久久| 中文日韩在线视频| 欧美一区二区久久久| 国产精品美女午夜av| 亚洲一区久久久| 久久精品1区| 精品9999| 欧美jizzhd精品欧美巨大免费| 欧美二区在线| 亚洲精选成人| 欧美日韩麻豆| 亚洲欧美日韩一区二区三区在线观看| 欧美一区激情| 永久555www成人免费| 欧美成人一区在线| 夜夜爽99久久国产综合精品女不卡| 亚洲视频久久| 国产一区二区三区在线观看免费 | 国产精品r级在线| 亚洲天堂成人在线观看| 久久gogo国模裸体人体| 精品成人国产| 欧美日本免费| 欧美一级免费视频| 亚洲国产岛国毛片在线| 中日韩男男gay无套| 国产欧美激情| 麻豆视频一区二区| 亚洲国产综合视频在线观看| 中文国产成人精品久久一| 国产精品毛片va一区二区三区| 国产精品亚洲综合色区韩国| 欧美中文在线观看国产| 蜜桃久久av| 欧美日韩蜜桃| 亚洲电影在线| 久久综合电影| 亚洲永久在线| 亚洲精品影视| 久久久久久尹人网香蕉| 亚洲国产一区二区三区高清| 久久国产色av| 亚洲福利在线观看| 亚洲天堂男人| 亚洲美女在线国产| 国产精品久久久久aaaa九色| 久久福利视频导航| 亚洲精品久久视频| 久久精品国产69国产精品亚洲| 精久久久久久| 国产精品视频专区| 久久精品一区二区三区中文字幕 | 免费在线观看一区二区| 99视频超级精品| 欧美国产视频日韩| 久久国产精彩视频| 亚洲一区二区三区四区在线观看 | 夜夜爽夜夜爽精品视频| 亚洲高清不卡| 欧美.www| 久久尤物视频| 欧美专区18|