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

MYSQL 深潛 - 剖析 Performance Schema 內存管理

數據庫 MySQL
MYSQL Performance schema(PFS)是mysql提供的強大的性能監控診斷工具,提供了一種能夠在運行時檢查server內部執行情況的特方法。PFS通過監視server內部已注冊的事件來收集信息,一個事件理論上可以是server內部任何一個執行行為或資源占用,比如一個函數調用、一個系統調用wait、SQL查詢中的解析或排序狀態,或者是內存資源占用等。

 [[426340]]

一 引言

MYSQL Performance schema(PFS)是mysql提供的強大的性能監控診斷工具,提供了一種能夠在運行時檢查server內部執行情況的特方法。PFS通過監視server內部已注冊的事件來收集信息,一個事件理論上可以是server內部任何一個執行行為或資源占用,比如一個函數調用、一個系統調用wait、SQL查詢中的解析或排序狀態,或者是內存資源占用等。

PFS將采集到的性能數據存儲在performance_schema存儲引擎中,performance_schema存儲引擎是一個內存表引擎,也就是所有收集的診斷信息都會保存在內存中。診斷信息的收集和存儲都會帶來一定的額外開銷,為了盡可能小的影響業務,PFS的性能和內存管理也顯得非常重要了。

本文主要是通過對PFS引擎的內存管理的源碼的閱讀,解讀PFS內存分配及釋放原理,深入剖析其中存在的一些問題,以及一些改進思路。本文源代碼分析基于Mysql-8.0.24版本。

二 內存管理模型

PFS內存管理有幾個關鍵特點:

內存分配以Page為單位,一個Page內可以存儲多條record
系統啟動時預先分配部分pages,運行期間根據需要動態增長,但page是只增不回收的模式
record的申請和釋放都是無鎖的

1 核心數據結構

PFS_buffer_scalable_container是PFS內存管理的核心數據結構,整體結構如下圖:

Container中包含多個page,每個page都有固定個數的records,每個record對應一個事件對象,比如PFS_thread。每個page中的records數量是固定不變的,但page個數會隨著負載增加而增長。

2 Allocate時Page選擇策略

PFS_buffer_scalable_container是PFS內存管理的核心數據結構

涉及內存分配的關鍵數據結構如下:

  1. PFS_PAGE_SIZE  // 每個page的大小, global_thread_container中默認為256PFS_PAGE_COUNT // page的最大個數,global_thread_container中默認為256class PFS_buffer_scalable_container {  PFS_cacheline_atomic_size_t m_monotonic;            // 單調遞增的原子變量,用于無鎖選擇page  PFS_cacheline_atomic_size_t m_max_page_index;       // 當前已分配的最大page index  size_t m_max_page_count;                            // 最大page個數,超過后將不再分配新page  std::atomic< array_type *> m_pages[PFS_PAGE_COUNT];  // page數組  native_mutex_t m_critical_section;                  // 創建新page時需要的一把鎖} 

首先m_pages是一個數組,每個page都可能有free的records,也有可能整個page都是busy的,Mysql采用了比較簡單的策略,輪訓挨個嘗試每個page是否有空閑,直到分配成功。如果輪訓所有pages依然沒有分配成功,這個時候就會創建新的page來擴充,直到達到page數的上限。

輪訓并不是每次都是從第1個page開始尋找,而是使用原子變量m_monotonic記錄的位置開始查找,m_monotonic在每次在page中分配失敗是加1。

