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

直擊案發現場!TCP 10倍延遲的真相是?

企業動態
什么是經驗?就是遇到問題,解決問題,總結方法。遇到的問題多了,解決的辦法多了,經驗自然就積累出來了。

什么是經驗?就是遇到問題,解決問題,總結方法。遇到的問題多了,解決的辦法多了,經驗自然就積累出來了。今天的文章是阿里技術專家蟄劍在工作中遇到的一個問題引發的對TCP性能和發送接收Buffer關系的系列思考(問題:應用通過專線從公司訪問阿里云上的服務,專線100M,時延20ms,一個SQL查詢了22M數據出現10倍+的信息延遲,不正常。)希望,你也能從中得到啟發。

前言

本文希望解析清楚,當我們在代碼中寫下 socket.setSendBufferSize 和 sysctl 看到的rmem/wmem系統參數以及最終我們在TCP常常談到的接收發送窗口的關系,以及他們怎樣影響TCP傳輸的性能。

先明確一下:文章標題中所說的Buffer指的是sysctl中的 rmem或者wmem,如果是代碼中指定的話對應著SO_SNDBUF或者SO_RCVBUF,從TCP的概念來看對應著發送窗口或者接收窗口。

TCP性能和發送接收Buffer的關系

相關參數:

  1. $sudo sysctl -a | egrep "rmem|wmem|adv_win|moderate" 
  2. net.core.rmem_default = 212992 
  3. net.core.rmem_max = 212992 
  4. net.core.wmem_default = 212992 
  5. net.core.wmem_max = 212992 
  6. net.ipv4.tcp_adv_win_scale = 1 
  7. net.ipv4.tcp_moderate_rcvbuf = 1 
  8. net.ipv4.tcp_rmem = 4096    87380   6291456 
  9. net.ipv4.tcp_wmem = 4096    16384   4194304 
  10. net.ipv4.udp_rmem_min = 4096 
  11. net.ipv4.udp_wmem_min = 4096 
  12. vm.lowmem_reserve_ratio = 256   256 32 

先從碰到的一個問題看起:

應用通過專線從公司訪問阿里云上的服務,專線100M,時延20ms,一個SQL查詢了22M數據,結果花了大概25秒,這太慢了,不正常。如果通過云上client訪問云上服務那么1-2秒就返回了(說明不跨網絡服務是正常的)。如果通過http或者scp從公司向云上傳輸這22M的數據大概兩秒鐘也傳送完畢了(說明網絡帶寬不是瓶頸),所以這里問題的原因基本上是我們的服務在這種網絡條件下有性能問題,需要找出為什么。 

抓包 tcpdump+wireshark

這個查詢結果22M的需要25秒,如下圖(wireshark 時序圖),橫軸是時間,縱軸是sequence number:

粗一看沒啥問題,因為時間太長掩蓋了問題。把這個圖形放大,就看中間50ms內的傳輸情況(橫軸是時間,縱軸是sequence number,一個點代表一個包)。 


換個角度,看看窗口尺寸圖形:

從bytes in flight也大致能算出來總的傳輸時間 16K*1000/20=800Kb/秒我們的應用會默認設置 socketSendBuffer 為16K:

socket.setSendBufferSize(16*1024) //16K send buffer

來看一下tcp包發送流程:

圖片來源:陶輝

