婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Go http client 連接池不復用的問題

Go http client 連接池不復用的問題

熱門標簽:上海極信防封電銷卡價格 重慶慶云企業400電話到哪申請 湛江crm外呼系統排名 不封卡外呼系統 宿遷便宜外呼系統代理商 仙桃400電話辦理 鄭州智能語音電銷機器人價格 地圖標注免費定制店 寧波語音外呼系統公司

當 http client 返回值為不為空,只讀取 response header,但不讀 body 內容就執行 response.Body.Close(),那么連接會被主動關閉,得不到復用。

測試代碼如下:

// xiaorui.cc
 
func HttpGet() {
 for {
 fmt.Println("new")
 resp, err := http.Get("http://www.baidu.com")
 if err != nil {
  fmt.Println(err)
  continue
 }
 
 if resp.StatusCode == http.StatusOK {
  continue
 }
 
 resp.Body.Close()
  
 fmt.Println("go num", runtime.NumGoroutine())
 }
}

正如大家所想,除了 HEAD Method 外,很少會有只讀取 header 的需求吧。

話說,golang httpclient 需要注意的地方著實不少。

  • 如沒有 response.Body.Close(),有些小場景造成 persistConn 的 writeLoop 泄露。
  • 如 header 和 body 都不管,那么會造成泄露的連接干滿連接池,后面的請求只能是短連接。

上下文

由于某幾個業務系統會瘋狂調用各區域不同的 k8s 集群,為減少跨機房帶來的時延、兼容新老 k8s 集群 api、減少k8s api-server 的負載,故而開發了 k8scache 服務。在部署運行后開始對該服務進行監控,發現 metrics 呈現的 QPS 跟連接數不成正比,qps 為 1500,連接數為 10 個。開始以為觸發 idle timeout 被回收,但通過歷史監控圖分析到連接依然很少。????

按照對 k8scache 調用方的理解,他們經常粗暴的開啟不少協程來對 k8scache 進行訪問。已知默認的 golang httpclient transport 對連接數是有默認限制的,連接池總大小為 100,每個 host 連接數為 2。當并發對某 url 進行請求時,無法歸還連接池,也就是超過連接池大小的連接會被主動clsoe()。所以,我司的 golang 腳手架中會對默認的 httpclient 創建高配的 transport,不太可能出現連接池爆滿被 close 的問題。

如果真的是連接池爆了?  誰主動挑起關閉,誰就有 tcp time-wait 狀態,但通過 netstat 命令只發現少量跟 k8scache 相關的 time-wait。

排查問題

已知問題,  為隱藏敏感信息,索性使用簡單的場景設立問題的 case

tcpdump抓包分析問題?

包信息如下,通過最后一行可以確認是由客戶端主動觸發 RST連接重置 。觸發RST的場景有很多,但常見的有 tw_bucket 滿了、tcp 連接隊列爆滿且開啟 tcp_abort_on_overflow、配置 so_linger、讀緩沖區還有數據就給 close。

通過 linux 監控和內核日志可以確認不是內核配置的問題,配置 so_linger 更不可能。???? 大概率就一個可能,關閉未清空讀緩沖區的連接。

22:11:01.790573 IP (tos 0x0, ttl 64, id 29826, offset 0, flags [DF], proto TCP (6), length 60)
  host-46.54550 > 110.242.68.3.http: Flags [S], cksum 0x5f62 (incorrect -> 0xb894), seq 1633933317, win 29200, options [mss 1460,sackOK,TS val 47230087 ecr 0,nop,wscale 7], length 0
22:11:01.801715 IP (tos 0x0, ttl 43, id 0, offset 0, flags [DF], proto TCP (6), length 52)
  110.242.68.3.http > host-46.54550: Flags [S.], cksum 0x00a0 (correct), seq 1871454056, ack 1633933318, win 29040, options [mss 1452,nop,nop,sackOK,nop,wscale 7], length 0
22:11:01.801757 IP (tos 0x0, ttl 64, id 29827, offset 0, flags [DF], proto TCP (6), length 40)
  host-46.54550 > 110.242.68.3.http: Flags [.], cksum 0x5f4e (incorrect -> 0xb1f5), seq 1, ack 1, win 229, length 0
