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

通過 eBPF 深入探究 Go GC

開發 前端
對程序員來說,內存管理是很重要的。編程語言按內存管理方式一般可以分為手動內存管理和自動內存管理。手動內存管理典型代表有 C、C++;自動內存管理代表有 Java、C# 等。

大家好,我是程序員幽鬼。

對程序員來說,內存管理是很重要的。編程語言按內存管理方式一般可以分為手動內存管理和自動內存管理。手動內存管理典型代表有 C、C++;自動內存管理代表有 Java、C# 等。通常,自動內存管理即自帶垃圾收集器,即 GC(當然,Rust 另辟蹊徑,它既沒有 GC,也不需要手動內存管理,感興趣的可以了解下)。Go 語言也采用了 GC 的方式管理內存,雖然 Gopher 不需要手動管理內存了,但了解 Go 如何分配和釋放內存可以讓我們編寫更好、更高效的應用程序。垃圾收集器是這個難題的關鍵部分。本文就探討 Go 中的 GC。

為了更好地理解垃圾收集器的工作原理,我決定在實時應用程序上跟蹤它的底層行為。本文將使用 eBPF uprobes 檢測 Go 垃圾收集器。這篇文章的源代碼在這里[1]。

1、前提知識

在深入研究之前,讓我們快速了解一下 uprobes、垃圾收集器的設計以及我們將使用的演示應用程序。

為什么用 uprobes?

uprobes[2] 很酷,因為它們讓我們無需修改代碼即可動態收集新信息。當你不能或不想重新部署你的應用程序時,這會非常有用。

函數參數、返回值、延遲和時間戳都可以通過 uprobes 收集。在這篇文章中,我將把 uprobes 部署到 Go 垃圾收集器的關鍵函數上。這讓我們能看到它在正在運行的應用程序中的實際表現。

uprobes 可以跟蹤延遲、時間戳、參數和函數的返回值片

注意:這篇文章使用的 Go 版本是 1.16。我將在 Go 運行時中跟蹤私有函數,因此這些功能在 Go 的后續版本中可能會發生變化。

垃圾回收的階段

Go 使用并發標記和清除垃圾收集器。對于那些不熟悉這些術語的人,閱讀以下內容,方便你理解本文其他內容。

Go 的垃圾收集器被稱為并發的,因為它可以安全地與主程序并行運行。換句話說,它不需要停止你程序的執行來完成它的工作(稍后會詳細介紹)。

垃圾收集有兩個主要階段:

標記(Mark)階段:識別并標記程序不再需要的對象。

清除(Sweep)階段:對于標記階段標記為“無法訪問”的每個對象,釋放內存以供其他地方使用。

一種節點著色算法。黑色表示仍在使用中。白色表示已準備好清理。灰色表示仍然需要分類為黑色或白色

一個簡單的演示應用程序

這是一個簡單的端點(endpoint),我將使用它來觸發垃圾收集器。它創建一個可變大小的字符串數組,然后通過調用 runtime.GC() 來啟動垃圾收集器。

實際代碼中,你不需要手動調用垃圾收集器,因為 Go 會自動為你處理。

http.HandleFunc("/allocate-memory-and-run-gc", func(w http.ResponseWriter, r *http.Request) {
arrayLength, bytesPerElement := parseArrayArgs(r)
arr := generateRandomStringArray(arrayLength, bytesPerElement)
fmt.Fprintf(w, fmt.Sprintf("Generated string array with %d bytes of data\n", len(arr) * len(arr[0])))
runtime.GC()
fmt.Fprintf(w, "Ran garbage collector\n")
})

2、跟蹤垃圾收集的主要階段

我們已經了解了 uprobes 和 Go 垃圾收集器的基礎知識,接下來深入觀察它的行為。

跟蹤 runtime.GC()

首先,我們計劃在 Go 的 runtime 庫中的以下函數中添加 uprobes:

函數

描述

GC[3]

調用 GC

gcWaitOnMark[4]

等待標記階段完成

gcSweep[5]

執行清除階段

(如果你有興趣了解 uprobes 是如何生成的,這里是代碼[6]。)

部署 uprobes 后,點擊端點并生成了一個包含 10 個字符串的數組,每個字符串為 20 個字節。

