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

記一次線上服務的內存泄露排查

開發 前端
在風和日麗的一天,本人正看著需求、敲著代碼,展望美好的未來。突然收到一條內存使用率過高的告警。

1、出現內存泄漏

1.1 事發現場

圖片

在風和日麗的一天,本人正看著需求、敲著代碼,展望美好的未來。突然收到一條內存使用率過高的告警。

1.2 證人證詞

告警的這個項目,老代碼是python的,最近一直在go化。隨著go化率不斷上升,發現內存的RSS使用率越飆越高。最終達到容器內存限制后,進程會自動重啟。RSS如下圖所示:

圖片

2、排查內存泄露

2.1 分析問題

看到這種不正常的RSS增長,第一反應是:是不是最近上的代碼有什么問題?是不是發生了內存泄露?內存泄露可是大事,趕緊查查。于是將時間線拉長,看看是從哪天開始的。結果,現實是很殘酷的。從項目剛上線的時候就有這個問題了。由于項目是2周一個版本,以前是還沒達到內存限制,所以沒有發出告警。

那么問題應該就是在最初的版本里。這個時候就想了想,難道是我們使用的框架本身存在缺陷?但是很快就否定了這個想法,因為我們使用的框架是其他項目已經上線已久的成熟框架。不應該有這個問題。

顯然,看代碼這種本辦法是不可能發現問題的。于是想到了golang的性能分析工具pprof。由于pprof線上環境是不開啟的,所以排查我這里只能去預發環境。

2.2 尋找問題

2.2.1 獲取內存使用監控

go tool pprof -source_path=/path/to/gopath  -inuse_space https://target.service.url/debug/pprof/allocs
  • -source_path     Search path for source files 是分析代碼時,需要用到源碼路徑,這里就是你自己本地的gopath路徑
  • /debug/pprof/allocs 
  • -inuse_space           Same as -sample_index=inuse_space 是監控使用中的內存。因為我們分析的是內存泄露,所以要查看的是實際占用的內存

輸入以上命令,會出現以下界面的內容:

圖片

2.2.2 分析內存監控

2.2.2.1 獲取top10的內存占用

由于我們需要分析內存占用,所以這個時候輸入一個top10,看看占用內存前10的都是哪些代碼。


(pprof) top 10
Showing nodes accounting for 145.07MB, 92.64% of 156.59MB total
Dropped 163 nodes (cum <= 0.78MB)
Showing top 10 nodes out of 157
flat flat% sum% cum cum%
117.36MB 74.95% 74.95% 117.36MB 74.95% github.com/beorn7/perks/quantile.newStream (inline)
14.55MB 9.29% 84.25% 134.42MB 85.84% github.com/prometheus/client_golang/prometheus.newSummary
3.53MB 2.25% 86.50% 4.06MB 2.59% compress/flate.NewWriter
2MB 1.28% 87.77% 2MB 1.28% github.com/prometheus/client_golang/prometheus.MakeLabelPairs
1.53MB 0.97% 88.75% 1.53MB 0.97% github.com/rcrowley/go-metrics.newExpDecaySampleHeap
1.50MB 0.96% 89.71% 1.50MB 0.96% go.opentelemetry.io/otel/sdk/trace.(*recordingSpan).snapshot
1.50MB 0.96% 90.67% 1.50MB 0.96% github.com/Shopify/sarama.(*TopicMetadata).decode
1.06MB 0.68% 91.35% 1.06MB 0.68% github.com/valyala/fasthttp/stackless.NewFunc
1.03MB 0.66% 92.00% 1.03MB 0.66% github.com/xdg-go/stringprep.init
1MB 0.64% 92.64% 1MB 0.64% strings.(*Builder).WriteByte

這個時候需要解釋一下顯示的指標的含義

  • flat:函數在內存上的占用
  • flat%:函數在內存占用上的占用百分比
  • sum%:是從上往下到當前行所有函數累加使用內存的比例  如第二行,sum=84.25=74.95+9.29
  • cum:這個函數以及子函數運行所占用的內存,應該大于等于flat
  • cum%:這個函數以及子函數運行所占用的內存的比例,應該大于等于flat%