22:11:01.801937 IP (tos 0x0, ttl 64, id 29828, offset 0, flags [DF], proto TCP (6), length 134)
  host-46.54550 > 110.242.68.3.http: Flags [P.], cksum 0x5fac (incorrect -> 0xb4d6), seq 1:95, ack 1, win 229, length 94: HTTP, length: 94
 GET / HTTP/1.1
 Host: www.baidu.com
 User-Agent: Go-http-client/1.1
 
22:11:01.814122 IP (tos 0x0, ttl 43, id 657, offset 0, flags [DF], proto TCP (6), length 40)
  110.242.68.3.http > host-46.54550: Flags [.], cksum 0xb199 (correct), seq 1, ack 95, win 227, length 0
22:11:01.815179 IP (tos 0x0, ttl 43, id 658, offset 0, flags [DF], proto TCP (6), length 4136)
  110.242.68.3.http > host-46.54550: Flags [P.], cksum 0x6f4e (incorrect -> 0x0e70), seq 1:4097, ack 95, win 227, length 4096: HTTP, length: 4096
 HTTP/1.1 200 OK
 Bdpagetype: 1
 Bdqid: 0x8b3b62c400142f77
 Cache-Control: private
 Connection: keep-alive
 Content-Encoding: gzip
 Content-Type: text/html;charset=utf-8
 Date: Wed, 09 Dec 2020 14:11:01 GMT
 ...
22:11:01.815214 IP (tos 0x0, ttl 64, id 29829, offset 0, flags [DF], proto TCP (6), length 40)
  host-46.54550 > 110.242.68.3.http: Flags [.], cksum 0x5f4e (incorrect -> 0xa157), seq 95, ack 4097, win 293, length 0
22:11:01.815222 IP (tos 0x0, ttl 43, id 661, offset 0, flags [DF], proto TCP (6), length 4136)
  110.242.68.3.http > host-46.54550: Flags [P.], cksum 0x6f4e (incorrect -> 0x07fa), seq 4097:8193, ack 95, win 227, length 4096: HTTP
22:11:01.815236 IP (tos 0x0, ttl 64, id 29830, offset 0, flags [DF], proto TCP (6), length 40)
  host-46.54550 > 110.242.68.3.http: Flags [.], cksum 0x5f4e (incorrect -> 0x9117), seq 95, ack 8193, win 357, length 0
22:11:01.815243 IP (tos 0x0, ttl 43, id 664, offset 0, flags [DF], proto TCP (6), length 5848)
  ...
  host-46.54550 > 110.242.68.3.http: Flags [.], cksum 0x5f4e (incorrect -> 0x51ba), seq 95, ack 24165, win 606, length 0
22:11:01.815369 IP (tos 0x0, ttl 64, id 29834, offset 0, flags [DF], proto TCP (6), length 40)
  host-46.54550 > 110.242.68.3.http: Flags [R.], cksum 0x5f4e (incorrect -> 0x51b6), seq 95, ack 24165, win 606, length 0

通過 lsof 找到進程關聯的 TCP 連接,然后使用 ss 或 netstat 查看讀寫緩沖區。信息如下,recv-q 讀緩沖區確實是存在數據。這個緩沖區字節一直未讀,直到連接關閉引發了 rst。

$ lsof -p 54330
COMMAND  PID USER  FD   TYPE  DEVICE SIZE/OFF    NODE NAME
...
aaa   54330 root  1u   CHR   136,0   0t0     3 /dev/pts/0
aaa   54330 root  2u   CHR   136,0   0t0     3 /dev/pts/0
aaa   54330 root  3u a_inode   0,10    0    8838 [eventpoll]
aaa   54330 root  4r   FIFO    0,9   0t0 223586913 pipe
aaa   54330 root  5w   FIFO    0,9   0t0 223586913 pipe
aaa   54330 root  6u   IPv4 223596521   0t0    TCP host-46:60626->110.242.68.3:http (ESTABLISHED)
 
$ ss -an|egrep "68.3:80"
State   Recv-Q   Send-Q    Local Address:Port    Peer Address:Port 
ESTAB   72480    0      172.16.0.46:60626     110.242.68.3:80 

strace 跟蹤系統調用

通過系統調用可分析出,貌似只是讀取了 header 部分了,還未讀到 body 的數據。