$ curl '127.0.0.1:8080/allocate-memory-and-run-gc?arrayLength=10&bytesPerElement=20'
Generated string array with 200 bytes of data
Ran garbage collector

這時 uprobes 會觀察到以下事件:

在運行垃圾收集器后,為 GC、gcWaitOnMark 和 gcSweep 收集事件

從源代碼[7]來看這是有道理的——gcWaitOnMark被調用兩次,一次是在開始下一個循環之前對前一個循環進行驗證。標記階段觸發清除階段。

接下來,使用各種輸入請求 /allocate-memory-and-run-gc 端點對 runtime.GC 后的延遲進行了一些測量。

arrayLength

bytesPerElement

Approximate size (B)

GC latency (ms)

GC throughput (MB/s)

100

1,000

100,000

3.2

31

1,000

1,000

1,000,000

8.5

118

10,000

1,000

10,000,000

53.7

186

100

10,000

1,000,000

3.2

313

1,000

10,000

10,000,000

12.4

807

10,000

10,000

100,000,000

96.2

1,039

跟蹤標記和清除階段

雖然這是一個很好的高級視圖,但我們可以使用更多細節。接下來探索一些用于內存分配、標記和清除的輔助函數,以獲取下一級信息。

這些輔助函數有參數或返回值,可以幫助我們更好地可視化正在發生的事情(例如分配的內存頁)。

函數

描述

捕獲的信息

allocSpan[8]

分配新內存

分配的內存頁

gcDrainN[9]

執行 N 個單位的標記工作

完成的標記工作單位

sweepone[10]

從 span 中清除內存

清除的內存頁

$ curl '127.0.0.1:8080/allocate-memory-and-run-gc?arrayLength=20000&bytesPerElement=4096'
Generated string array with 81920000 bytes of data
Ran garbage collector

在以更大的負載命中垃圾收集器之后,以下是原始結果:

調用垃圾收集器后,allocSpan、gcDrainN 和 sweepone 收集的事件示例

繪制為時間序列更容易解釋:

allocSpan 隨時間分配的內存頁

gcDrain 標記在一段時間內完成的工作

sweepone 隨時間清除的內存頁

現在我們可以看到發生了什么:

  • Go 分配了幾千內存頁,這是正常的,因為我們直接向堆中添加了大約 80MB 的字符串。
  • 標記工作拉開了序幕(注意它的單位不是頁,而是標記工作單位)
  • 有標記的內存頁被清除器清除。(這應該是所有內存頁,因為在調用完成后我們不會重用字符串數組)。

追蹤 Stop The World 事件

“Stopping the world”是指垃圾收集器暫時停止除自身之外的一切,以安全地修改狀態。我們通常更喜歡最小化 STW 階段,因為 STW 會減慢我們的程序速度(通常是在最不方便的時候……)。

一些垃圾收集器會在垃圾收集運行的整個過程中 stop the world。這些是“非并發”垃圾收集器。雖然 Go 的垃圾收集器在很大程度上是并發的,但我們可以從代碼中看到,它在技術上確實在兩個地方 STW 了。

我們跟蹤以下函數:

函數

描述

stopTheWorldWithSema[11]

停止其他 goroutine 直到??startTheWorldWithSema??被調用

startTheWorldWithSema[12]

啟動暫停的 goroutine

再次觸發 GC:

$ curl '127.0.0.1:8080/allocate-memory-and-run-gc?arrayLength=10&bytesPerElement=20'
Generated string array with 200 bytes of data
Ran garbage collector

這次產生了如下事件:

生成啟動和停止 STW 事件

我們可以從GC事件中看到垃圾收集需要 3.1 毫秒才能完成。在我檢查了確切的時間戳之后,事實證明 STW 第一次停止了 300 μs,第二次停止了 365 μs。換句話說,~80%垃圾收集是同時執行的。當垃圾收集器在實際內存壓力下自動調用時,我們預計這個比率會變得更好。

為什么 Go 垃圾收集器需要 STW?

1st Stop The World(標記階段之前):設置狀態并打開寫屏障。寫屏障確保在 GC 運行時正確跟蹤新的寫入(這樣它們就不會被意外釋放或保留)。

2nd Stop The World(標記階段之后):清理標記狀態并關閉寫屏障。