核心簡化代碼如下:

  1. value_type *allocate(pfs_dirty_state *dirty_state) {  current_page_count = m_max_page_index.m_size_t.load();    monotonic = m_monotonic.m_size_t.load();  monotonicmonotonic_max = monotonic + current_page_count;  while (monotonic < monotonic_max) {    index = monotonic % current_page_count;    array = m_pages[index].load();    pfs = array->allocate(dirty_state);    if  (pfs) {      // 分配成功返回      return pfs;    } else {      // 分配失敗,嘗試下一個page,       // 因為m_monotonic是并發累加的,這里有可能本地monotonic變量并不是線性遞增的,有可能是從1 直接變為 3或更大,      // 所以當前while循環并不是嚴格輪訓所有page,很大可能是跳著嘗試,換者說這里并發訪問下大家一起輪訓所有的page。      // 這個算法其實是有些問題的,會導致某些page被跳過忽略,從而加劇擴容新page的幾率,后面會詳細分析。      monotonic = m_monotonic.m_size_t++;    }  }    // 輪訓所有Page后沒有分配成功,如果沒有達到上限的話,開始擴容page  while (current_page_count < m_max_page_count) {    // 因為是并發訪問,為了避免同時去創建新page,這里有一個把同步鎖,也是整個PFS內存分配唯一的鎖    native_mutex_lock(&m_critical_section);    // 拿鎖成功,如果array已經不為null,說明已經被其它線程創建成功    array = m_pages[current_page_count].load();    if (array == nullptr) {      // 搶到了創建page的責任      m_allocator->alloc_array(array);      m_pages[current_page_count].store(array);      ++m_max_page_index.m_size_t;    }    native_mutex_unlock(&m_critical_section);        // 在新的page中再次嘗試分配    pfs = array->allocate(dirty_state);    if (pfs) {      // 分配成功并返回      return pfs;    }    // 分配失敗,繼續嘗試創建新的page直到上限  }} 

我們再詳細分析下輪訓page策略的問題,因為m_momotonic原子變量的累加是并發的,會導致一些page被跳過輪訓它,從而加劇了擴容新page的幾率。

舉一個極端一些的例子,比較容易說明問題,假設當前一共有4個page,第1、4個page已滿無可用record,第2、3個page有可用record。

當同時來了4個線程并發Allocate請求,同時拿到了的m_monotonic=0.

monotonic = m_monotonic.m_size_t.load();

這個時候所有線程嘗試從第1個page分配record都會失敗(因為第1個page是無可用record),然后累加去嘗試下一個page

monotonic = m_monotonic.m_size_t++;

這個時候問題就來了,因為原子變量++是返回最新的值,4個線程++成功是有先后順序的,第1個++的線程后monotonic值為2,第2個++的線程為3,以次類推。這樣就看到第3、4個線程跳過了page2和page3,導致3、4線程會輪訓結束失敗進入到創建新page的流程里,但這個時候page2和page3里是有空閑record可以使用的。

雖然上述例子比較極端,但在Mysql并發訪問中,同時申請PFS內存導致跳過一部分page的情況應該還是非常容易出現的。

3 Page內Record選擇策略

PFS_buffer_default_array是每個Page維護一組records的管理類。

關鍵數據結構如下:

  1. class PFS_buffer_default_array {PFS_cacheline_atomic_size_t m_monotonic;      // 單調遞增原子變量,用來選擇free的recordsize_t m_max;                                 // record的最大個數T *m_ptr;                                     // record對應的PFS對象,比如PFS_thread} 

每個Page其實就是一個定長的數組,每個record對象有3個狀態FREE,DIRTY, ALLOCATED,FREE表示空閑record可以使用,ALLOCATED是已分配成功的,DIRTY是一個中間狀態,表示已被占用但還沒分配成功。

Record的選擇本質就是輪訓查找并搶占狀態為free的record的過程。

核心簡化代碼如下:

  1. value_type *allocate(pfs_dirty_state *dirty_state) {  // 從m_monotonic記錄的位置開始嘗試輪序查找  monotonic = m_monotonic.m_size_t++;  monotonicmonotonic_max = monotonic + m_max;  while (monotonic < monotonic_max) {    index = monotonic % m_max;    pfs = m_ptr + index;      // m_lock是pfs_lock結構,free/dirty/allocated三狀態是由這個數據結構來維護的    // 后面會詳細介紹它如何實現原子狀態遷移的    if (pfs->m_lock.free_to_dirty(dirty_state)) {      return pfs;    }    // 當前record不為free,原子變量++嘗試下一個    monotonic = m_monotonic.m_size_t++;  }} 

選擇record的主體主體流程和選擇page基本相似,不同的是page內record數量是固定不變的,所以沒有擴容的邏輯。

當然選擇策略相同,也會有同樣的問題,這里的m_monotonic原子變量++是多線程并發的,同樣如果并發大的場景下會有record被跳過選擇了,這樣導致page內部即便有free的record也可能沒有被選中。

所以也就是page選擇即便是沒有被跳過,page內的record也有幾率被跳過而選不中,雪上加霜,更加加劇了內存的增長。

4 pfs_lock

每個record都有一個pfs_lock,來維護它在page中的分配狀態(free/dirty/allocated),以及version信息。

關鍵數據結構:

struct pfs_lock {
std::atomic m_version_state;
}

pfs_lock使用1個32位無符號整型來保存version+state信息,格式如下:

state

低2位字節表示分配狀態。

state PFS_LOCK_FREE = 0x00
state PFS_LOCK_DIRTY = 0x01
state PFS_LOCK_ALLOCATED = 0x11

version

初始version為0,每分配成功一次加1,version就能表示該record被分配成功的次數
主要看一下狀態遷移代碼:

  1. // 下面3個宏主要就是用來位操作的,方便操作state或version#define VERSION_MASK 0xFFFFFFFC#define STATE_MASK 0x00000003#define VERSION_INC 4bool free_to_dirty(pfs_dirty_state *copy_ptr) {  uint32 old_val = m_version_state.load();  // 判斷當前state是否為FREE,如果不是,直接返回失敗  if ((old_val & STATE_MASK) != PFS_LOCK_FREE) {    return false;  }  uint32 new_val = (old_val & VERSION_MASK) + PFS_LOCK_DIRTY;  // 當前state為free,嘗試將state修改為dirty,atomic_compare_exchange_strong屬于樂觀鎖,多個線程可能同時  // 修改該原子變量,但只有1個修改成功。  bool pass =      atomic_compare_exchange_strong(&m_version_state, &old_val, new_val);  if (pass) {    // free to dirty 成功    copy_ptr->m_version_state = new_val;  }  return pass;}void dirty_to_allocated(const pfs_dirty_state *copy) {  /* Make sure the record was DIRTY. */  assert((copy->m_version_state & STATE_MASK) == PFS_LOCK_DIRTY);  /* Increment the version, set the ALLOCATED state */  uint32 new_val = (copy->m_version_state & VERSION_MASK) + VERSION_INC +                   PFS_LOCK_ALLOCATED;  m_version_state.store(new_val);} 

狀態遷移過程還是比較好理解的, 由dirty_to_allocated和allocated_to_free的邏輯是更簡單的,因為只有record狀態是free時,它的狀態遷移是存在并發多寫問題的,一旦state變為dirty,當前record相當于已經被某一個線程占有,其它線程不會再嘗試操作該record了。

version的增長是在state變為PFS_LOCK_ALLOCATED時

5 PFS內存釋放

PFS內存釋放就比較簡單了,因為每個record都記錄了自己所在的container和page,調用deallocate接口,最終將狀態置為free就完成了。

最底層都會進入到pfs_lock來更新狀態:

  1. struct pfs_lock {  void allocated_to_free(void) {    /*      If this record is not in the ALLOCATED state and the caller is trying      to free it, this is a bug: the caller is confused,      and potentially damaging data owned by another thread or object.    */    uint32 copy = copy_version_state();    /* Make sure the record was ALLOCATED. */    assert(((copy & STATE_MASK) == PFS_LOCK_ALLOCATED));    /* Keep the same version, set the FREE state */    uint32 new_val = (copy & VERSION_MASK) + PFS_LOCK_FREE;    m_version_state.store(new_val);  }} 

三 內存分配的優化

前面我們分析到無論是page還是record都有幾率出現跳過輪訓的問題,即便是緩存中有free的成員也會出現分配不成功,導致創建更多的page,占用更多的內存。最主要的問題是這些內存一旦分配就不會被釋放。

為了提升PFS內存命中率,盡量避免上述問題,有一些思路如下:

  1. while (monotonic < monotonic_max) {    index = monotonic % current_page_count;    array = m_pages[index].load();    pfs = array->allocate(dirty_state);    if  (pfs) {       // 記錄分配成功的index       m_monotonic.m_size_t.store(index);      return pfs;    } else {      // 局部變量遞增,避免掉并發累加而跳過某些pages      monotonic++;    }  } 

另外一點,每次查找都是從最近一次分配成功的位置開始,這樣必然導致并發訪問的沖突,因為大家都從同一個位置開始找,起始查找位置應該加入一定的隨機性,這樣可以避免大量的沖突重試。

總結如下:

每次Allocate是從最近一次分配成功的index開始查找,或者隨機位置開始查找
每個Allocate嚴格輪訓所有pages或records

四 內存釋放的優化

PFS內存釋放的最大的問題就是一旦創建出的內存就得不到釋放,直到shutdown。如果遇到熱點業務,在業務高峰階段分配了很多page的內存,在業務低峰階段依然得不到釋放。

要實現定期檢測回收內存,又不影響內存分配的效率,實現一套無鎖的回收機制還是比較復雜的。

主要有如下幾點需要考慮:

釋放肯定是要以page為單位的,也就是釋放的page內的所有records都必須保證都為free,而且要保證待free的page不會再被分配到
內存分配是隨機的,整體上內存是可以回收的,但可能每個page都有一些busy的,如何更優的協調這種情況
釋放的閾值怎么定,也要避免頻繁分配+釋放的問題
針對PFS內存釋放的優化,PolarDB已經開發并提供了定期回收PFS內存的特性,鑒于本篇幅的限制,留在后續再介紹了。

責任編輯:梁菲 來源: 阿里云云棲號
相關推薦

2021-08-26 10:44:31

MySQL MySQL Data 阿里云

2021-08-25 11:25:41

MySQLData Dictio數據庫

2022-03-11 09:12:06

MySQLMDL

2009-09-03 16:58:49

C#內存管理

2011-07-18 17:14:16

Objective-C 內存 Cocoa

2011-07-19 15:15:09

Objective-C 內存

2011-07-21 09:42:27

Objective-C 內存 Autoreleas

2013-04-11 14:37:36

Objective-CiOS內存管理系統自動創建新的aut

2025-05-30 02:00:00

2013-04-11 14:32:00

Objective-CiOS開發內存管理@synthesize

2024-12-12 09:24:28

RocksDB服務器

2022-06-01 16:01:58

MySQL內存管理系統

2013-04-11 14:16:57

Objective-CiOS開發內存管理

2021-05-31 16:09:31

MySQLSchema設計

2019-05-09 14:22:01

華云數據大數據

2013-04-11 13:57:27

Objective-CiOS開發內存管理

2025-06-16 09:46:06

2018-07-23 09:26:08

iOS內存優化

2013-10-11 17:32:18

Linux運維內存管理

2017-01-26 20:48:14

MySQL復制MySQL程序壓縮
點贊
收藏

51CTO技術棧公眾號

自拍偷拍亚洲精品| 在线观看av一区| 国产呦系列欧美呦日韩呦| 亚洲 欧美 日韩 综合| 欧洲专线二区三区| 69久久99精品久久久久婷婷| 无码av天堂一区二区三区| 日韩大胆人体| 国产又粗又猛又爽又黄91精品| 久久久久久久999精品视频| 中文幕无线码中文字蜜桃| 日韩欧国产精品一区综合无码| 一区二区三区在线视频播放| 久久久久久高清| 国产精品伦理一区| 亚洲专区免费| 九九九久久久久久| 99久久久无码国产精品性| 国产一精品一av一免费爽爽| 欧美午夜宅男影院在线观看| 超碰成人在线免费观看| 神马精品久久| 国产成人午夜精品影院观看视频 | 日韩午夜av| www欧美日韩| 亚洲熟妇一区二区三区| 欧美成人精品一级| 欧美日韩一区不卡| 免费观看美女裸体网站| 韩国av网站在线| 国产亚洲视频系列| 精品一区二区三区免费毛片| 国产精品一区二区三区在线免费观看| 亚洲一区二区免费看| 精品视频9999| 国产一区二区精彩视频| 欧美肉体xxxx裸体137大胆| 亚洲国产精品yw在线观看| 91精产国品一二三产区别沈先生| 欧美极品影院| 精品久久在线播放| 国产色一区二区三区| av电影高清在线观看| 国产精品成人网| 先锋影音亚洲资源| 国产毛片av在线| 久久综合国产精品| 久久精品ww人人做人人爽| 丰满熟妇人妻中文字幕| 国产精品一区二区在线观看网站| 成人h视频在线| 这里只有精品9| 日韩1区2区日韩1区2区| 国产不卡精品视男人的天堂| 国产成人综合欧美精品久久| 亚洲国产精品一区制服丝袜| 欧美俄罗斯性视频| 免费人成视频在线| 欧美三级小说| 久久久久久久久亚洲| 免费一级片在线观看| 欧美区亚洲区| 国语自产精品视频在线看抢先版图片| 国产在线视频第一页| 国内久久精品| 97精品在线视频| 欧美日韩一二三四区| 美女尤物久久精品| 国产精品久久一区| 亚洲一级特黄毛片| 国产麻豆精品theporn| 7777精品久久久大香线蕉小说| 96日本xxxxxⅹxxx17| 国产一区二区三区在线观看免费视频 | 日韩经典中文字幕一区| 国产精品毛片a∨一区二区三区|国| 国产乡下妇女三片| 久久99国产精品麻豆| 亚洲精品免费在线视频| 高h调教冰块play男男双性文| 不卡av在线免费观看| 久久国产主播精品| wwwww在线观看免费视频| 亚洲三级久久久| 国产精品国产对白熟妇| 性欧美超级视频| 欧美精品免费视频| 绯色av蜜臀vs少妇| 自拍偷拍一区| 日韩在线欧美在线| 国产一卡二卡在线播放| 日韩精品一二三区| 亚洲伊人第一页| 五月婷婷六月激情| 国产精品网站在线观看| 台湾无码一区二区| 日韩pacopacomama| 91精品国产91久久久久久一区二区 | 日本精品视频| 国产婷婷成人久久av免费高清| 欧美18—19性高清hd4k| 亚洲电影影音先锋| 欧美亚洲免费电影| 国产三级伦理片| 91蝌蚪porny成人天涯| 伊甸园精品99久久久久久| 国产又色又爽又黄刺激在线视频| 色综合天天视频在线观看| 在线免费看污网站| 免费成人高清在线视频theav| 日韩亚洲一区二区| 亚洲欧美在线观看视频| 激情六月婷婷久久| 欧美午夜欧美| 男女在线观看视频| 欧美日韩一级黄| 亚洲成人日韩在线| 欧美日韩日本国产亚洲在线 | 久久九九久精品国产免费直播| 男女啪啪的视频| 香蕉久久免费电影| 日韩av中文字幕在线| 神马午夜精品91| 亚洲欧美日韩一区在线观看| 97伦理在线四区| 91美女视频在线| 欧美日韩激情小视频| 日韩精品――色哟哟| 欧美电影《睫毛膏》| 日韩免费观看在线观看| 色婷婷激情五月| 一区二区三区在线播| 亚洲精品永久视频| 第一会所亚洲原创| 国产精品9999| 免费在线观看一级毛片| 婷婷国产在线综合| youjizz.com日本| 国自产拍偷拍福利精品免费一| 91精品视频大全| 日本高清视频在线观看| 在线亚洲一区观看| 国产传媒国产传媒| 日韩激情一二三区| 日本一区二区三区在线视频| 亚洲精品福利电影| 日韩精品中文在线观看| 日韩精品一区二区三| www.欧美日韩| 日韩国产欧美亚洲| 日韩成人午夜| 国产mv久久久| 成人午夜电影在线观看| 欧美亚洲国产一区二区三区| 最近中文字幕在线mv视频在线 | 国产精品视频免费观看www| 你懂的在线观看| 色综合久久综合| 一区二区三区久久久久| 日韩一区精品字幕| 亚洲天堂电影网| 精品视频91| 欧美国产日韩一区二区三区| 亚洲精品18在线观看| 亚洲成人av一区二区三区| 亚洲国产第一区| 久久久青草婷婷精品综合日韩| 日韩av高清在线播放| 日本肉肉一区 | av手机在线观看| 日韩精品免费在线观看| 无码人妻丰满熟妇精品区| 国产区在线观看成人精品 | 精品国产一区二区三区四| 91蜜桃免费观看视频| 亚洲乱码国产一区三区| 99久久这里只有精品| 成人av免费电影| 一二三四视频在线中文| 在线观看日韩av| 99精品在线视频观看| 亚洲3atv精品一区二区三区| 成人乱码一区二区三区av| 麻豆视频一区二区| 日本一区午夜艳熟免费| 精品产国自在拍| 亚洲va欧美va国产综合久久| 成人观看网址| 日韩在线观看免费av| 亚洲欧美激情在线观看| 日韩欧美精品网址| 日本美女黄色一级片| 成人午夜又粗又硬又大| 亚洲精品高清无码视频| 亚洲自拍偷拍网| 青青草原成人| 在线视频亚洲欧美中文| 国产精品久久久久久久久久尿 | 97香蕉久久超级碰碰高清版| av在线电影免费观看| 精品国产免费一区二区三区香蕉| 中文字幕免费高清网站| 亚洲最大的成人av| 国产探花视频在线播放| 成人免费视频免费观看| 日本三级黄色网址| 国产精品乱看| 真人做人试看60分钟免费| 国产精品嫩草影院在线看| 官网99热精品| 亚洲欧美专区| 国产成人精品亚洲精品| 欧美伦理91| 欧美精品日韩www.p站| 国产一级在线| 亚洲精品国产综合久久| 99热这里是精品| 欧美三级视频在线| 在线观看国产亚洲| 亚洲一区二区在线免费观看视频| 美女av免费看| 久久精品亚洲国产奇米99| 久久久久久婷婷| 国产乱子轮精品视频| 中文字幕成人在线视频| 久久久久久穴| 国产成人亚洲精品无码h在线| 午夜久久福利| 国产精品一区在线免费观看| 成人中文视频| 水蜜桃一区二区三区| 深夜福利久久| 久久久福利视频| 欧美日韩麻豆| 国产精品一区二区在线观看 | 777久久久精品| 亚洲av综合一区| 91成人看片片| 青青国产在线视频| 色网站国产精品| 一区二区三区福利视频| 精品久久久久久久久中文字幕| 久久久无码精品亚洲国产| 亚洲精品中文在线观看| 免费成年人视频在线观看| 国产精品久久久久久久久图文区| 一级黄色片网址| 中文字幕第一区| 999精品久久久| 国产精品国模大尺度视频| 日韩福利在线视频| 国产精品色婷婷久久58| 国产又粗又猛又爽又黄的视频小说| 国产亚洲一区二区三区四区| 97人妻精品一区二区免费| 久久久不卡网国产精品二区| 国产精品一二三区在线观看| 国产偷国产偷精品高清尤物| 男人舔女人下部高潮全视频| 亚洲国产精品v| 性色国产成人久久久精品| 亚洲欧洲精品一区二区三区 | 伊人久久一区二区三区| av一区二区三区在线| 黑人巨大精品欧美| 欧美国产日韩一二三区| 一级二级黄色片| 成人欧美一区二区三区白人| 欧美丰满艳妇bbwbbw| 亚洲高清在线精品| 天堂网中文字幕| 欧美无砖专区一中文字| 国产伦理一区二区| 亚洲国产成人91精品| 欧美婷婷久久五月精品三区| 一色桃子一区二区| 最新国产在线拍揄自揄视频| 午夜精品久久久久久久男人的天堂| 日韩激情电影免费看| 国产精品久久二区| 日韩中文在线| 欧美久久久久久| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 国产精品第二十页| 精品国产精品三级精品av网址| 丁香社区五月天| 欧美精品v日韩精品v韩国精品v| 国产叼嘿视频在线观看| 亚洲精品视频免费| 国产在线观看a| 57pao成人国产永久免费| 欧美综合社区国产| 精品国产一区二区三区四区精华 | 成熟丰满熟妇高潮xxxxx视频| 亚洲在线一区| 黑人无套内谢中国美女| 国产日韩欧美一区二区三区乱码| 麻豆视频在线免费看| 日韩欧美aaa| 999久久久久| 亚洲欧洲日产国产网站| av色综合久久天堂av色综合在| 欧美又大粗又爽又黄大片视频| gogo大尺度成人免费视频| 精品久久精品久久| 在线免费观看日本欧美爱情大片| 国产乱子夫妻xx黑人xyx真爽 | 亚洲最大av网站| 欧美男男gaytwinkfreevideos| 黄色影视在线观看| 日韩电影免费一区| 中国极品少妇videossexhd| 亚洲图片激情小说| 亚洲成人av网址| 亚洲国产精品嫩草影院久久| 黄色片网站在线| 国产精品高潮呻吟久久av黑人| 一区三区自拍| 特级毛片在线免费观看| 日韩专区中文字幕一区二区| 国产十八熟妇av成人一区| 亚洲精品成人悠悠色影视| 亚洲一级在线播放| 亚洲视频综合网| 日本黄色免费在线| 国产精品一区二区三区四区五区 | 性感美女一级片| 欧美大片第1页| 成人动漫视频在线观看| 日韩欧美在线电影| aa国产精品| 中国xxxx性xxxx产国| 亚洲免费在线播放| 国产乱人乱偷精品视频| 精品国偷自产在线| 婷婷精品久久久久久久久久不卡| 色一情一乱一伦一区二区三区丨| 国产农村妇女精品一二区| 香蕉视频污视频| 五月婷婷激情综合| 韩国av永久免费| 久久久久久久久中文字幕| ccyy激情综合| 国产精品又粗又长| 成+人+亚洲+综合天堂| 日本a在线观看| 日韩精品丝袜在线| 色在线中文字幕| 欧美精品一区在线| 日本在线不卡视频| 国产精品一区二区亚洲| 欧美精品自拍偷拍动漫精品| 日本黄色片在线观看| 91久久久久久国产精品| 综合激情视频| 久草免费资源站| 亚洲成人动漫在线观看| 天堂在线中文字幕| 国产98色在线| 天天操综合网| 亚洲熟妇一区二区| 精品久久久久久亚洲国产300| 五月激情婷婷综合| 国产成人精品网站| 久久久久美女| 动漫美女无遮挡免费| 欧美视频在线视频| jizz日韩| 99久久自偷自偷国产精品不卡| 亚洲视频久久| 日韩中文字幕电影| 欧美日韩精品福利| 日本色护士高潮视频在线观看| 国精产品一区二区| 日韩av午夜在线观看| 国产精品白丝喷水在线观看| 精品国产乱码91久久久久久网站| 国产伦子伦对白在线播放观看| 日本一区二区三区视频在线观看 | 谁有免费的黄色网址| 欧美日韩一区三区| 性直播体位视频在线观看| 久久久久久久久久久久久久久久av | 91av在线精品| 日韩免费看片| 69亚洲乱人伦| 欧美色区777第一页| 欧美男男video| 日韩在线电影一区| 黄色精品一二区| 亚洲永久精品在线观看| 久久午夜a级毛片| 特黄特色欧美大片| 国产性生活一级片| 欧美午夜影院在线视频| 中文字幕免费高清电视剧网站在线观看| 精品国产乱码久久久久软件 | 91se在线| 国产一区视频观看| 国产一区不卡在线|