[pid 8311] connect(6, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("110.242.68.3")}, 16 unfinished ...>
[pid 195519] epoll_pwait(3, unfinished ...>
[pid 8311] ... connect resumed>)   = -1 EINPROGRESS (操作現在正在進行)
[pid 8311] epoll_ctl(3, EPOLL_CTL_ADD, 6, {EPOLLIN|EPOLLOUT|EPOLLRDHUP|EPOLLET, {u32=2350546712, u64=140370471714584}} unfinished ...>
[pid 195519] getsockopt(6, SOL_SOCKET, SO_ERROR, unfinished ...>
[pid 192592] nanosleep({tv_sec=0, tv_nsec=20000}, unfinished ...>
[pid 195519] getpeername(6, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("110.242.68.3")}, [112->16]) = 0
[pid 195519] getsockname(6, unfinished ...>
[pid 195519] ... getsockname resumed>{sa_family=AF_INET, sin_port=htons(47746), sin_addr=inet_addr("172.16.0.46")}, [112->16]) = 0
[pid 195519] setsockopt(6, SOL_TCP, TCP_KEEPINTVL, [15], 4) = 0
[pid 195519] setsockopt(6, SOL_TCP, TCP_KEEPIDLE, [15], 4 unfinished ...>
[pid 8311] write(6, "GET / HTTP/1.1\r\nHost: www.baidu.com\r\nUser-Agent: Go-http-client/1.1\r\nAccept-Encoding: gzip\r\n\r\n", 94 unfinished ...>
[pid 192595] read(6, unfinished ...>
[pid 192595] ... read resumed>"HTTP/1.1 200 OK\r\nBdpagetype: 1\r\nBdqid: 0xc43c9f460008101b\r\nCache-Control: private\r\nConnection: keep-alive\r\nContent-Encoding: gzip\r\nContent-Type: text/html;charset=utf-8\r\nDate: Wed, 09 Dec 2020 13:46:30 GMT\r\nExpires: Wed, 09 Dec 2020 13:45:33 GMT\r\nP3p: CP=\" OTI DSP COR IVA OUR IND COM \"\r\nP3p: CP=\" OTI DSP COR IVA OUR IND COM \"\r\nServer: BWS/1.1\r\nSet-Cookie: BAIDUID=996EE645C83622DF7343923BF96EA1A1:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\nSet-Cookie: BIDUPSID=99"..., 4096) = 4096
[pid 192595] close(6 unfinished ...>

邏輯代碼

那么到這里,可以大概猜測問題所在,找到業務方涉及到 httpclient 的邏輯代碼。偽代碼如下,跟上面的結論一樣,只是讀取了header,但并未讀取完response body數據。

還以為是特殊的場景,結果是使用不當,把請求投遞過去后只判斷 http code?真正的業務 code 是在 body 里的。????

urls := []string{...}
for _, url := range urls {
 resp, err := http.Post(url, ...)
 if err != nil {
  // ...
 }
 if resp.StatusCode == http.StatusOK {
  continue
 }
 
 // handle redis cache
 // handle mongodb
 // handle rocketmq
 // ...
 
 resp.Body.Close()
}

如何解決

不細說了,把 header length 長度的數據讀完就可以了。

分析問題

先不管別人使用不當,再分析下為何出現短連接,連接不能復用的問題。

為什么不讀取 body 就出問題?其實 http.Response 字段描述中已經有說明了。當 Body 未讀完時,連接可能不能復用。

 // The http Client and Transport guarantee that Body is always
 // non-nil, even on responses without a body or responses with
 // a zero-length body. It is the caller's responsibility to
 // close Body. The default HTTP client's Transport may not
 // reuse HTTP/1.x "keep-alive" TCP connections if the Body is
 // not read to completion and closed.
 //
 // The Body is automatically dechunked if the server replied
 // with a "chunked" Transfer-Encoding.
 //
 // As of Go 1.12, the Body will also implement io.Writer
 // on a successful "101 Switching Protocols" response,
 // as used by WebSockets and HTTP/2's "h2c" mode.
 Body io.ReadCloser

眾所周知,golang httpclient 要注意 response Body 關閉問題,但上面的 case 確實有關了 body,只是非常規地沒去讀取 reponse body 數據。這樣會造成連接異常關閉,繼而引起連接池不能復用。

一般 http 協議解釋器是要先解析 header,再解析 body,結合當前的問題開始是這么推測的,連接的 readLoop 收到一個新請求,然后嘗試解析 header 后,返回給調用方等待讀取 body,但調用方沒去讀取,而選擇了直接關閉 body。那么后面當一個新請求被 transport roundTrip 再調度請求時,readLoop 的 header 讀取和解析會失敗,因為他的讀緩沖區里有前面未讀的數據,必然無法解析 header。按照常見的網絡編程原則,協議解析失敗,直接關閉連接。

想是這么想的,但還是看了 golang net/http 的代碼,結果不是這樣的。????

分析源碼

httpclient 每個連接會創建讀寫協程兩個協程,分別使用 reqch 和 writech 來跟 roundTrip 通信。上層使用的response.Body 其實是經過多次封裝的,一次封裝的 body 是直接跟 net.conn 進行交互讀取,二次封裝的 body 則是加強了 close 和 eof 處理的 bodyEOFSignal。

當未讀取 body 就進行 close 時,會觸發 earlyCloseFn() 回調,看 earlyCloseFn 的函數定義,在 close 未見 io.EOF 時才調用。自定義的 earlyCloseFn 方法會給 readLoop 監聽的 waitForBodyRead 傳入 false,  這樣引發 alive 為 false 不能繼續循環的接收新請求,只能是退出調用注冊過的 defer 方法,關閉連接和清理連接池。

// xiaorui.cc
 
func (pc *persistConn) readLoop() {
 closeErr := errReadLoopExiting // default value, if not changed below
 defer func() {
 pc.close(closeErr)   // 關閉連接
 pc.t.removeIdleConn(pc) // 從連接池中刪除
 }()
 
 ...
 
 alive := true
 for alive {
   ...
 
 rc := -pc.reqch // 從管道中拿到請求,roundTrip 對該管道進行輸入
 trace := httptrace.ContextClientTrace(rc.req.Context())
 
 var resp *Response
 if err == nil {
  resp, err = pc.readResponse(rc, trace) // 更多的是解析 header
 } else {
  err = transportReadFromServerError{err}
  closeErr = err
 }
  ...
 
 waitForBodyRead := make(chan bool, 2)
 body := bodyEOFSignal{
  body: resp.Body,
  // 提前關閉 !!! 輸出false
  earlyCloseFn: func() error {
  waitForBodyRead - false
  ...
  },
  // 正常收尾 !!!
  fn: func(err error) error {
  isEOF := err == io.EOF
  waitForBodyRead - isEOF
  ...
  },
 }
 
 resp.Body = body
 
 select {
 case rc.ch - responseAndError{res: resp}:
 case -rc.callerGone:
  return
 }
 
 select {
 case bodyEOF := -waitForBodyRead:
  replaced := pc.t.replaceReqCanceler(rc.cancelKey, nil) // before pc might return to idle pool
  // alive 為 false, 不能繼續 continue
  alive = alive 
  bodyEOF 
  !pc.sawEOF 
  pc.wroteRequest() 
  replaced  tryPutIdleConn(trace)
  ...
 case -rc.req.Cancel:
  alive = false
  pc.t.CancelRequest(rc.req)
 case -rc.req.Context().Done():
  alive = false
  pc.t.cancelRequest(rc.cancelKey, rc.req.Context().Err())
 case -pc.closech:
  alive = false
 }
 }
}

bodyEOFSignal 的 Close():

// xiaorui.cc
 
func (es *bodyEOFSignal) Close() error {
 es.mu.Lock()
 defer es.mu.Unlock()
 if es.closed {
 return nil
 }
 es.closed = true
 if es.earlyCloseFn != nil  es.rerr != io.EOF {
 return es.earlyCloseFn()
 }
 err := es.body.Close()
 return es.condfn(err)
}

最終會調用 persistConn 的 close(), 連接關閉并關閉closech:

// xiaorui.cc
 
func (pc *persistConn) close(err error) {
 pc.mu.Lock()
 defer pc.mu.Unlock()
 pc.closeLocked(err)
}
 
func (pc *persistConn) closeLocked(err error) {
 if err == nil {
 panic("nil error")
 }
 pc.broken = true
 if pc.closed == nil {
 pc.closed = err
 pc.t.decConnsPerHost(pc.cacheKey)
 if pc.alt == nil {
  if err != errCallerOwnsConn {
  pc.conn.Close() // 關閉連接
  }
  close(pc.closech) // 通知讀寫協程
 }
 }
}

總之

同事的 httpclient 使用方法有些奇怪,除了 head method 之外,還真想不到有不讀取 body 的請求。所以,大家知道 httpclient 有這么一回事就行了。

另外,一直覺得 net/http 的代碼太繞,沒看過一些介紹直接看代碼很容易陷進去,有時間專門講講 http client 的實現。

到此這篇關于Go http client 連接池不復用的問題的文章就介紹到這了,更多相關Go http client 連接池內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • go 原生http web 服務跨域restful api的寫法介紹
  • golang http使用踩過的坑與填坑指南
  • Golang實現http server提供壓縮文件下載功能
  • golang語言http協議get拼接參數操作
  • 在go文件服務器加入http.StripPrefix的用途介紹
  • Golang 實現分片讀取http超大文件流和并發控制
  • Go 實現HTTP中間人代理的操作

標簽:儋州 青海 海南 安康 遼寧 西雙版納 電子產品 物業服務

巨人網絡通訊聲明:本文標題《Go http client 連接池不復用的問題》,本文關鍵詞  http,client,連接,池,不復,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Go http client 連接池不復用的問題》相關的同類信息!
  • 本頁收集關于Go http client 連接池不復用的問題的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品一区二区三区在线播放视频| 国产香蕉久久精品综合网| 国产精品91xxx| 麻豆精品视频在线观看| 亚洲高清免费在线| 亚洲午夜私人影院| 亚洲妇女屁股眼交7| 亚洲自拍偷拍网站| 午夜精品一区在线观看| 日韩高清一区在线| 免费黄网站欧美| 精品一区二区三区在线观看国产| 另类小说色综合网站| 激情六月婷婷久久| 国产二区国产一区在线观看| 丰满放荡岳乱妇91ww| 日本丰满少妇一区二区三区| 欧美在线视频你懂得| 欧美一级理论性理论a| 久久婷婷成人综合色| 中文字幕一区二区5566日韩| 一区二区免费视频| 久久精品国产精品亚洲精品| 精品一区二区三区日韩| 成人一区二区三区视频| 色哟哟一区二区在线观看| 欧美精品日韩综合在线| 国产欧美视频一区二区三区| 一卡二卡欧美日韩| 国产麻豆精品视频| 在线观看亚洲精品视频| 精品1区2区在线观看| 亚洲视频一区在线| 精品一区二区免费视频| 99国产精品久久久久久久久久 | 国产欧美一区二区精品久导航 | 成人h精品动漫一区二区三区| 91麻豆国产福利精品| 欧美成人官网二区| 亚洲欧美电影院| 国产一区视频在线看| 欧美日韩国产美女| 国产精品天干天干在观线| 亚洲第一主播视频| gogo大胆日本视频一区| 69久久99精品久久久久婷婷| 中文字幕一区二区三区不卡| 久久av资源网| 欧美三级在线播放| 亚洲欧美在线aaa| 精品午夜一区二区三区在线观看| 91黄色小视频| 亚洲欧美影音先锋| 国产盗摄视频一区二区三区| 欧美狂野另类xxxxoooo| 一区二区在线观看视频| 粉嫩在线一区二区三区视频| 日韩一区二区免费视频| 五月天一区二区三区| 色综合一个色综合亚洲| 中文字幕乱码一区二区免费| 韩日欧美一区二区三区| 日韩欧美电影在线| 日韩av一区二区在线影视| 欧美熟乱第一页| 亚洲免费观看高清在线观看| 国产91丝袜在线观看| 久久在线观看免费| 日韩精品乱码免费| 4438x成人网最大色成网站| 一区二区三区在线免费播放| 99国产精品视频免费观看| 中文字幕不卡一区| 99久久精品国产毛片| 中国色在线观看另类| 国产91对白在线观看九色| 久久女同性恋中文字幕| 国产麻豆视频一区二区| 精品国产乱码久久久久久牛牛 | 国产欧美精品一区二区色综合 | 欧美va日韩va| 麻豆免费看一区二区三区| 欧美日韩国产精品自在自线| 午夜亚洲福利老司机| 91精品国产91久久综合桃花| 日韩精品视频网站| 久久色成人在线| 国产成人精品一区二区三区网站观看| 国产欧美精品在线观看| 91视视频在线直接观看在线看网页在线看| 国产精品丝袜在线| 一本久久a久久精品亚洲| 亚洲国产精品久久久久婷婷884| 欧美日韩国产综合一区二区三区| 亚洲成人黄色影院| 久久只精品国产| 91在线国产观看| 日韩精彩视频在线观看| 国产欧美日韩亚州综合| 色欧美88888久久久久久影院| 亚洲国产精品一区二区久久| 日韩三级高清在线| 成人国产视频在线观看| 亚洲成人先锋电影| 国产丝袜欧美中文另类| 91成人网在线| 国精产品一区一区三区mba桃花| 亚洲婷婷综合久久一本伊一区| 欧美日韩色一区| 国产mv日韩mv欧美| 日韩国产欧美一区二区三区| 国产亚洲一区二区三区在线观看| 日本丶国产丶欧美色综合| 黄色日韩网站视频| 亚洲最大的成人av| 久久久久久电影| 欧美另类久久久品| 91视视频在线观看入口直接观看www| 蜜臀av在线播放一区二区三区| 中文字幕在线视频一区| 日韩欧美资源站| 91精彩视频在线观看| 国产精品一区二区无线| 天天爽夜夜爽夜夜爽精品视频| 中文字幕第一区二区| 精品少妇一区二区三区免费观看| 在线观看亚洲成人| www.色精品| 国产宾馆实践打屁股91| 美国欧美日韩国产在线播放| 精品99久久久久久| 欧美一区二区三区在线视频| 欧美性xxxxxx少妇| 色婷婷亚洲一区二区三区| 国产成人鲁色资源国产91色综| 久久超级碰视频| 久久精品国产一区二区| 日韩—二三区免费观看av| 一区2区3区在线看| 亚洲精品国产无套在线观| 中文字幕制服丝袜一区二区三区| 精品精品欲导航| 日韩欧美久久久| 日韩一区二区三区精品视频| 91精品久久久久久蜜臀| 欧美日韩国产高清一区| 欧美日本乱大交xxxxx| 欧美日韩另类一区| 欧美性色黄大片手机版| 欧美日韩在线播放| 欧美情侣在线播放| 91精品国产综合久久精品app| 欧美人牲a欧美精品| 欧美理论片在线| 欧美刺激脚交jootjob| 欧美大片一区二区三区| 精品美女被调教视频大全网站| 精品电影一区二区三区| 精品国产乱码久久久久久闺蜜| 精品国产精品网麻豆系列| 久久天天做天天爱综合色| 国产丝袜欧美中文另类| 国产精品国产三级国产a| 一区二区三区成人| 麻豆国产欧美日韩综合精品二区| 美女脱光内衣内裤视频久久网站| 另类的小说在线视频另类成人小视频在线 | 成人av在线资源网| 成人毛片在线观看| 在线观看91精品国产入口| 欧美一区二区三区色| 国产日韩精品一区二区三区 | 欧美性生活影院| 欧美一区二区人人喊爽| 欧美电视剧在线看免费| 中文字幕国产一区| 亚洲精品欧美综合四区| 蜜臀av一级做a爰片久久| 成人听书哪个软件好| 色8久久人人97超碰香蕉987| 欧美一区二区在线看| 欧美高清一级片在线观看| 悠悠色在线精品| 国产一区二区网址| 色婷婷精品大视频在线蜜桃视频| 欧美一级xxx| 亚洲欧美日韩中文播放| 免费成人美女在线观看.| 91亚洲永久精品| 日韩欧美视频在线| 夜夜精品视频一区二区 | 成人激情小说网站| 在线观看91视频| 久久久国际精品| 性久久久久久久| 色综合天天视频在线观看| 国产无遮挡一区二区三区毛片日本| 亚洲影院久久精品| 国产jizzjizz一区二区| 日韩免费福利电影在线观看|