3、垃圾收集器如何調整自己的速度?

知道何時運行垃圾收集是 Go 等并發垃圾收集器的重要考慮因素。

早期的垃圾收集器被設計為一旦達到一定的內存消耗水平就會啟動。如果垃圾收集器是非并發的,這可以正常工作。但是使用并發垃圾收集器,主程序在垃圾收集期間仍在運行 —— 因此可能仍在進行內存分配。

這意味著如果太晚運行垃圾收集器,可能會超出內存目標。(Go 也不能一直運行垃圾收集 —— GC 會從主應用程序中奪走資源和性能。)

Go 的垃圾收集器使用 pacer[13] 來估計垃圾收集的最佳時間。這有助于 Go 滿足其內存和 CPU 目標,而不會犧牲不必要的應用程序性能。

pacer,可以理解為定速裝置

觸發率

Go 的并發垃圾收集器依賴于一個 pacer 來確定何時進行垃圾收集。但它是如何做出這個決定的呢?

每次調用垃圾收集器時,pacer 都會更新其內部目標,即下次應該何時運行 GC。這個目標稱為觸發率。觸發率0.6意味著一旦堆大小增加 60%,系統應該運行垃圾收集。觸發率是CPU、內存和其他因素共同決定的數字。

讓我們看看當我們一次分配大量內存時,垃圾收集器的觸發率是如何變化的。我們可以通過跟蹤函數來獲取觸發率gcSetTriggerRatio。

$ curl '127.0.0.1:8080/allocate-memory-and-run-gc?arrayLength=20000&bytesPerElement=4096'
Generated string array with 81920000 bytes of data
Ran garbage collector

觸發率隨時間的變化

從圖中可以看到,最初,觸發率相當高。運行時已經確定,在程序使用 450% 或更多內存之前,不需要進行垃圾收集。這是有道理的,因為應用程序沒有做太多事情(并且沒有使用很多堆)。

然而,一旦我們請求端點進行 ~81MB 堆分配時,觸發率迅速下降到 ~1。現在如果增加 100% 的內存就可以進行垃圾收集(因為我們的內存消耗增加了)。

標記和清除

助手當分配內存但不調用垃圾收集器會發生什么?接下來,請求 /allocate-memory 端點,它和 /allocate-memory-and-gc 類似,但不調用runtime.GC()。

$ curl '127.0.0.1/allocate-memory?arrayLength=10000&bytesPerElement=10000'
Generated string array with 100000000 bytes of data

根據最近的觸發率,垃圾收集器應該還沒有啟動。但是,我們看到標記和清除仍然發生了:

gcDrain 標記在一段時間內完成的工作

sweepone 隨時間清除的內存頁

事實證明,垃圾收集器還有另一個技巧可以防止失控的內存增長。如果堆內存開始增長過快,垃圾收集器將對任何分配新內存的請求收“稅”。請求新堆分配的 Goroutines 將必須先協助垃圾收集,然后才能獲得它們所要求的東西。

這種“輔助”系統增加了分配的延遲,因此有助于系統抗壓(backpressure)。這非常重要,因為它解決了并發垃圾收集器可能引起的問題。在并發垃圾收集器中,內存分配在垃圾收集運行時仍進行內存分配。如果程序分配內存的速度快于垃圾收集器釋放它的速度,那么內存增長將是無限的。通過減慢(背壓)新內存的凈分配來幫助解決這個問題。

我們可以跟蹤 gcAssistAlloc1[14] 以查看此過程的運行情況。gcAssistAlloc1 接受一個名為 scanWork 的參數,它是請求的輔助工作量。

gcAllocAssist1 在一段時間內執行的輔助工作量

可以看到,gcAssistAlloc1 就是 mark 和 sweep 工作的來源。它收到了完成大約 30 萬個工作單元的請求。在之前的標記階段圖中,gcDrainN 在相同的時間段完成了大約 30 萬個標記工作單元(只是稍微分散一點)。

4、總結

還有很多關于 Go 中的內存分配和垃圾收集的知識!這里有一些其他的資源可以查看:

  • Go 對小對象的特殊清除[15]
  • 通過逃逸分析[16]查看對象是分配在堆還是棧
  • sync.Pool[17],一種并發數據結構,通過池的方式共享對象來減少分配[18]