2.2.2.2 查看占用函數調用棧

看完以上返回,明眼人應該就能看出,第一行這個newStream問題很大呀,讓我們進去看看他哪行代碼出了問題。需要用到一下命令

讓我們輸入list github.com/beorn7/perks/quantile.newStream一探究竟

  • (pprof) list:
  • Output annotated source for functions matching regexp
  • 顯示具體調用的代碼塊并顯示相應指標


(pprof) list github.com/beorn7/perks/quantile.newStream
Total: 156.59MB
ROUTINE ======================== github.com/beorn7/perks/quantile.newStream in pkg/mod/github.com/beorn7/perks@v1.0.1/quantile/stream.go
117.36MB 117.36MB (flat, cum) 74.95% of Total
. . 128: sorted bool
. . 129:}
. . 130:
. . 131:func newStream(? invariant) *Stream {
. . 132: x := &stream{?: ?}
117.36MB 117.36MB 133: return &Stream{x, make(Samples, 0, 500), true}
. . 134:}
. . 135:
. . 136:// Insert inserts v into the stream.
. . 137:func (s *Stream) Insert(v float64) {
. . 138: s.insert(Sample{Value: v, Width: 1})

2.2.2.3 分析泄露原因

看到這里,應該能看出這個newStream的內存占用,主要是因為生成了一個容量為500的數組。那這個數組是什么樣的呢?


type Sample struct {
Value float64 `json:",string"`
Width float64 `json:",string"`
Delta float64 `json:",string"`
}

以上結構可以看出,生成一次需要占用的內存是50038字節,那么一次就是12000個字節,差不多是11.72kb。這么看來,應該是有個地方不停的調用,導致數據持續膨脹。看到這里,我們繼續往下追。


(pprof) list github.com/prometheus/client_golang/prometheus.newSummary
Total: 156.59MB
ROUTINE ======================== github.com/prometheus/client_golang/prometheus.newSummary in pkg/mod/github.com/prometheus/client_golang@v1.12.2/prometheus/summary.go
14.55MB 134.42MB (flat, cum) 85.84% of Total
. . 220: }
. . 221: s.init(s) // Init self-collection.
. . 222: return s
. . 223: }
. . 224:
512.12kB 512.12kB 225: s := &summary{
. . 226: desc: desc,
. . 227:
. . 228: objectives: opts.Objectives,
. . 229: sortedObjectives: make([]float64, 0, len(opts.Objectives)),
. . 230:
. 1MB 231: labelPairs: MakeLabelPairs(desc, labelValues),
. . 232:
7.03MB 7.03MB 233: hotBuf: make([]float64, 0, opts.BufCap),
7.03MB 7.03MB 234: coldBuf: make([]float64, 0, opts.BufCap),
. . 235: streamDuration: opts.MaxAge / time.Duration(opts.AgeBuckets),
. . 236: }
. . 237: s.headStreamExpTime = time.Now().Add(s.streamDuration)
. . 238: s.hotBufExpTime = s.headStreamExpTime
. . 239:
. . 240: for i := uint32(0); i < opts.AgeBuckets; i++ {
. 118.86MB 241: s.streams = append(s.streams, s.newStream())
. . 242: }
. . 243: s.headStream = s.streams[0]
. . 244:
. . 245: for qu := range s.objectives {
. . 246: s.sortedObjectives = append(s.sortedObjectives, qu)

由此看出,還不止使用一次newStream()。通過觀看代碼,我這里發現,此處的opts.AgeBuckets是等于5的,那么就意味著,循環生成了5個stream,實際上占用的內存是500*3*8*5=60000字節,也就是58.6kb。

2.2.2.4 分析調用鏈路

那么現在基本追溯完了大概的泄露原因。那怎么樣能尋找是具體的調用鏈的呢,總不能一層一層往上查找調用吧?這個時候pprof提供了一個命令,可以把整體調用生成一張圖片展示。命令如下:

go tool pprof -png -source_path=/path/to/gopath  -inuse_space https://target.service.url/debug/pprof/allocs > heap.png

只需要在命令中加一個-png,那么就會生成一張圖片。當然為了方便尋找,最后可以指定圖片生成地址。我這邊抓取了和本文有關的一段截圖,如下。

圖片

根據上圖鏈路,我們大致可以看出。應該是mysql的調用,在OnFinished處,prometheus的上報的地方出現了內存泄露。這個時候我們就可以追一下OnFinished處的代碼了,因為之后的都是prometheus的調用,這是一個成熟的三方,理論不應該是他這個點出問題。

2.2.3 尋找泄露代碼

OnFinished的代碼如下:

label := append([]string{getOperation(db), s.host, s.database, tableName, hasErr, sqlState}, metrics.InjectTagValue(collector.MetricsTitle, db.Statement.Context, attachment)...)
elapsed := time.Since(s.StartTime).Seconds()
collector.DurationReporter.Collector.(prometheus.ObserverVec).WithLabelValues(label...).Observe(elapsed)

看到這里我想大家就應該知道了,go代碼會為prometheus創建一個5*500的緩沖池,來記錄數據,prometheus會周期性的調用/mertic來拉取對應的內容。那么這里是怎么造成內存泄露的呢?這里就要分析上述代碼的這個label了。


func (m *MetricVec) GetMetricWithLabelValues(lvs ...string) (Metric, error) {
h, err := m.hashLabelValues(lvs)
if err != nil {
return nil, err
}

return m.metricMap.getOrCreateMetricWithLabelValues(h, lvs, m.curry), nil
}

func (m *MetricVec) hashLabelValues(vals []string) (uint64, error) {
if err := validateLabelValues(vals, len(m.desc.variableLabels)-len(m.curry)); err != nil {
return 0, err
}

var (
h = hashNew()
curry = m.curry
iVals, iCurry int
)
for i := 0; i < len(m.desc.variableLabels); i++ {
if iCurry < len(curry) && curry[iCurry].index == i {
h = m.hashAdd(h, curry[iCurry].value)
iCurry++
} else {
h = m.hashAdd(h, vals[iVals])
iVals++
}
h = m.hashAddByte(h, model.SeparatorByte)
}
return h, nil
}

2.3 發現問題(偽)

通過查看函數調用,我這邊發現label最終進入的是這個hashLabelValues中,如果已存在就返回對應的metricMap中的內容,如果不一樣,則會創建一個新的緩沖池。內存泄露就出在這個創建中。

這個時候我就在想,難道是我們label采集的數據太多了?通過排列組合,我估算了一下內存最大值

getOperation(db)=4(操作類型,增刪改查4種)

s.host=1

s.database=3(我們有3個db實例)

tableName=30(表名,保守估計最少30個)

hasErr, sqlState=2 (報錯與沒報錯2個狀態)

metrics.InjectTagValue(collector.MetricsTitle, db.Statement.Context, attachment)...

這里面記錄的是請求,保守估計最少40個接口

這樣算下來:4*1*3*30*2*40*5*500*8*3=1648mb。再加上程序本身的一些內存開銷,感覺和我們碰到的問題能對上了。

2.4 解決問題(偽)

于是一拍腦袋覺得發現了問題,但是又無法解決問題(抓的指標無法修改)。于是屁顛屁顛的升了服務器配置,將4c2g升為了4c4g。

3、解決內存泄漏

3.1 發現問題(真)

沒錯,當你看到這里的時候,就知道,升配這件事情并沒有結束。現實給了我一記響亮的耳光。

因為升配以后總覺得還是哪里有問題。于是還是每天都在不停的觀察RSS情況。結果,還真發現問題了。因為內存還在坐火箭,這不科學啊。

當我準備繼續深入研究代碼的時候,我的一位同事提醒了我,你可以去看下/metrics具體上報了什么。說時遲那時快。于是抓取了/metrics里的上報數據,看到了以下數據:


go_mysql_execute_count_total{command="SELECT",db="db_xxxxxx",endpoint="[DELETE]/url/:id",error="false",host="xxxxxx",main_table="table_xxxxxx",sql_state="0",startpoint="/url/49630"
} 1
go_mysql_execute_count_total{command="SELECT",db="db_xxxxxx",endpoint="[DELETE]/url/:id",error="false",host="xxxxxx",main_table="table_xxxxxx",sql_state="0",startpoint="/url/49631"
} 1
go_mysql_execute_count_total{command="SELECT",db="db_xxxxxx",endpoint="[DELETE]/url/:id",error="false",host="xxxxxx",main_table="table_xxxxxx",sql_state="0",startpoint="/url/49668"
} 1
go_mysql_execute_count_total{command="SELECT",db="db_xxxxxx",endpoint="[DELETE]/url/:id",error="false",host="xxxxxx",main_table="table_xxxxxx",sql_state="0",startpoint="/url/49673"
} 1

這不看不要緊,一看——原來startpoint里上報的是restful風格的請求地址。那么上面的計算緩沖池的算法,就要再乘一個無限膨脹的startpoint。這給多少個G內存也都不夠。

于是繼續查看代碼,看能不能關閉startpoint上報。這一查,果然有:

圖片

3.2 解決問題(真)

看到這個設置START_POINT的環境變量,能關閉startpoint上報。于是立馬加到生產環境后重啟服務器。上線后觀察了一段時間,RSS使用量如下圖所示:

圖片

到此,此次內存泄露問題終于排查并修復完成。真是有驚無險。

4、內存泄露問題總結

這邊大致歸納下go語言中有哪些常見的內存泄露。

常見內存泄露

4.1 Goroutine泄漏

goroutine泄露是開發過程中碰到最常見、最頻繁的。一般經常碰到的是以下幾種,由于網上相關的文章太多了,就不用代碼舉例了。

4.1.1 協程無法退出

  •  鎖占用
  • channel無法讀取或寫入
  •  協程中邏輯有死循環?

4.1.2 協程阻塞

 協程業務邏輯時間長,釋放速度跟不上生成速度

4.1.3 內存使用不當

  • 持續增長的常駐協程,申請了大量內存空間,由于是常駐的協程,不會釋放內存造成泄露
  • 并發申請大量內存后,未達到GC時間或GC閾值,未觸發GC,導致內存泄露

4.2 結構使用不當

結構使用不當也是開發中常見的,只是可能并發不高,或者內存泄露的不多,導致使用者容易忽視掉。

4.2.1 字符串、切片截取

func main() {
var str0 = "1234567890"
str1 := str0[:5]
}

func main() {
var s0 = []int{1,2,3,4,5,6,7,8,9,0}
s1 := s0[:5]
}

上面兩段代碼,會有5個字節的泄露,因為字符串和切片的兩個變量,底層是共享內存的。只要str1或s1一直在用,str0和s0就不會回收。這樣剩下的5個字節或者5個int就會有臨時的泄露。這個場景,如果在高并發,并且數據夠大的情況下,就算是臨時的泄露,也可能對性能有極大的影響。

4.2.2 指針類型

func main() {
var prt0 = []*int{new(int), new(int), new(int), new(int), new(int)}
ptr1 := prt0[:3]
}

指針類型的這段代碼,其實和上面字符串、切片的例子很像,指針是指向內存地址的。只要ptr1沒釋放,前面的指針數組中未被用的指針就不會釋放,從而導致臨時的內存泄露。

4.2.3 數組傳參

func main() {
var arr1 = [3]int{1,2,3}
var arr2 = [3]int{}
arr2 = arr1
fmt.Printf("array address :%p, array : %+v \n", &arr1, arr1)
fmt.Printf("array address :%p, array : %+v \n", &arr2, arr2)
test(arr1)
}

func test(arr [3]int) {
fmt.Printf("array address :%p, array : %+v \n", &arr, arr)
}

打印結果如下:


array address :0xc000122030, array : [1 2 3 4 5]
array address :0xc000122060, array : [1 2 3 4 5]
array address :0xc0001220f0, array : [1 2 3 4 5]

看結果可知,三條打印的地址各不相同,說明數組是值傳遞的,那這會有什么問題呢?畢竟我們很多代碼都是這么寫的。

問題在于,只要傳遞的這個數組足夠大,那么調用一次就會生成一個一樣大小的新地址,這樣會消耗大量內存。如果短時間內無法GC,會產生臨時的內存泄露。這種泄露對于高并發是致命的。

4.2.4 定時器

func main() {
chi := make(chan int)
go func() {
for {
timer := time.After(10 * time.Second)
select {
case <-ch:
fmt.Println("get it")
case <-timer:
fmt.Println("end")
}
}
}()

for i:= 1; i< 1000000; i++ {
chi <- i
time.sleep(time.Millisecond)
}
}

以上代碼,之所以會造成內存泄露。是因為time.After的底層是實現了一個timer,只要定時器未到時間,這個定時器就不會被gc回收,從而造成臨時的內存泄露。如果這里的代碼沒寫好,定時器都是新創建的,那么就會造成永久性的泄露。

其實golang中的內存泄露遠不止上文提到的這些。有些可能甚至連查都查不到。這個時候還是要提醒大家,不僅要了解問題,還要學會查找問題。這樣不管遇到什么問題,都能發現蛛絲馬跡,問題也將迎刃而解。?

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

2021-11-23 21:21:07

線上排查服務

2019-09-10 10:31:10

JVM排查解決

2021-05-31 10:08:44

工具腳本主機

2019-03-15 16:20:45

MySQL死鎖排查命令

2021-05-13 08:51:20

GC問題排查

2023-04-06 07:53:56

Redis連接問題K8s

2023-07-06 10:11:38

.NET模式dump

2022-02-08 17:17:27

內存泄漏排查

2017-12-19 14:00:16

數據庫MySQL死鎖排查

2020-11-16 07:19:17

線上函數性能

2021-03-29 12:35:04

Kubernetes環境TCP

2021-12-02 07:50:30

NFS故障內存

2021-04-13 08:54:28

dubbo線程池事故排查

2022-11-16 08:00:00

雪花算法原理

2018-07-20 08:44:21

Redis內存排查

2022-12-17 19:49:37

GCJVM故障

2020-11-02 09:48:35

C++泄漏代碼

2021-08-19 09:50:53

Java內存泄漏

2022-09-13 17:46:19

STA模式內存

2024-03-11 08:51:08

JVMSWAP內存
點贊
收藏

51CTO技術棧公眾號

黄色一区二区视频| 丰满少妇高潮一区二区| 都市激情久久综合| 91免费观看在线| 国产精品福利在线观看| 国产高潮流白浆| 狠狠一区二区三区| 在线精品视频小说1| 潘金莲一级淫片aaaaa免费看| 肥臀熟女一区二区三区| 视频一区中文字幕国产| 久久在线精品视频| 欧美熟妇精品黑人巨大一二三区| 日韩中文在线播放| 一区二区国产视频| 欧美在线激情| 亚洲国产福利视频| 蜜臀a∨国产成人精品| 欧美激情xxxxx| 国产不卡在线观看视频| 欧美1区2区3区4区| 91精品国产全国免费观看| 欧美女人性生活视频| 日本在线观看大片免费视频| 国产亚洲欧美一区在线观看| 国产a一区二区| 中文字幕在线观看第二页| 在线日本高清免费不卡| 久久综合久久八八| 少妇av片在线观看| 欧美freesex8一10精品| 91精品国产品国语在线不卡| 亚洲中文字幕久久精品无码喷水| h片精品在线观看| 亚洲欧美中日韩| 日本一区二区免费看| 欧美在线精品一区二区三区| 国产一区二区三区视频在线播放| 国产精品午夜国产小视频| 91丝袜一区二区三区| 亚洲国产日本| 久久久免费观看视频| 朝桐光av在线| 亚洲国产精品91| 中文字幕欧美专区| 欧美 日韩 成人| 天天躁日日躁成人字幕aⅴ| 精品国产成人系列| 可以看的av网址| 日韩在线成人| 日韩一区二区高清| www,av在线| 亚洲午夜国产成人| 在线不卡中文字幕播放| 伊人国产在线视频| 日韩成人在线电影| 69久久夜色精品国产69蝌蚪网| 成人性视频欧美一区二区三区| 亚洲精品福利电影| 91黄色激情网站| 久久国产成人精品国产成人亚洲 | 久久麻豆一区二区| 快播日韩欧美| 日韩偷拍自拍| 国产午夜精品一区二区三区四区| 六月婷婷久久| 国内精品一区视频| 国产精品你懂的| 中文字幕人成一区| 9191在线播放| 五月天亚洲精品| 成人亚洲视频在线观看| 婷婷精品久久久久久久久久不卡| 欧美美女视频在线观看| 亚欧精品在线视频| 国产suv精品一区| 日韩大陆欧美高清视频区| 国产精品815.cc红桃| 成人久久综合| 欧美丰满少妇xxxxx做受| www国产黄色| 欧美喷水视频| 欧美成人艳星乳罩| 亚洲天堂2024| 精品国产一区二区三区久久久樱花 | 亚洲午夜视频| 91精品国产99| 136福利视频导航| 国产精品白丝jk黑袜喷水| 国产成人亚洲综合a∨婷婷| 日韩电影中文 亚洲精品乱码| 亚洲一区二区三区无码久久| sm国产在线调教视频| 天堂一区二区在线| 国产欧美精品在线播放| 亚洲高清av一区二区三区| 不卡一区视频| 精品亚洲一区二区三区四区五区| 国产精品国产三级国产专业不 | 欧美一区二区三区不卡视频| 久久超碰97中文字幕| 91久久国产婷婷一区二区| 六月丁香色婷婷| 国产精品视频一二| 妞干网视频在线观看| 丝袜老师在线| 91精品国产入口| 国产精品无码一区二区三区| 亚洲欧美综合| 国产精品久久久久久久久男| 亚洲国产成人在线观看| 中文字幕av免费专区久久| 美女扒开大腿让男人桶| 日韩毛片网站| 亚洲毛片在线观看| 久久成人国产精品入口| 麻豆精品一区二区综合av| 久久久久天天天天| 羞羞视频在线观看免费| 欧美系列亚洲系列| 无码人妻aⅴ一区二区三区| 中文字幕日韩欧美精品高清在线| 国产成人综合久久| 手机看片一区二区| 亚洲激情中文1区| www.亚洲高清| 欧美日韩爱爱| 欧洲美女免费图片一区| 蜜桃91麻豆精品一二三区| 亚洲欧洲日韩av| 日本成人中文字幕在线| 米奇777超碰欧美日韩亚洲| 韩国精品美女www爽爽爽视频| 99er热精品视频| 国产精品国产三级国产| 日韩精品免费播放| 免费看成人吃奶视频在线| 亚州成人av在线| 亚洲AV无码一区二区三区少妇| 日韩一区在线看| 国产日韩欧美久久| 欧美aaaaaaaaaaaa| 国产欧美日韩91| 天堂а√在线官网| 精品视频在线视频| 性猛交ⅹxxx富婆video | 欧美日韩一本| 欧美男插女视频| 中文字幕在线网站| 国产校园另类小说区| 97av视频在线观看| 亚洲精华一区二区三区| 91产国在线观看动作片喷水| 色呦呦视频在线| 精品国产1区2区| 国产精品第七页| 美女精品在线| 中文字幕久久亚洲| 中文字幕一区二区三区四区欧美| 久久色中文字幕| 99草草国产熟女视频在线| 久久99国产精品视频| 国产成人av在线| av片在线看| 制服视频三区第一页精品| 欧美一区免费观看| 国产1区2区3区精品美女| r级无码视频在线观看| 日韩在线黄色| 国产精品高精视频免费| 日本在线免费看| 日韩一区二区三区四区| 久久精品性爱视频| 久久亚洲捆绑美女| 欧美特级aaa| 女主播福利一区| 久久久久久一区| 色综合久久久| 欧美精品videos性欧美| 欧美在线观看在线观看| 欧美三片在线视频观看| 强行糟蹋人妻hd中文| 97se亚洲国产综合自在线| 久久精品免费网站| 欧美女激情福利| 欧美另类高清视频在线| 婷婷精品久久久久久久久久不卡| 欧美精品video| 成人在线播放视频| 欧美成人艳星乳罩| 在线观看亚洲黄色| 亚洲永久精品大片| 精品人妻一区二区三区蜜桃视频| 国产主播一区二区三区| 亚洲欧洲日产国码无码久久99 | www国产成人| 日韩av卡一卡二| 亚洲精品极品| 在线一区高清| 影视先锋久久| 懂色一区二区三区av片| 99久久久国产精品免费调教网站| 欧美国产日韩中文字幕在线| 你懂的免费在线观看视频网站| 欧美日韩高清影院| 国产香蕉视频在线| 亚洲精品高清在线观看| 中文字幕 自拍| 成人三级在线视频| 手机在线国产视频| 日韩国产精品91| 日本网站免费在线观看| 欧美一区二区三区另类| 亚洲国产一区二区精品视频| 欧美理伦片在线播放| 92国产精品久久久久首页| 综合在线影院| 性欧美长视频免费观看不卡| 成人av黄色| 色视频www在线播放国产成人| 欧美色18zzzzxxxxx| 亚洲第一二三四五区| 99久久亚洲精品日本无码| 欧洲av一区二区嗯嗯嗯啊| 国产精品老女人| 亚洲国产精品人人做人人爽| 亚洲成人生活片| 中文字幕一区三区| 国产精品成人在线视频| 久久久99精品免费观看不卡| 亚洲成人av免费在线观看| 国产69精品久久99不卡| www日本在线观看| 国内精品国产三级国产a久久| 香蕉视频禁止18| 蜜桃视频第一区免费观看| 99免费视频观看| 天堂成人免费av电影一区| 久久国产亚洲精品无码| 国产精品一级| 国产乱子伦农村叉叉叉| 日韩亚洲国产精品| 国产精品入口芒果| 影音先锋中文字幕一区| 无码人妻少妇伦在线电影| 欧美日韩一区二区高清| www.男人天堂网| 国产综合自拍| 97超碰人人澡| 一区二区三区导航| www一区二区www免费| 久久都是精品| 久久久久久三级| 久久99久久精品欧美| 999久久久精品视频| 精品一区二区日韩| 一卡二卡三卡四卡五卡| 国产91露脸合集magnet| 东京热av一区| 99re成人精品视频| 丰满少妇高潮一区二区| 国产精品系列在线| 欧美风情第一页| 亚洲精品精品亚洲| 九热这里只有精品| 欧美日韩亚洲高清| www.久久网| 3751色影院一区二区三区| 精品区在线观看| 亚洲精品xxxx| 国产一级网站视频在线| 日韩中文字幕欧美| 欧美寡妇性猛交xxx免费| 91av视频在线免费观看| 精品123区| 91精品入口蜜桃| 偷拍自拍亚洲色图| 亚洲色图自拍| 精品1区2区3区4区| 粗暴91大变态调教| 国产乱妇无码大片在线观看| 香港三日本8a三级少妇三级99| 国产亚洲精品精华液| 999精品在线视频| 亚洲狠狠爱一区二区三区| 国产美女激情视频| 在线成人小视频| 亚洲 欧美 自拍偷拍| 在线观看欧美成人| 91精彩视频在线播放| 欧美国产激情18| 日本电影欧美片| 99re视频在线| 精品日韩免费| 欧美久久在线观看| 奇米精品一区二区三区在线观看| 亚洲av无码久久精品色欲| 久久精品一二三| 久久国产一级片| 欧美亚一区二区| 日本黄色大片视频| 中文字幕综合一区| 蜜桃视频动漫在线播放| 96国产粉嫩美女| 欧美日韩亚洲在线观看| 成人午夜精品久久久久久久蜜臀| 美女在线视频一区| 亚洲狠狠婷婷综合久久久久图片| 中文字幕一区免费在线观看| 黑人精品无码一区二区三区AV| 91精品久久久久久久91蜜桃| 国产精品秘入口| 91国在线精品国内播放| 欧美激情三级| 亚洲精品影院| 丝袜国产日韩另类美女| 男人的天堂影院| 一区二区三区视频在线看| 中文字幕+乱码+中文| 国产视频亚洲精品| gratisvideos另类灌满| 91视频国产高清| 欧美独立站高清久久| 亚洲色精品三区二区一区| 99久久伊人网影院| 精品视频一区二区在线观看| 91精品国产综合久久福利软件| 自拍视频在线| 国产精品美女午夜av| 免费视频亚洲| 欧美在线观看成人| a级精品国产片在线观看| 欧美日韩免费一区二区| 91精品国产综合久久福利| 老司机午夜在线视频| 国产精自产拍久久久久久| 欧美综合在线视频观看| 国产免费人做人爱午夜视频| 91麻豆蜜桃一区二区三区| 好吊操这里只有精品| 精品国免费一区二区三区| 色呦呦在线资源| 亚洲自拍偷拍第一页| 中文无码久久精品| 三级黄色片免费观看| 亚洲精品国产第一综合99久久 | 69堂精品视频在线播放| 神马影院我不卡午夜| 奇米影视一区二区三区小说| 波多野吉衣中文字幕| 色诱亚洲精品久久久久久| 黄色片在线播放| 国产精品久久久久久影视 | 欧美大黑帍在线播放| 高清日韩电视剧大全免费| 久久久全国免费视频| 精品av久久707| av免费不卡国产观看| 久久99精品国产一区二区三区| 亚洲免费影视| 亚洲色成人网站www永久四虎 | 人妻无码中文字幕| 91超碰caoporn97人人| 亚洲图片久久| 天天视频天天爽| 亚洲精品欧美二区三区中文字幕| 国产精品久久久久久久久毛片| 欧美超级免费视 在线| 91蜜桃臀久久一区二区| 成熟丰满熟妇高潮xxxxx视频| 久久综合五月天婷婷伊人| 毛片在线免费播放| 欧美精品日韩www.p站| 老司机成人在线| 午夜精品在线免费观看| 亚洲男人的天堂在线观看| 日批视频免费播放| 国产精品久久久久久久久男 | 欧洲亚洲在线视频| 欧美亚洲高清| 午夜诱惑痒痒网| 五月天中文字幕一区二区| 国产精品一区二区三区四区色| 91精品视频免费看| 亚洲狠狠婷婷| 精品一区二区6| 精品国产欧美一区二区| 欧美va在线| 欧美视频在线第一页| 久久九九久精品国产免费直播| 国产精品久久久久久久成人午夜| 久久久免费电影| 欧美1级片网站| 欧美bbbbb性bbbbb视频| 91精品国产麻豆| 亚洲欧美韩国| 欧洲精品视频在线| 国产欧美一区二区精品婷婷| 丰满人妻妇伦又伦精品国产| 国产精品视频一区二区三区四|