如果sendbuffer不夠就會卡在上圖中的第一步 sk_stream_wait_memory,通過systemtap腳本可以驗證:

  1. #!/usr/bin/stap 
  2. # Simple probe to detect when a process is waiting for more socket send 
  3. # buffer memory. Usually means the process is doing writes larger than the 
  4. # socket send buffer size or there is a slow receiver at the other side. 
  5. # Increasing the socket's send buffer size might help decrease application 
  6. # latencies, but it might also make it worse, so buyer beware. 
  7.  
  8. # Typical outputtimestamp in microseconds: procname(pid) event 
  9. # 1218230114875167: python(17631) blocked on full send buffer 
  10. # 1218230114876196: python(17631) recovered from full send buffer 
  11. # 1218230114876271: python(17631) blocked on full send buffer 
  12. # 1218230114876479: python(17631) recovered from full send buffer 
  13. probe kernel.function("sk_stream_wait_memory"
  14.     printf("%u: %s(%d) blocked on full send buffern"
  15.         gettimeofday_us(), execname(), pid()) 
  16.  
  17. probe kernel.function("sk_stream_wait_memory").return 
  18.     printf("%u: %s(%d) recovered from full send buffern"
  19.         gettimeofday_us(), execname(), pid()) 

原理解析

如果tcp發送buffer也就是SO_SNDBUF只有16K的話,這些包很快都發出去了,但是這16K不能立即釋放出來填新的內容進去,因為tcp要保證可靠,萬一中間丟包了呢。只有等到這16K中的某些包ack了,才會填充一些新包進來然后繼續發出去。由于這里rt基本是20ms,也就是16K發送完畢后,等了20ms才收到一些ack,這20ms應用、內核什么都不能做,所以就是如第二個圖中的大概20ms的等待平臺。

sendbuffer相當于發送倉庫的大小,倉庫的貨物都發走后,不能立即騰出來發新的貨物,而是要等對方確認收到了(ack)才能騰出來發新的貨物。 傳輸速度取決于發送倉庫(sendbuffer)、接收倉庫(recvbuffer)、路寬(帶寬)的大小,如果發送倉庫(sendbuffer)足夠大了之后接下來的瓶頸就是高速公路了(帶寬、擁塞窗口)。

如果是UDP,就沒有可靠的概念,有數據統統發出去,根本不關心對方是否收到,也就不需要ack和這個發送buffer了。

幾個發送buffer相關的內核參數:

  1. vm.lowmem_reserve_ratio = 256   256     32 
  2. net.core.wmem_max = 1048576 
  3. net.core.wmem_default = 124928 
  4. net.ipv4.tcp_wmem = 4096        16384   4194304 
  5. net.ipv4.udp_wmem_min = 4096 

net.ipv4.tcp_wmem 默認就是16K,而且是能夠動態調整的,只不過我們代碼中這塊的參數是很多年前從Cobra中繼承過來的,初始指定了sendbuffer的大小。代碼中設置了這個參數后就關閉了內核的動態調整功能,但是能看到http或者scp都很快,因為他們的send buffer是動態調整的,所以很快。

接收buffer是有開關可以動態控制的,發送buffer沒有開關默認就是開啟,關閉只能在代碼層面來控制:

  1. net.ipv4.tcp_moderate_rcvbuf 

優化

調整 socketSendBuffer 到256K,查詢時間從25秒下降到了4秒多,但是比理論帶寬所需要的時間略高。

繼續查看系統 net.core.wmem_max 參數默認最大是130K,所以即使我們代碼中設置256K實際使用的也是130K,調大這個系統參數后整個網絡傳輸時間大概2秒(跟100M帶寬匹配了,scp傳輸22M數據也要2秒),整體查詢時間2.8秒。測試用的mysql client短連接,如果代碼中的是長連接的話會塊300-400ms(消掉了慢啟動階段),這基本上是理論上最快速度了。

如果指定了tcp_wmem,則net.core.wmem_default被tcp_wmem的覆蓋。send Buffer在tcp_wmem的最小值和最大值之間自動調整。如果調用setsockopt()設置了socket選項SO_SNDBUF,將關閉發送端緩沖的自動調節機制,tcp_wmem將被忽略,SO_SNDBUF的最大值由net.core.wmem_max限制。

BDP 帶寬時延積

BDP=rtt*(帶寬/8)

這個 buffer 調到1M測試沒有幫助,從理論計算BDP(帶寬時延積) 0.02秒*(100MB/8)=250Kb 所以SO_SNDBUF為256Kb的時候基本能跑滿帶寬了,再大實際意義也不大了。也就是前面所說的倉庫足夠后瓶頸在帶寬上了。

因為BDP是250K,也就是擁塞窗口(帶寬、接收窗口和rt決定的)即將成為新的瓶頸,所以調大buffer沒意義了。

用tc構造延時和帶寬限制的模擬重現環境

  1. sudo tc qdisc del dev eth0 root netem delay 20ms 
  2. sudo tc qdisc add dev eth0 root tbf rate 500kbit latency 50ms burst 15kb 

這個案例關于wmem的結論

默認情況下Linux系統會自動調整這個buffer(net.ipv4.tcp_wmem), 也就是不推薦程序中主動去設置SO_SNDBUF,除非明確知道設置的值是最優的。

從這里我們可以看到,有些理論知識點雖然我們知道,但是在實踐中很難聯系起來,也就是常說的無法學以致用,最開始看到抓包結果的時候比較懷疑發送、接收窗口之類的,沒有直接想到send buffer上,理論跟實踐的鴻溝。

說完發送Buffer(wmem)接下來我們接著一看看接收buffer(rmem)和接收窗口的情況

用這樣一個案例下來驗證接收窗口的作用:

有一個batch insert語句,整個一次要插入5532條記錄,所有記錄大小總共是376K。SO_RCVBUF很小的時候并且rtt很大對性能的影響

如果rtt是40ms,總共需要5-6秒鐘:

基本可以看到server一旦空出來點窗口,client馬上就發送數據,由于這點窗口太小,rtt是40ms,也就是一個rtt才能傳3456字節的數據,整個帶寬才80-90K,完全沒跑滿。

 

比較明顯間隔 40ms 一個等待臺階,臺階之間兩個包大概3K數據,總的傳輸效率如下:

 

斜線越陡表示速度越快,從上圖看整體SQL上傳花了5.5秒,執行0.5秒。

此時對應的窗口尺寸:

 

窗口由最開始28K(20個1448)很快降到了不到4K的樣子,然后基本游走在即將滿的邊緣,雖然讀取慢,幸好rtt也大,導致最終也沒有滿。(這個是3.1的Linux,應用SO_RCVBUF設置的是8K,用一半來做接收窗口)。

SO_RCVBUF很小的時候并且rtt很小時對性能的影響

如果同樣的語句在 rtt 是0.1ms的話:

雖然明顯看到接收窗口經常跑滿,但是因為rtt很小,一旦窗口空出來很快就通知到對方了,所以整個過小的接收窗口也沒怎么影響到整體性能。

 

如上圖11.4秒整個SQL開始,到11.41秒SQL上傳完畢,11.89秒執行完畢(執行花了0.5秒),上傳只花了0.01秒,接收窗口情況:

 

如圖,接收窗口由最開始的28K降下來,然后一直在5880和滿了之間跳動:

 

從這里可以得出結論,接收窗口的大小對性能的影響,rtt越大影響越明顯,當然這里還需要應用程序配合,如果應用程序一直不讀走數據即使接收窗口再大也會堆滿的。

SO_RCVBUF和tcp window full的壞case

 

上圖中紅色平臺部分,停頓了大概6秒鐘沒有發任何有內容的數據包,這6秒鐘具體在做什么如下圖所示,可以看到這個時候接收方的TCP Window Full,同時也能看到接收方(3306端口)的TCP Window Size是8192(8K),發送方(27545端口)是20480。

 

這個狀況跟前面描述的recv buffer太小不一樣,8K是很小,但是因為rtt也很小,所以server總是能很快就ack收到了,接收窗口也一直不容易達到full狀態,但是一旦接收窗口達到了full狀態,居然需要驚人的6秒鐘才能恢復,這等待的時間有點太長了。這里應該是應用讀取數據太慢導致了耗時6秒才恢復,所以最終這個請求執行會非常非常慢(時間主要耗在了上傳SQL而不是執行SQL)。

實際原因不知道,從讀取TCP數據的邏輯來看這里沒有明顯的block,可能的原因:

  • request的SQL太大,Server(3306端口上的服務)從TCP讀取SQL需要放到一塊分配好的內存,內存不夠的時候需要擴容,擴容有可能觸發fgc,從圖形來看,第一次滿就卡頓了,而且每次滿都卡頓,不像是這個原因
  • request請求一次發過來的是多個SQL,應用讀取SQL后,將SQL分成多個,然后先執行第一個,第一個執行完后返回response,再讀取第二個。圖形中卡頓前沒有response返回,所以也不是這個原因。
  • ……其它未知原因

接收方不讀取數據導致的接收窗口滿同時有丟包發生

服務端返回數據到client端,TCP協議棧ack這些包,但是應用層沒讀走包,這個時候 SO_RCVBUF 堆積滿,client的TCP協議棧發送 ZeroWindow 標志給服務端。也就是接收端的 buffer 堆滿了(但是服務端這個時候看到的bytes in fly是0,因為都ack了),這時服務端不能繼續發數據,要等 ZeroWindow 恢復。

那么接收端上層應用不讀走包可能的原因:

  • 應用代碼卡頓、GC等等

應用代碼邏輯上在做其它事情(比如Server將SQL分片到多個DB上,Server先讀取第一個分片,如果第一個分片數據很大很大,處理也慢,那么第二個分片數據都返回到了TCP buffer,也沒去讀取其它分片的結果集,直到第一個分片讀取完畢。如果SQL帶排序,那么Server。

  • 會輪詢讀取多個分片,造成這種卡頓的概率小了很多

上圖這個流因為應用層不讀取TCP數據,導致TCP接收Buffer滿,進而接收窗口為0,server端不能再發送數據而卡住,但是ZeroWindow的探測包,client都有正常回復,所以1903秒之后接收方窗口不為0后(window update)傳輸恢復。

這個截圖和前一個類似,是在Server上(3003端口)抓到的包,不同的是接收窗口為0后,server端多次探測(Server上抓包能看到),但是client端沒有回復 ZeroWindow(也有可能是回復了,但是中間環節把ack包丟了,或者這個探測包client沒收到),造成server端認為client死了、不可達之類,進而反復重傳,重傳超過15次之后,server端認為這個連接死了,粗暴單方面斷開(沒有reset和fin,因為沒必要,server認為網絡連通性出了問題)。

等到1800秒后,client的接收窗口恢復了,發個window update給server,這個時候server認為這個連接已經斷開了,只能回復reset。

網絡不通,重傳超過一定的時間(tcp_retries2)然后斷開這個連接是正常的,這里的問題是:

為什么這種場景下丟包了,而且是針對某個stream一直丟包?

可能是因為這種場景下觸發了中間環節的流量管控,故意丟包了(比如proxy、slb、交換機都有可能做這種選擇性的丟包)。

這里server認為連接斷開,沒有發reset和fin,因為沒必要,server認為網絡連通性出了問題。client還不知道server上這個連接清理掉了,等client回復了一個window update,server早就認為這個連接早斷了,突然收到一個update,莫名其妙,只能reset。

接收窗口和SO_RCVBUF的關系

初始接收窗口一般是 mss乘以初始cwnd(為了和慢啟動邏輯兼容,不想一下子沖擊到網絡),如果沒有設置SO_RCVBUF,那么會根據 net.ipv4.tcp_rmem 動態變化,如果設置了SO_RCVBUF,那么接收窗口要向下面描述的值靠攏。

初始cwnd可以大致通過查看到:

  1. ss -itmpn dst "10.81.212.8" 
  2. State      Recv-Q Send-Q Local Address:Port  Peer Address:Port 
  3. ESTAB      0      0      10.xx.xx.xxx:22     10.yy.yy.yyy:12345  users:(("sshd",pid=1442,fd=3)) 
  4.          skmem:(r0,rb369280,t0,tb87040,f4096,w0,o0,bl0,d92) 
  5.  
  6. Here we can see this socket has Receive Buffer 369280 bytes, and Transmit Buffer 87040 bytes. 
  7. Keep in mind the kernel will double any socket buffer allocation for overhead. 
  8. So a process asks for 256 KiB buffer with setsockopt(SO_RCVBUF) then it will get 512 KiB buffer 
  9. space. This is described on man 7 tcp. 

初始窗口計算的代碼邏輯,重點在18行:

  1. /* TCP initial congestion window as per rfc6928 */ 
  2. #define TCP_INIT_CWND           10 
  3.  
  4.  
  5. /* 3. Try to fixup all. It is made immediately after connection enters 
  6.  *    established state. 
  7.  */ 
  8. void tcp_init_buffer_space(struct sock *sk) 
  9.         int tcp_app_win = sock_net(sk)->ipv4.sysctl_tcp_app_win; 
  10.         struct tcp_sock *tp = tcp_sk(sk); 
  11.         int maxwin; 
  12.  
  13.         if (!(sk->sk_userlocks & SOCK_SNDBUF_LOCK)) 
  14.                 tcp_sndbuf_expand(sk); 
  15.  
  16.         //初始最大接收窗口計算過程 
  17.         tp->rcvq_space.space = min_t(u32, tp->rcv_wnd, TCP_INIT_CWND * tp->advmss); 
  18.         tcp_mstamp_refresh(tp); 
  19.         tp->rcvq_space.time = tp->tcp_mstamp; 
  20.         tp->rcvq_space.seq = tp->copied_seq; 
  21.  
  22.         maxwin = tcp_full_space(sk); 
  23.  
  24.         if (tp->window_clamp >= maxwin) { 
  25.                 tp->window_clamp = maxwin; 
  26.  
  27.                 if (tcp_app_win && maxwin > 4 * tp->advmss) 
  28.                         tp->window_clamp = max(maxwin - 
  29.                                                (maxwin >> tcp_app_win), 
  30.                                                4 * tp->advmss); 
  31.         } 
  32.  
  33.         /* Force reservation of one segment. */ 
  34.         if (tcp_app_win && 
  35.             tp->window_clamp > 2 * tp->advmss && 
  36.             tp->window_clamp + tp->advmss > maxwin) 
  37.                 tp->window_clamp = max(2 * tp->advmss, maxwin - tp->advmss); 
  38.  
  39.         tp->rcv_ssthresh = min(tp->rcv_ssthresh, tp->window_clamp); 
  40.         tp->snd_cwnd_stamp = tcp_jiffies32; 

傳輸過程中,最大接收窗口會動態調整,當指定了SO_RCVBUF后,實際buffer是兩倍SO_RCVBUF,但是要分出一部分(2^net.ipv4.tcp_adv_win_scale)來作為亂序報文緩存。

  1. net.ipv4.tcp_adv_win_scale = 2 //2.6內核,3.1中這個值默認是1。 

如果SO_RCVBUF是8K,總共就是16K,然后分出2^2分之一,也就是4分之一,還剩12K當做接收窗口;如果設置的32K,那么接收窗口是48K。

  1. static inline int tcp_win_from_space(const struct sock *sk, int space
  2. {//space 傳入的時候就已經是 2*SO_RCVBUF了 
  3.         int tcp_adv_win_scale = sock_net(sk)->ipv4.sysctl_tcp_adv_win_scale; 
  4.  
  5.         return tcp_adv_win_scale <= 0 ? 
  6.                 (space>>(-tcp_adv_win_scale)) : 
  7.                 space - (space>>tcp_adv_win_scale); //sysctl參數tcp_adv_win_scale 

接收窗口有最大接收窗口和當前可用接收窗口。

一般來說一次中斷基本都會將 buffer 中的包都取走。

 

綠線是最大接收窗口動態調整的過程,最開始是1460*10,握手完畢后略微調整到1472*10(可利用body增加了12),隨著數據的傳輸開始跳漲。

 

上圖是四個batch insert語句,可以看到綠色接收窗口隨著數據的傳輸越來越大,圖中藍色豎直部分基本表示SQL上傳,兩個藍色豎直條的間隔代表這個insert在服務器上真正的執行時間。這圖非常陡峭,表示上傳沒有任何瓶頸。

設置 SO_RCVBUF 后通過wireshark觀察到的接收窗口基本

下圖是設置了 SO_RCVBUF 為8192的實際情況:

 

從最開始的14720,執行第一個create table語句后降到14330,到真正執行batch insert就降到了8192*1.5. 然后一直保持在這個值。

If you set a "receive buffer size" on a TCP socket, what does it actually mean?

The naive answer would go something along the lines of: the TCP receive buffer setting indicates the maximum number of bytes a read() syscall could retrieve without blocking.

Note that if the buffer size is set with setsockopt(), the value returned with getsockopt() is always double the size requested to allow for overhead. This is described in man 7 socket.

總結

  • 一般來說絕對不要在程序中手工設置SO_SNDBUF和SO_RCVBUF,內核自動調整比你做的要好;
  • SO_SNDBUF一般會比發送滑動窗口要大,因為發送出去并且ack了的才能從SO_SNDBUF中釋放;
  • TCP接收窗口跟SO_RCVBUF關系很復雜;
  • SO_RCVBUF太小并且rtt很大的時候會嚴重影響性能;
  • 接收窗口比發送窗口復雜多了;
  • 發送窗口/SO_SNDBUF--發送倉庫,帶寬/擁塞窗口--馬路通暢程度,接收窗口/SO_RCVBUF--接收倉庫;
  • 發送倉庫、馬路通暢程度、接收倉庫一起決定了傳輸速度--類比一下快遞過程。

總之記住一句話:不要設置socket的SO_SNDBUF和SO_RCVBUF。

 

責任編輯:武曉燕 來源: 阿里技術
相關推薦

2009-06-12 16:55:10

VPN客戶端故障

2014-03-18 14:11:07

SAPd-code

2014-05-22 09:23:33

Teradata 大數據天睿

2011-09-25 23:03:39

2013-05-07 20:53:44

2013GMGC移動開發手游開發

2010-12-08 09:37:53

Chrome OSGoogle

2010-12-01 13:21:32

TechED2010

2013-07-25 14:44:31

ChinaJoy

2009-10-12 15:26:28

2009 Oracle

2022-05-17 11:16:33

軟件開發優化

2015-10-28 09:52:12

vForum2015

2020-02-26 11:45:05

RSACRSA大會綠盟科技

2010-12-02 13:41:26

SQL AzureTechED 2010

2014-07-16 18:47:05

2014-07-16 12:06:26

SyScan360

2014-11-25 11:03:36

2014WOT彈性計算

2009-11-24 10:21:46

2021-09-17 16:00:54

智博會數字化
點贊
收藏

51CTO技術棧公眾號

国产精品123| 国产一区国产二区国产三区| 亚洲欧美乱综合| 51精品国产人成在线观看 | 国产午夜福利100集发布| 午夜精品久久久久久久99| 极品少妇一区二区三区| 亚洲男人天堂网| 五月天丁香花婷婷| 自拍一区在线观看| 1024成人网| 免费久久久一本精品久久区| 一区二区久久精品66国产精品| 伊人久久久大香线蕉综合直播| 亚洲欧美日韩在线高清直播| 日本黄大片一区二区三区| 99热99re6国产在线播放| 久久久久99精品一区| 99精品99久久久久久宅男| 亚洲精品久久久久久久蜜桃| 韩日在线一区| 久久精品亚洲国产| 蜜桃久久精品成人无码av| 粉嫩的18在线观看极品精品| 欧美日韩免费高清一区色橹橹| 僵尸世界大战2 在线播放| 男人影院在线观看| 国产亚洲一区二区三区| 国产在线资源一区| 不卡视频在线播放| 精品一区二区免费视频| 国产精品久久久久久久久久东京| 国产稀缺真实呦乱在线| 欧美在线不卡| 久久激情视频免费观看| 日韩毛片无码永久免费看| 校花撩起jk露出白色内裤国产精品| 日韩一卡二卡三卡| 中文字幕 日韩 欧美| 四虎成人在线| 在线亚洲一区二区| 久久久久久久久久久久久久国产| а√天堂中文资源在线bt| 一区二区三区波多野结衣在线观看| 午夜精品视频在线观看一区二区 | 日韩av免费在线| 一级在线观看视频| 国产精品嫩草影院在线看| 亚洲精品电影在线| 黄色性视频网站| av毛片精品| 欧美videofree性高清杂交| 午夜视频在线观| 成人在线视频国产| 欧美一三区三区四区免费在线看 | 亚洲国产成人精品激情在线| 欧美黄色aaaa| 久久久久国产精品www| 久草视频免费在线播放| 欧美午夜a级限制福利片| 欧美激情久久久久| 国产一级视频在线播放| 亚洲福利一区| 欧美亚洲在线播放| 国产又粗又猛又黄视频| 日韩黄色免费网站| 91精品国产综合久久香蕉的用户体验 | 黄色工厂在线观看| 免费看日本一区二区| 亚洲欧美精品中文字幕在线| 久久9999免费视频| 久久久天堂av| 日韩精品一区二区三区四区五区| 国产在线免费观看| 国产精品视频一二三区| 亚洲五月六月| 在线中文免费视频| 午夜精品免费在线观看| 黄色成人在线播放| 91久久久久久久久久久| av中文字幕在线免费观看| 懂色av一区二区在线播放| 精品不卡在线| av亚洲在线| 亚洲视频一二三区| 免费看毛片的网址| 色婷婷综合久久久中字幕精品久久| 在线看不卡av| 亚欧精品在线视频| 日本天堂一区| 日韩在线视频线视频免费网站| 不卡一区二区在线观看| 日韩.com| 国产+人+亚洲| 中文字幕 国产| 国产大片一区二区| 久久久久久高清| 黄色免费在线网站| 欧美日韩一二三四五区| 亚洲va在线va天堂va偷拍| 中文字幕一区二区三区中文字幕| 亚洲免费av片| 久久久国产精品人人片| 日韩成人精品在线| www.久久久| aⅴ在线视频男人的天堂| 亚洲国产成人av网| 日本中文字幕二区| 日韩深夜影院| 欧美激情免费观看| 中文字幕日本人妻久久久免费| 成人久久久精品乱码一区二区三区| 日韩欧美精品在线不卡| 2001个疯子在线观看| 欧美精品 国产精品| 波多野结衣办公室33分钟| 欧美视频不卡| 91久久夜色精品国产网站| 你懂的好爽在线观看| 亚洲国产日韩a在线播放性色| 激情六月丁香婷婷| 精品亚洲自拍| 欧美国产极速在线| 国产精品无码久久av| 国产性色一区二区| 成年人观看网站| 91九色鹿精品国产综合久久香蕉| 色噜噜久久综合伊人一本| 四虎成人永久免费视频| 成人综合在线观看| 国产卡一卡二在线| 成人四虎影院| 一本一道久久a久久精品逆3p| 日韩少妇高潮抽搐| 成人午夜在线免费| 日本福利视频在线观看| 永久免费观看精品视频| 色爱精品视频一区| 中文字幕一二区| 中文字幕巨乱亚洲| 丝袜制服一区二区三区| 国内精品久久久久久久久电影网 | 天堂av最新在线| 欧美丰满少妇xxxbbb| 国产在线免费看| 美女精品一区二区| 亚洲欧美久久234| 91成人抖音| 丝袜美腿精品国产二区| 中文字幕一级片| 亚洲少妇最新在线视频| 永久av免费在线观看| 中文字幕一区二区精品区| 成人写真视频福利网| 成人在线观看免费网站| 欧美一二三四区在线| 美女视频黄免费| 国产成人a级片| 每日在线观看av| 日日狠狠久久偷偷综合色| 91成人天堂久久成人| 亚洲av成人精品一区二区三区在线播放| 亚洲国产aⅴ天堂久久| xxxx黄色片| 久久久999| 亚洲免费在线精品一区| 成人噜噜噜噜| 久久久久久久一| 亚洲欧美日韩免费| 欧洲一区在线电影| 在线观看黄网址| 国产不卡免费视频| 黄色片视频在线免费观看| 教室别恋欧美无删减版| 91免费在线视频| a级片在线免费| 亚洲一区第一页| 国产免费黄色片| 红桃视频成人在线观看| 免费一级特黄3大片视频| 国产精品一区二区三区网站| 黄色一级片播放| 色婷婷一区二区三区| 99久久99久久| 电影亚洲精品噜噜在线观看| 欧美精品情趣视频| 你懂的视频在线观看| 91精品国产综合久久久久| 日干夜干天天干| 中文无字幕一区二区三区| 性高潮久久久久久| 亚洲影音先锋| 久久最新免费视频| 国产成人短视频在线观看| 91在线视频免费| 精品91久久| 色综合色综合久久综合频道88| 欧美xxx.com| 欧美mv日韩mv亚洲| 在线播放一级片| 欧美日韩国产一区二区| 夫妻性生活毛片| 久久精品人人做人人综合| 人妻激情偷乱视频一区二区三区| 媚黑女一区二区| 999一区二区三区| 日韩欧美高清| 久久亚洲一区二区| 6080亚洲理论片在线观看| 国产精品美女无圣光视频| cao在线视频| 久久99热精品| 好吊日视频在线观看| 国产一区二区三区在线播放免费观看| 亚洲国产中文字幕在线| 欧美日韩国产一区| 久久久精品毛片| 精品久久香蕉国产线看观看gif| 日本一级片免费| 日本一区二区三区dvd视频在线| 国产xxxx视频| 处破女av一区二区| 51一区二区三区| 久久久人成影片一区二区三区| 国产大学生校花援交在线播放 | 亚洲婷婷伊人| 国产精品一区二区av| 国产精品一区二区三区www| 国产精品久久久久久久7电影 | 国产精品入口夜色视频大尺度| 麻豆视频在线观看免费网站黄| 色综合视频一区中文字幕| 黄色动漫在线| 北条麻妃久久精品| √新版天堂资源在线资源| 亚洲欧美综合另类中字| 天堂中文资源在线| 亚洲国产精品成人精品| 国精产品一品二品国精品69xx| 日韩网站在线看片你懂的| 国产又黄又粗又猛又爽| 欧美精品乱码久久久久久| 亚洲天堂网视频| 欧美日韩成人激情| 国产精品人妻一区二区三区| 在线成人小视频| 国产免费无遮挡| 欧美一区二区二区| 国产ts变态重口人妖hd| 欧美一区二区三区男人的天堂| 国产日韩精品suv| 日韩欧美二区三区| 性欧美18一19性猛交| 精品国产乱码久久久久久蜜臀| 亚洲黄色小说网址| 亚洲精品久久久久久久久久久久久| 日本人妻熟妇久久久久久| 亚洲精美色品网站| 欧美精品少妇| 日韩中文字幕不卡视频| 欧美性天天影视| 九九视频直播综合网| www.综合网.com| 欧美亚洲国产视频| 国产麻豆久久| 91精品国产高清久久久久久91裸体| 欧美三级一区| 国产在线一区二| 精品国产乱码久久久| 在线观看成人av| 欧美日韩一区二区高清| 日本福利视频在线| 日韩av午夜在线观看| 亚洲免费在线播放视频| 成人精品视频一区| 麻豆精品免费视频| 亚洲欧洲国产日韩| 黄色片视频网站| 欧美色爱综合网| 亚洲国产精彩视频| 亚洲欧美日韩直播| 性直播体位视频在线观看| 91高潮精品免费porn| 久久精品资源| 精品国产一区二区三区四区vr | 在线色欧美三级视频| wwwav在线| 日本成人精品在线| 精品中文在线| 欧美日韩另类综合| 你懂的国产精品| 国产精品-区区久久久狼| 狠狠久久亚洲欧美| 成人影视免费观看| 亚洲综合激情网| 亚洲网站在线免费观看| 亚洲成人黄色在线| 9色在线视频网站| 97在线看免费观看视频在线观看| 国产亚洲人成a在线v网站| 国产精品一区二区三区免费| 久久大综合网| 色综合av综合无码综合网站| 国产精品一区二区久久精品爱涩| 大又大又粗又硬又爽少妇毛片| 亚洲你懂的在线视频| 无码一区二区三区在线观看| 精品国产伦理网| av中文字幕在线观看| 国产精品久久久一区| 久久精品福利| 91网站在线观看免费| 麻豆一区二区在线| 久久久无码人妻精品一区| 亚洲电影一级黄| 国产免费久久久| 精品国产区一区二区三区在线观看| 在线看片福利| 国产精品一区二| 欧美精品97| 99中文字幕在线| 国产精品情趣视频| 无码人妻精品一区二| 日韩av影视在线| 欧美黑人猛交的在线视频| 91久久久国产精品| 99久久九九| 69久久久久久| 国产欧美精品一区aⅴ影院| 91玉足脚交嫩脚丫在线播放| 亚洲国产日韩欧美在线图片| 七七成人影院| 5566中文字幕一区二区| 中文字幕一区二区精品区| 亚洲天堂av一区二区三区| 国产精品天美传媒| 中文字幕精品在线观看| 在线看日韩欧美| 欧美黄页在线免费观看| 亚洲开发第一视频在线播放| 免费观看在线色综合| 中文字幕第24页| 欧美日韩一卡二卡三卡| 1区2区3区在线观看| 国产日韩综合一区二区性色av| 日韩精品欧美| 午夜视频在线网站| 亚洲视频免费在线| 国产丰满果冻videossex| 欧美精品情趣视频| 成人免费直播在线| 日本在线xxx| 久久九九99视频| 中文字幕一区二区久久人妻| 最近更新的2019中文字幕| 欧美黄色成人| 日韩黄色片在线| 99精品视频在线观看免费| 中文字幕在线欧美| 色偷偷偷综合中文字幕;dd| 日韩一区中文| 欧美中日韩在线| 久久久久国产成人精品亚洲午夜| 日本一区二区三区久久| 精品激情国产视频| 亚洲大奶少妇| 国产免费观看高清视频| 国产亚洲欧美在线| 国产精品区在线观看| 97精品一区二区三区| 精品国产网站| 久久久久久国产精品日本| 精品女厕一区二区三区| eeuss影院在线播放| 91久久国产自产拍夜夜嗨| 亚洲精品影视| 男人的天堂官网 | 黄色av免费在线看| 成人自拍性视频| 一区二区国产精品| 秋霞网一区二区三区| 日韩欧美不卡在线观看视频| 亚洲天堂电影| ijzzijzzij亚洲大全| 91丨porny丨中文| 91精品国产乱码久久久| 97国产suv精品一区二区62| 成人网18免费网站| 俄罗斯黄色录像| 精品视频色一区| 美女91在线看| 婷婷视频在线播放| 91色|porny| 亚洲成人久久精品| 国产精品女人久久久久久| 在线免费高清一区二区三区| 中文字幕精品亚洲| 日韩电影免费观看在线观看| 亚洲成人1区| 国模杨依粉嫩蝴蝶150p|