就像我們在本文例子中所做的那樣,創建 uprobes 通常最好在更高級別的 BPF 框架中完成。對于這篇文章,我使用了 Pixie 的 Dynamic Go 日志記錄[19]功能(仍處于 alpha 階段)。bpftrace[20] 是另一個創建 uprobes 的好工具。

檢查 Go 垃圾收集器行為的另一個不錯的選擇是 gc 跟蹤器。只需在你啟動程序時傳入 GODEBUG=gctrace=1。這會輸出有關垃圾收集器正在做什么的各種有用信息。

原文鏈接:https://blog.px.dev/go-garbage-collector/。

參考資料

參考資料

[1]這里: https://github.com/pixie-io/pixie-demos/tree/main/go-garbage-collector

[2]uprobes: https://jvns.ca/blog/2017/07/05/linux-tracing-systems/#uprobes

[3]GC: https://github.com/golang/go/blob/go1.16/src/runtime/mgc.go#L1126

[4]gcWaitOnMark: https://github.com/golang/go/blob/go1.16/src/runtime/mgc.go#L1201

[5]gcSweep: https://github.com/golang/go/blob/go1.16/src/runtime/mgc.go#L2170

[6]代碼: https://github.com/pixie-io/pixie-demos/tree/main/go-garbage-collector

[7]從源代碼: https://github.com/golang/go/blob/go1.16/src/runtime/mgc.go#L1126

[8]allocSpan: https://github.com/golang/go/blob/go1.16/src/runtime/mheap.go#L1124

[9]gcDrainN: https://github.com/golang/go/blob/go1.16/src/runtime/mgcmark.go#L1095

[10]sweepone: https://github.com/golang/go/blob/go1.16/src/runtime/mgcsweep.go#L188

[11]stopTheWorldWithSema: https://github.com/golang/go/blob/go1.16/src/runtime/proc.go#L1073

[12]startTheWorldWithSema: https://github.com/golang/go/blob/go1.16/src/runtime/proc.go#L1151

[13]pacer: https://go.googlesource.com/proposal/+/a216b56e743c5b6b300b3ef1673ee62684b5b63b/design/44167-gc-pacer-redesign.md

[14]gcAssistAlloc1: https://github.com/golang/go/blob/go1.16/src/runtime/mgcmark.go#L504

[15]特殊清除: https://github.com/golang/go/blob/master/src/runtime/mgc.go#L93

[16]逃逸分析: https://medium.com/a-journey-with-go/go-introduction-to-the-escape-analysis-f7610174e890

[17]sync.Pool: https://pkg.go.dev/sync#Pool

[18]減少分配: https://medium.com/swlh/go-the-idea-behind-sync-pool-32da5089df72

[19]Dynamic Go 日志記錄: https://docs.px.dev/tutorials/custom-data/dynamic-go-logging/

[20]bpftrace: https://github.com/iovisor/bpftrace

本文轉載自微信公眾號「幽鬼」,可以通過以下二維碼關注。轉載本文請聯系幽鬼公眾號。

責任編輯:武曉燕 來源: 幽鬼
相關推薦

2017-05-18 15:02:36

AndroidGC原理JVM內存回收

2025-01-02 14:50:34

MyBatis開發緩存

2013-07-15 11:03:52

802.11ac技術802.11ac

2011-12-22 14:27:11

2009-11-27 10:37:41

GPRS路由

2009-11-12 14:32:00

BGP路由協議

2010-02-04 16:52:01

多層交換技術

2010-08-04 09:43:28

Flex應用程序

2010-11-29 11:22:36

SYBASE數據庫日志

2009-12-09 10:07:19

Linux靜態路由

2009-11-20 09:56:27

軟交換路由技術

2009-12-09 13:35:09

靜態路由配置

2021-09-29 09:24:21

GCGo STW

2010-09-29 14:54:34

J2MEHashtable

2010-09-15 14:00:06

position屬性DIV

2023-06-27 08:37:35

Java反射動態代理機制

2009-11-06 13:27:47

寬帶接入網

2009-10-19 18:26:44

網絡綜合布線工程

2009-12-23 16:40:51

寬帶路由器

2021-07-05 22:13:09

Node內存控制
點贊
收藏

51CTO技術棧公眾號

色青青草原桃花久久综合| ww久久中文字幕| 日韩视频免费中文字幕| 91香蕉电影院| 天海翼在线视频| 精品国产麻豆| 亚洲综合视频在线观看| 成人精品福利视频| 久久久久久久九九九九| 五月婷婷激情久久| 中文字幕在线视频一区| 欧美日韩国产高清一区二区 | 伊人手机在线| 高清免费成人av| 91精品国产91久久久久久吃药| 国产全是老熟女太爽了| 国产精品无码久久久久| 亚洲最大成人综合| 麻豆av一区二区三区久久| 中文字幕一区二区人妻| 极品av少妇一区二区| 亚洲欧美国产va在线影院| www.成人黄色| 麻豆视频在线看| 国产亚洲婷婷免费| 99久久无色码| 91麻豆精品在线| 亚洲一级电影| 日韩有码视频在线| 黄色正能量网站| 精品一区二区三区四区五区| 黄色精品一区二区| 亚洲国产精品一区二区第四页av| 亚洲男人第一天堂| 精品一区二区三区蜜桃| 欧美性做爰毛片| 免费日韩在线视频| 日韩欧美在线中字| 亚洲美女动态图120秒| 亚欧精品在线视频| 国产精品99精品一区二区三区∴| 亚洲成人tv网| 18视频在线观看娇喘| 国产福利小视频在线| 播五月开心婷婷综合| 成人在线视频福利| 欧美极品少妇xxxxⅹ免费视频 | 天天干天天操天天拍| 亚洲小说春色综合另类电影| 欧美午夜不卡视频| 亚洲欧洲日产国码无码久久99| 国产淫片在线观看| 国产欧美视频一区二区三区| 精品国产一区二区三区麻豆免费观看完整版| 在线观看毛片网站| 日韩精品一二区| 97精品免费视频| 99自拍偷拍视频| 国产一区二区观看| 亚洲人精品午夜在线观看| 国产精品久久久久久久无码| 日韩在线精品强乱中文字幕| 这里只有精品99re| 黄色小视频免费网站| 日韩漫画puputoon| 欧美性猛交xxxxxxxx| 凹凸日日摸日日碰夜夜爽1| 免费高潮视频95在线观看网站| 一区二区三区中文在线| 久久99国产精品一区| 美女国产在线| 亚洲男女毛片无遮挡| 一区二区三区四区视频在线观看| 在线a免费看| 国产亚洲短视频| 日本欧美精品久久久| 国产有码在线| 久久激情免费视频| 久久免费精彩视频| 久久福利影院| 日日噜噜噜夜夜爽亚洲精品| 久久精品成人一区二区三区蜜臀| 91在线看视频| 一区二区三区国产在线| 91av视频导航| 亚洲成熟少妇视频在线观看| 日韩和的一区二区| 国产精品7m视频| 依依成人在线视频| 国产精品综合av一区二区国产馆| 亚洲自拍小视频| 亚洲老妇色熟女老太| 成人免费黄色大片| 欧美久久在线| 欧美激情视频在线播放| 国产亚洲综合性久久久影院| 欧美激情视频一区二区三区| 亚洲欧美日韩动漫| 中文欧美字幕免费| 日韩欧美在线观看强乱免费| 网友自拍视频在线| 亚洲天堂中文字幕| 欧美又粗又长又爽做受| 竹内纱里奈兽皇系列在线观看| 91久久免费观看| 天天干天天色天天干| 日韩视频一二区| 亚洲精品suv精品一区二区| 一级片视频免费看| 欧美日韩爆操| 欧美综合第一页| 97精品人妻一区二区三区在线 | www日韩欧美| 97在线观看免费高| 一本久道久久综合婷婷鲸鱼| 国产精品极品美女在线观看免费 | 久久大片网站| 午夜视频在线免费观看| 亚洲成人一区在线| 少妇黄色一级片| 99久久香蕉| 视频直播国产精品| 青青草成人av| 激情综合色综合久久| 精品无人区一区二区三区| 午夜在线视频播放| 大荫蒂欧美视频另类xxxx | 看片网站欧美日韩| 国产在线资源一区| 麻豆视频免费在线观看| 欧美日韩国产在线播放| 在线播放免费视频| 精品国产一区探花在线观看| 欧美激情喷水视频| 一级黄色片网站| 26uuu色噜噜精品一区| 超薄肉色丝袜足j调教99| 自拍偷自拍亚洲精品被多人伦好爽| 欧美三级视频在线观看| 国产人妖在线观看| 亚洲成av人片乱码色午夜| 国产成人av在线播放| 国产综合无码一区二区色蜜蜜| 欧美激情一区二区三区| 18岁网站在线观看| 9l视频自拍九色9l视频成人| 日韩中文在线中文网三级| 久久99国产综合精品免费| 不卡视频一二三四| 潘金莲一级淫片aaaaaa播放1| 69久成人做爰电影| 日韩电影免费在线观看中文字幕| 加勒比av在线播放| 国产在线不卡一区| 中文有码久久| 亚洲色图图片| 色偷偷偷亚洲综合网另类| 亚洲黄网在线观看| 91久色porny| www黄色日本| 久久久亚洲欧洲日产| 久久噜噜噜精品国产亚洲综合 | 亚洲一区二区三区高清不卡| 国产精品永久入口久久久| 成人三级网址| 欧美一区二区三区在线视频| 蜜臀av午夜精品久久| 久热成人在线视频| 一区二区三区视频| 少妇高潮一区二区三区99| 日韩在线观看免费av| 在线视频欧美亚洲| 久久久精品免费免费| 久久9精品区-无套内射无码| 最新亚洲精品| 国产精品久久久久久久午夜| 成人在线免费公开观看视频| 欧美三级电影在线看| 亚洲色图100p| 国产一级淫片a视频免费观看| 午夜视频在线观| 成人国产精品| 中文字幕亚洲欧美日韩在线不卡| 福利一区二区三区四区| 成人av影院在线| 欧美国产激情视频| 欧美做受69| 国产精品福利网站| 免费av在线网站| 国产精品成久久久久| 久久亚洲一级片| 国产亚洲综合av| 欧美视频精品在线观看| 亚洲一区二区三区四区精品| 一区二区影院| 国产激情一区二区三区在线观看| 888av在线视频| 亚洲美女av黄| 正在播放亚洲精品| 一区二区三区四区乱视频| 中文字幕在线亚洲| 久久久久成人精品| 国产伦精品一区二区三区视频网站| 91蜜桃传媒精品久久久一区二区| 青青在线视频免费| 亚州av乱码久久精品蜜桃| 99免费在线观看视频| 性欧美又大又长又硬| 综合网中文字幕| 亚洲欧美激情网| a级日韩大片| 日本久久91av| h视频在线免费观看| 精品亚洲精品福利线在观看| 亚洲一级视频在线观看| 一区二区高清免费观看影视大全| 人妻av一区二区三区| 一区二区黄色| 日本一区二区三区www| 欧美日韩黄色| 国产成人高潮免费观看精品| 自由的xxxx在线视频| 亚洲国内精品在线| 91麻豆成人精品国产免费网站| 亚洲国产精品一区二区尤物区| 国产一二三四区在线| 亚洲成人二区| 男人天堂欧美日韩| 成人精品视频一区| 色哟哟国产精品| 国产资源中文字幕| 水蜜桃久久夜色精品一区的特点| 艳色歌舞团一区二区三区| 97品白浆高清久久久久久| 欧美亚洲在线观看| 免费观看在线午夜影视| 亚洲人a成www在线影院| 在线免费观看av的网站| 国产精品无码久久久久| 欧美精品久久久久久久久| 极品美乳网红视频免费在线观看| 日韩美女视频在线| 在线观看国产一区二区三区| 色婷婷综合久久久久中文一区二区 | 欧美日韩午夜爽爽| 免费成人蒂法| 51精品国产人成在线观看 | 国产一级片黄色| 亚洲精品人人| 免费观看中文字幕| 欧美wwwww| 午夜精品区一区二区三| 网友自拍一区| 国产自产精品| 伊人久久一区| 97av在线播放| 国产ktv在线视频| 国内精品久久久久久影视8| 亚洲精品白浆| 九九久久久久99精品| 成人免费网址| 久久天天躁狠狠躁夜夜躁 | 极品在线视频| 性欧美xxxx交| 国产社区精品视频| 欧美成人中文字幕在线| 影音先锋在线视频| 欧美大片va欧美在线播放| 日本亚洲精品| 亚洲视频在线看| 国产黄色在线播放| 中文字幕国产精品久久| 91精品国产综合久久久久久豆腐| 色婷婷成人综合| 成人在线播放免费观看| 久久激情视频免费观看| h网站久久久| 日韩中文字幕精品视频| 免费动漫网站在线观看| 亚洲欧美国产一区二区三区| 国产视频精选在线| 色偷偷亚洲男人天堂| 午夜激情视频在线观看| 久久夜色精品国产欧美乱| 免费黄网在线观看| 国产亚洲精品久久久久久777| 麻豆导航在线观看| 少妇高潮 亚洲精品| 成人看av片| 97在线观看免费高清| 老司机深夜福利在线观看| 国产精国产精品| 成人午夜sm精品久久久久久久| 国产成人精彩在线视频九色| 性欧美video另类hd尤物| 99国产视频在线| 亚洲精品一级二级三级| 日本一区二区三区免费观看| 羞羞答答成人影院www| 免费观看国产精品视频| 日韩电影在线一区二区三区| 国内自拍视频网| 免费国产亚洲视频| 2018国产精品| 91久色porny| 精品无码久久久久成人漫画| 同产精品九九九| 手机看片久久久| 在线观看视频一区二区| 99视频在线观看免费| 精品一区电影国产| 国产在线看片| 奇米四色中文综合久久| 中文成人在线| 蜜桃成人在线| freexxx性亚洲精品| 日本久久一二三四| 综合久久一区二区三区| 国产精品成人免费一区久久羞羞| 粉嫩av一区二区三区在线播放| 亚洲一区二区三区四区五区六区| 88xx成人网| 亚洲品质自拍视频| 欧美第一页在线观看| 一区二区在线免费观看| 香蕉影院在线观看| 日韩午夜电影av| av免费观看一区二区| 国内揄拍国内精品少妇国语| 成人做爰视频www网站小优视频| 亚洲精品日产aⅴ| 日韩电影一区| 欧美 日韩精品| 成人一区二区三区视频| 开心激情五月网| 91国内精品野花午夜精品| 999免费视频| 亚洲欧美国产va在线影院| 1区2区3区在线| 999在线免费观看视频| 国产精品二区不卡| 中文字幕在线导航| 久久蜜桃av一区二区天堂| 国产视频91在线| 精品国产电影一区二区| 中文字幕资源网在线观看| 日韩av电影中文字幕| 六月丁香久久丫| 日韩伦理在线免费观看| 另类成人小视频在线| 成年人视频软件| 欧美日韩一区在线| 国产高清视频在线| 国产精品久久久久久搜索 | 欧美日本在线一区| 国产69精品久久app免费版| 国产精品xxxxx| 国产剧情一区| 无人在线观看的免费高清视频| 国产日韩欧美激情| 亚洲男人天堂网址| 亚洲全黄一级网站| 精品国产第一福利网站| 色姑娘综合av| 麻豆久久久久久| 中文字幕 自拍| 欧美群妇大交群的观看方式| 麻豆tv入口在线看| 成人久久一区二区三区| 欧美成人一品| 69亚洲乱人伦| 午夜久久电影网| 国产精品毛片一区二区三区四区| 国产精品狼人色视频一区| 一道本一区二区三区| 已婚少妇美妙人妻系列| 国产清纯白嫩初高生在线观看91| 性高潮视频在线观看| 欧美成人sm免费视频| 欧美日本三级| 激情伊人五月天| 国产精品拍天天在线| 国产精品久久久久久69| 欧美人交a欧美精品| 天天躁日日躁狠狠躁欧美巨大小说 | 一二三四视频社区在线| 成av人片一区二区| 最近中文字幕在线视频| 久久久999精品免费| 亚洲五码在线| 天堂社区在线视频| 亚洲欧洲制服丝袜| 天堂а在线中文在线无限看推荐| 国产精品久久久久久av福利软件| 99国产**精品****| 久久精品无码专区| 欧美日韩黄色一区二区| 九色91在线| 国产一区国产精品| 97超碰中文字幕|