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

PostgreSQL 的空閑數(shù)據(jù)塊管理機(jī)制解析

開發(fā) 開發(fā)工具 數(shù)據(jù)庫運(yùn)維 PostgreSQL
本文將繼續(xù)對(duì)vacuum命令做介紹,并以此引出PostgreSQL空閑數(shù)據(jù)塊的產(chǎn)生,然后對(duì)空閑數(shù)據(jù)塊管理機(jī)制的原理做解析。

[[200392]]

導(dǎo)語

在上一篇文章《PostgreSQL的MVCC機(jī)制解析》結(jié)尾處講到PostgreSQL是通過vacuum命令來處理過期數(shù)據(jù),本文將繼續(xù)對(duì)vacuum命令做介紹,并以此引出PostgreSQL空閑數(shù)據(jù)塊的產(chǎn)生,然后對(duì)空閑數(shù)據(jù)塊管理機(jī)制的原理做解析。

數(shù)據(jù)塊空閑空間的產(chǎn)生

根據(jù)PostgreSQL的MVCC機(jī)制,所有UPDATE和DELETE操作都會(huì)產(chǎn)生過期數(shù)據(jù),需要通過vacuum命令來清理過期數(shù)據(jù)。vacuum命令基本上有兩種:

  • VACUUM

將過期tuple對(duì)應(yīng)的磁盤空間標(biāo)記為可用,但不會(huì)真正釋放空間給操作系統(tǒng),其他程序無法再利用。該操作執(zhí)行時(shí)不會(huì)要求排它鎖(EXCLUSIVE LOCK),不影響表讀寫操作。

  • VACUUM FULL

將正常的tuple數(shù)據(jù)拷貝到新磁盤文件中,重新組織,將原數(shù)據(jù)文件刪除,未使用的磁盤空間退還給操作系統(tǒng),該操作執(zhí)行時(shí)需要獲取排它鎖,會(huì)影響正常的讀寫操作。因此執(zhí)行該操作時(shí)需要慎重,特別是表數(shù)據(jù)量較大時(shí),執(zhí)行時(shí)間會(huì)比較長(zhǎng)。

我們知道PostgreSQL的表(Relation)實(shí)際上是由多個(gè)物理數(shù)據(jù)塊(頁)組成,當(dāng)執(zhí)行vacuum操作后,這些數(shù)據(jù)塊中的保存有過期記錄(tuple)的磁盤空間就會(huì)被標(biāo)記為可用,就會(huì)產(chǎn)生空閑空間。

當(dāng)新增記錄(tuple)時(shí),會(huì)優(yōu)先重新利用表中數(shù)據(jù)塊的空閑空間,而不是分配一個(gè)新的數(shù)據(jù)塊。然而當(dāng)多個(gè)數(shù)據(jù)塊都有空閑空間時(shí),該選取哪個(gè)數(shù)據(jù)塊來保存新記錄呢?被選取的記錄必須要能夠有足夠的空間存放新記錄。

空閑數(shù)據(jù)塊的組織結(jié)構(gòu)

為解決以上問題,PostgreSQL設(shè)計(jì)了FSM(Free Space Map)結(jié)構(gòu)來表示各個(gè)數(shù)據(jù)塊中空閑磁盤空間的大小。在pg8.4版本之后,每個(gè)表(Relation)都會(huì)獨(dú)立的FSM空間,具體表現(xiàn)為以_fsm為后綴的物理文件:

  1. -bash-4.2$ cd $PGDATA/ins2/base 
  2. -bash-4.2$ ll *fsm 
  3. -rw------- 1 postgres postgres 24576 Jun 26 15:40 1247_fsm 
  4. -rw------- 1 postgres postgres 24576 Jun 26 15:40 1249_fsm 
  5. -rw------- 1 postgres postgres 24576 Jun 26 15:40 1255_fsm 

FSM文件的存儲(chǔ)結(jié)構(gòu)如下所示:

為了快速搜索到合適數(shù)據(jù)塊,減少因搜索帶來的IO開銷(即節(jié)省FSM文件大小),F(xiàn)SM結(jié)構(gòu)只使用一個(gè)字節(jié)來記錄一個(gè)數(shù)據(jù)塊中的空閑磁盤空閑大小,因1byte=8bits,那么就可以記錄2^8種空閑磁盤大小,假設(shè)一個(gè)數(shù)據(jù)塊大小(BLCKSZ)為8k(PostgreSQL默認(rèn)為8k),那么就可以劃分成256(2^8)等份,每份有BLCKSZ/256字節(jié)來表示范圍,示例如下:

  1. Range      Category 
  2.   0 - 31        0 
  3.  32 - 63        1 
  4. ...    ...     ... 
  5. 8096 - 8127    253 
  6. 8128 - 8163    254 
  7. 8164 - 8192    255 

FSM數(shù)據(jù)塊內(nèi)的數(shù)據(jù)結(jié)構(gòu)

知道了數(shù)據(jù)塊中空閑空間大小的表示方法,那如何來組織這些表示記錄,保持高效查詢效率呢?答案是PostgreSQL使用了一種二叉樹結(jié)構(gòu)(大根堆)來存儲(chǔ)這些表示空閑空間大小的記錄,葉子節(jié)點(diǎn)存儲(chǔ)實(shí)際的空間大小記錄,非葉子節(jié)點(diǎn)只是作為輔助查詢。當(dāng)需要查詢是否有合適的數(shù)據(jù)塊大小時(shí),只需要先比較樹的根節(jié)點(diǎn)即可知道,大大減少了查詢次數(shù)。大根堆數(shù)據(jù)結(jié)構(gòu)示例如下:

  1.  4 
  2.  4     2 
  3. 3 4   0 2    <- This level represents heap pages 

上述例子中葉子節(jié)點(diǎn)的值3,4,0,2分別代表了空閑數(shù)據(jù)塊的map值,值3代表的就是空閑磁盤空間大小在[96,127]的數(shù)據(jù)塊。PostgreSQL源碼中FSM頁數(shù)據(jù)結(jié)構(gòu)定義如下:

  1. typedef struct 
  2.     int            fp_next_slot;  
  3.     uint8        fp_nodes[FLEXIBLE_ARRAY_MEMBER]; 
  4. } FSMPageData; 

其中,fp_next_slot指向的是下一次查詢開始的slot位置,具體作用稍后闡述,fp_nodes數(shù)組存儲(chǔ)二叉樹的節(jié)點(diǎn)值。FSM數(shù)據(jù)塊內(nèi)的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)類似如下圖所示:

按照這種存儲(chǔ)結(jié)構(gòu),一個(gè)FSM數(shù)據(jù)塊(存儲(chǔ)FSM記錄的數(shù)據(jù)塊,和普通數(shù)據(jù)塊大小是一致的)可以存儲(chǔ)的實(shí)際記錄數(shù)(數(shù)據(jù)塊的空閑空間大小對(duì)應(yīng)的map value)為:

  1. (BLCKSZ - headers) / 2        //除以2是因?yàn)槎鏄涞娜~子節(jié)點(diǎn)數(shù)約為總節(jié)點(diǎn)數(shù)的1/2 

其中,BLCKSZ表示數(shù)據(jù)塊大小,headers表示數(shù)據(jù)塊固定大小的頭部信息。如果按照數(shù)據(jù)塊默認(rèn)大小8k,那么單個(gè)FSM數(shù)據(jù)塊可存儲(chǔ)的記錄數(shù)大約為4000個(gè),另外,PostgreSQL中一個(gè)表(Relation)最多可以有2^32個(gè)數(shù)據(jù)塊,那么最多就需要2^32條map記錄來表示這些數(shù)據(jù)塊中擁有的空閑空間大小,顯然,單個(gè)FSM數(shù)據(jù)塊是無法存儲(chǔ)下這些記錄,實(shí)際需要約2^32/4000個(gè)FSM數(shù)據(jù)塊來存儲(chǔ)。

前面我們介紹了單個(gè)FSM數(shù)據(jù)塊內(nèi)的存儲(chǔ)map值的數(shù)據(jù)結(jié)構(gòu),當(dāng)有多個(gè)FSM數(shù)據(jù)塊時(shí),但是我們又該按照什么順序去選擇FSM數(shù)據(jù)塊頁來搜索呢?順序查找FSM數(shù)據(jù)塊顯然效率太低。

FSM數(shù)據(jù)塊間的邏輯組織結(jié)構(gòu)

為了提升查找FSM數(shù)據(jù)塊的效率,PostgreSQL采用Higher-level(類似多叉樹)的邏輯結(jié)構(gòu)來組織FSM數(shù)據(jù)。為每個(gè)FSM數(shù)據(jù)塊指定一個(gè)額外的邏輯結(jié)構(gòu)FSMAddress,數(shù)據(jù)結(jié)構(gòu)定義如下:

  1. #define FSM_TREE_DEPTH    ((SlotsPerFSMPage >= 1626) ? 3 : 4) 
  2. #define FSM_ROOT_LEVEL    (FSM_TREE_DEPTH - 1) 
  3. #define FSM_BOTTOM_LEVEL 0 
  4.  
  5. typedef struct 
  6.     int            level;            /* level */ 
  7.     int            logpageno;        /* page number within the level */ 
  8. } FSMAddress; 

其中,level表示該FSM數(shù)據(jù)塊所處的層號(hào),logpageno表示在該層中的序號(hào),序號(hào)從0開始。類似于FSM單個(gè)數(shù)據(jù)塊內(nèi)的存儲(chǔ)方式,只有在***層(level=0)的FSM數(shù)據(jù)塊才實(shí)際存儲(chǔ)記錄,其它層作為查詢的輔助層,上層的葉子節(jié)點(diǎn)值代表了下層的根節(jié)點(diǎn)值。

那需要多少層邏輯結(jié)構(gòu)才能表示所有的數(shù)據(jù)塊記錄呢,答案是當(dāng)一個(gè)FSM數(shù)據(jù)塊內(nèi)存儲(chǔ)超過1626條記錄(map value)時(shí),采用三層即可,因?yàn)?62616261626>=2^32。

下面用一個(gè)示意圖來表示整體的組織結(jié)構(gòu),為了讓示意圖簡(jiǎn)化,只在圖中每個(gè)數(shù)據(jù)塊存放4個(gè)字節(jié)的數(shù)據(jù),這和存放1626個(gè)字節(jié)原理是一致的。FSM文件各數(shù)據(jù)塊間邏輯組織結(jié)構(gòu)示意圖如下:

如圖所示,第2層數(shù)據(jù)塊中葉子節(jié)點(diǎn)值123就代表了它下一層(第1層)第0號(hào)數(shù)據(jù)塊的根節(jié)點(diǎn)值,而第1層第0號(hào)數(shù)據(jù)塊的葉子節(jié)點(diǎn)值123則代表的是第0層第1號(hào)數(shù)據(jù)塊的根節(jié)點(diǎn),第0層第1號(hào)數(shù)據(jù)塊的葉子節(jié)點(diǎn)值123代表的是空閑空間大小為[3936,3967]字節(jié)的數(shù)據(jù)塊。每個(gè)數(shù)據(jù)塊都有邏輯地址,如第1號(hào)數(shù)據(jù)塊的邏輯地址{1,0}表示第1層的第0號(hào)FSM數(shù)據(jù)塊,實(shí)際上是對(duì)應(yīng)的FSM物理文件的第1號(hào)數(shù)據(jù)塊。第2層和第1層的FSM數(shù)據(jù)塊內(nèi)存儲(chǔ)的數(shù)據(jù)都只是作為輔助層索引,實(shí)際上只有第0層FSM數(shù)據(jù)塊內(nèi)的葉子節(jié)點(diǎn)才存儲(chǔ)著表中空閑數(shù)據(jù)塊的map值,其他節(jié)點(diǎn)均是索引值。

空閑數(shù)據(jù)塊的搜索算法

上面介紹了空閑數(shù)據(jù)塊的表示方法和FSM文件中各數(shù)據(jù)塊的組織形式,接下來將介紹空閑空間數(shù)據(jù)塊的搜索算法。

首先,先介紹FSM數(shù)據(jù)塊內(nèi)的查找算法。對(duì)于大根堆二叉樹查找,簡(jiǎn)單的方法就是每次從root節(jié)點(diǎn)開始比較查找,如果root節(jié)點(diǎn)小于待查找值,則表示該塊內(nèi)沒有滿足條件的map value,否則可以繼續(xù)向下找到一個(gè)滿足條件的葉子節(jié)點(diǎn)。但是PostgreSQL的設(shè)計(jì)并不是這樣的,而是通過之前介紹的FSMPageData結(jié)構(gòu)體的fp_next_slot來保存下一次查詢的起點(diǎn)位置(slot),搜索算法如下:

比較根節(jié)點(diǎn)值,如果待查詢值大于根節(jié)點(diǎn),則直接返回,表示該FSM數(shù)據(jù)塊內(nèi)沒有滿足條件的map值,否則進(jìn)行下一步。

比較查詢的起點(diǎn)位置(slot)對(duì)應(yīng)的map值,如果不滿足條件,則進(jìn)行下一步,否則跳到第5步。

設(shè)置新查詢位置為下一個(gè)slot(slot序號(hào)+1,slot值代表了在葉子節(jié)點(diǎn)的順序號(hào))的父節(jié)點(diǎn),再比較,如果不滿足條件則重復(fù)該步驟,直到向上查找到根節(jié)點(diǎn)。如果找到滿足條件的中間節(jié)點(diǎn),則進(jìn)行下一步。

向下查找,找到滿足條件的葉子節(jié)點(diǎn),然后進(jìn)行下一步。

重新設(shè)置下一次查詢的fp_next_slot變量,然后返回該葉子節(jié)點(diǎn)的slot。

FSM數(shù)據(jù)塊內(nèi)搜索算法的核心源碼如下:

  1. FSM數(shù)據(jù)塊內(nèi)搜索算法的核心源碼如下: 
  2.  
  3. int 
  4. fsm_search_avail(Buffer buf, uint8 minvalue, bool advancenext, 
  5.                  bool exclusive_lock_held) 
  6.     ...... 
  7. restart: 
  8.     if (fsmpage->fp_nodes[0] < minvalue) //每次查詢先檢查根節(jié)點(diǎn)是否滿足條件 
  9.         return -1; 
  10.     target = fsmpage->fp_next_slot; 
  11.     if (target < 0 || target >= LeafNodesPerPage) 
  12.         target = 0; 
  13.     target += NonLeafNodesPerPage; 
  14.     nodeno = target;                     //開始查詢時(shí)的slot位置 
  15.     while (nodeno > 0) 
  16.     { 
  17.         if (fsmpage->fp_nodes[nodeno] >= minvalue) 
  18.             break; 
  19.         nodeno = parentof(rightneighbor(nodeno));  //返回下一個(gè)slot的父節(jié)點(diǎn)位置 
  20.     } 
  21.     while (nodeno < NonLeafNodesPerPage)      //向下查找到葉子節(jié)點(diǎn) 
  22.     { 
  23.         int    childnodeno = leftchild(nodeno);  //先查看左子節(jié)點(diǎn) 
  24.         if (childnodeno < NodesPerPage && 
  25.             fsmpage->fp_nodes[childnodeno] >= minvalue) 
  26.         { 
  27.             nodeno = childnodeno; 
  28.             continue
  29.         } 
  30.         childnodeno++;                //左子節(jié)點(diǎn)不滿足條件查找右子節(jié)點(diǎn) 
  31.         if (childnodeno < NodesPerPage && 
  32.             fsmpage->fp_nodes[childnodeno] >= minvalue) 
  33.         { 
  34.             nodeno = childnodeno; 
  35.         } 
  36.         else 
  37.         { 
  38.             //都沒找到,說明當(dāng)前可能存在"torn page"的情況( IO寫磁盤數(shù)據(jù)時(shí)出現(xiàn)crash,只有部分?jǐn)?shù)據(jù)寫入) 
  39.             //重新更新頁數(shù)據(jù)后再查詢 
  40.             ....... 
  41.             fsm_rebuild_page(page); 
  42.             ...... 
  43.             goto restart; 
  44.  
  45.         } 
  46.     } 
  47.     slot = nodeno - NonLeafNodesPerPage;                   //找到slot序號(hào) 
  48.     fsmpage->fp_next_slot = slot + (advancenext ? 1 : 0);  //保存下一次查詢開始的slot位置 
  49.     return slot; 

至此,就找到了該FSM數(shù)據(jù)塊中滿足條件的葉子節(jié)點(diǎn),如果該頁不是處在第0層,則該葉子節(jié)點(diǎn)并不是我們最終查詢目標(biāo),根據(jù)前述FSM數(shù)據(jù)塊間的組織結(jié)構(gòu)可知,輔助層中葉子節(jié)點(diǎn)對(duì)應(yīng)的是下一層FSM數(shù)據(jù)塊的根節(jié)點(diǎn),因此,需要繼續(xù)向下查找到第0層的對(duì)應(yīng)葉子節(jié)點(diǎn)。查找葉子節(jié)點(diǎn)對(duì)應(yīng)下一層的數(shù)據(jù)塊則是通過返回的slot值來計(jì)算的,核心查找算法源碼如下:

  1. for (;;){ 
  2.     ...... 
  3.     slot = fsm_search_avail(buf, min_cat, (addr.level == FSM_BOTTOM_LEVEL),    false); 
  4.     ...... 
  5.     if (slot != -1)   //找到滿足條件的葉子節(jié)點(diǎn),否則退出循環(huán) 
  6.     { 
  7.         if (addr.level == FSM_BOTTOM_LEVEL)    //查找到第0層,返回結(jié)果 
  8.             return fsm_get_heap_blk(addr, slot);  
  9.         addr = fsm_get_child(addr, slot);     //非第0層,繼續(xù)查找子樹 
  10.     } 
  11.     ...... 
  12.  
  13. static FSMAddress 
  14. fsm_get_child(FSMAddress parent, uint16 slot) 
  15.     FSMAddress    child; 
  16.     Assert(parent.level > FSM_BOTTOM_LEVEL); 
  17.     child.level = parent.level - 1; 
  18.     child.logpageno = parent.logpageno * SlotsPerFSMPage + slot; //根據(jù)上一層的slot查找下層對(duì)應(yīng)數(shù)據(jù)頁的logpageno 
  19.     return child; 

整個(gè)搜索算法就介紹完畢,至于為什么要把fp_next_slot來作為起始查詢位置而不是root節(jié)點(diǎn)呢?原因有幾點(diǎn):

  • 當(dāng)有多個(gè)后端連接同時(shí)新增tuple時(shí),可以盡量避免對(duì)同一數(shù)據(jù)塊的寫沖突,提高寫并行度。如果每次都從root節(jié)點(diǎn)開始查找,有可能多個(gè)查詢都同時(shí)查找到同一個(gè)數(shù)據(jù)塊。
  • 獲取的是上一次返回查詢結(jié)果的臨近數(shù)據(jù)塊,更有利于提升磁盤IO效率。

更新空閑數(shù)據(jù)塊空間大小

查找到表中合適的空閑數(shù)據(jù)塊后,新記錄會(huì)寫入該數(shù)據(jù)塊,然后需要更新該數(shù)據(jù)塊的空閑空間大小。相較于搜索,更新相對(duì)簡(jiǎn)單,核心思想就是先重新計(jì)算該空閑數(shù)據(jù)塊的map值,然后更新在FSM數(shù)據(jù)塊中對(duì)應(yīng)葉子節(jié)點(diǎn)的值,再以“冒泡”的方式向上不斷更新,直到更新到父節(jié)點(diǎn)值不變化或者root節(jié)點(diǎn)。核心源碼如下:

  1. fsmpage->fp_nodes[nodeno] = value;                 //更新當(dāng)前節(jié)點(diǎn) 
  2. do 
  3.     ...... 
  4.     nodeno = parentof(nodeno); 
  5.     lchild = leftchild(nodeno); 
  6.     rchild = lchild + 1; 
  7.     newvalue = fsmpage->fp_nodes[lchild]; 
  8.     if (rchild < NodesPerPage)                       //右子節(jié)點(diǎn)存在,則選取***值作為父節(jié)點(diǎn)的新值 
  9.         newvalue = Max(newvalue,  fsmpage->fp_nodes[rchild]); 
  10.     oldvalue = fsmpage->fp_nodes[nodeno]; 
  11.     if (oldvalue == newvalue)                        //檢查更新后父節(jié)點(diǎn)是否有變化 
  12.         break; 
  13.     fsmpage->fp_nodes[nodeno] = newvalue;            //有變化,更新父節(jié)點(diǎn),繼續(xù)向上更新 
  14. } while (nodeno > 0);                                //更新到root節(jié)點(diǎn)退出 

搜索空閑數(shù)據(jù)塊時(shí)只會(huì)對(duì)當(dāng)前搜索的FSM數(shù)據(jù)塊加共享鎖(shared buffer locks),更新FSM數(shù)據(jù)塊時(shí)才會(huì)加排它鎖(exclusive buffer lock)。這里值得注意的一點(diǎn)是在搜索時(shí),使用了fp_next_slot變量來表示下一次搜索的起點(diǎn)位置,并沒有為之加一個(gè)排它鎖,因?yàn)榫S持一個(gè)排它鎖的代價(jià)遠(yuǎn)比fp_next_slot變量出現(xiàn)異常后的代價(jià)大很多。

原文鏈接:https://www.qcloud.com/community/article/941271

【本文是51CTO專欄作者“騰訊云技術(shù)社區(qū)”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過51CTO聯(lián)系原作者獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2010-04-08 15:43:28

Oracle緩沖塊

2016-10-09 14:41:40

Swift開發(fā)ARC

2010-09-27 13:26:31

JVM內(nèi)存管理機(jī)制

2017-08-17 15:13:52

PostgreSQL MVCC機(jī)制

2010-12-10 15:40:58

JVM內(nèi)存管理

2016-09-06 22:05:41

HttpCookieWeb

2009-07-08 15:10:00

Servlet會(huì)話管理

2010-07-23 09:34:48

Python

2013-09-29 15:11:46

Linux運(yùn)維內(nèi)存管理

2010-09-26 13:23:13

JVM內(nèi)存管理機(jī)制

2022-06-01 16:01:58

MySQL內(nèi)存管理系統(tǒng)

2009-09-25 12:59:53

Hibernate事務(wù)

2021-12-15 06:58:27

Go多版本管理

2009-11-17 17:11:32

Oracle空閑數(shù)據(jù)塊

2011-06-29 17:20:20

Qt 內(nèi)存 QOBJECT

2020-11-08 14:32:01

JavaScript變量內(nèi)存管理

2009-09-23 17:48:00

Hibernate事務(wù)

2022-02-28 10:25:17

Python參數(shù)傳遞拷貝

2011-11-10 14:46:54

Windows8電源管理

2019-01-23 17:08:52

Python內(nèi)存管理RealPython
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲做受高潮无遮挡| avav在线播放| 91国内精品视频| 国产高清一区| 日韩免费福利电影在线观看| 久久久久久久久久久综合| 日韩在线免费播放| 九色综合国产一区二区三区| 久久久久久综合网天天| 一级黄色片大全| 国产电影一区二区| 欧美午夜精品久久久久久久| 在线观看成人av电影| 日本wwwxxxx| 久久精品国产免费看久久精品| 欧美成人在线网站| 少妇人妻好深好紧精品无码| 日本精品在线观看| 欧美亚洲一区三区| 成人黄色av片| 老司机在线看片网av| 91亚洲国产成人精品一区二三| 国产精品美女主播在线观看纯欲| 国产suv精品一区二区68| 色哟哟精品丝袜一区二区| 欧美高清激情brazzers| 久久久久久久久久福利| 国产激情在线视频| 亚洲国产精品成人久久综合一区| 国产精品久久久久免费 | 欧洲国产伦久久久久久久| 国产一级不卡视频| 久草资源在线| 国产精品美女久久久久久| 欧美国产二区| 日韩中文字幕观看| 国产高清无密码一区二区三区| 国产精品h在线观看| 日韩伦人妻无码| 欧美欧美全黄| 久久天天躁日日躁| 午夜激情福利电影| 精品国产91乱码一区二区三区四区 | 国产视频1区2区| 激情综合久久| 欧美极品第一页| 麻豆国产尤物av尤物在线观看| 国产精品99久久久久久动医院| 伊人久久综合97精品| 亚洲精品一区二区三区影院忠贞| 性欧美lx╳lx╳| 亚洲国产成人精品久久久国产成人一区 | 免费精品在线视频| 波多野结衣在线观看一区二区三区| 日韩精品欧美激情| 人妻精品久久久久中文字幕| 麻豆精品99| 日韩av最新在线观看| 日韩www视频| 黑色丝袜福利片av久久| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 欧产日产国产精品98| 综合久久成人| 精品国产一区二区亚洲人成毛片| 人妻 丝袜美腿 中文字幕| 一区中文字幕| 亚洲黄色www| 中文字幕在线免费看线人| 亚洲尤物av| 一本色道久久88综合亚洲精品ⅰ| 免费网站在线高清观看| 日韩综合网站| 久久国产天堂福利天堂| 久久免费小视频| 一区二区毛片| 国产精品精品视频| 国产日本精品视频| 成人免费视频视频在线观看免费 | 亚洲一区日韩精品| 欧美午夜网站| 精品视频—区二区三区免费| 国内精品卡一卡二卡三| 国产精品传媒精东影业在线| 欧美成人中文字幕| 黄色片免费观看视频| 日韩精品每日更新| 亚洲一区中文字幕| 四虎在线免费看| 91蜜桃在线观看| 四虎永久在线精品免费一区二区| 国产激情在线视频| 日韩欧美aⅴ综合网站发布| 色婷婷成人在线| 亚洲不卡视频| 亚洲图片欧美午夜| 草视频在线观看| 麻豆精品91| 国产欧美日韩中文字幕| 免费国产黄色片| 国产精品久久久99| 国产真人做爰毛片视频直播| 少妇精品视频一区二区免费看| 3atv在线一区二区三区| aaaaa级少妇高潮大片免费看| 999国产精品永久免费视频app| 欧美极品少妇全裸体| 中文字幕日产av| 成人小视频在线| 亚洲一区二区三区精品在线观看| 999福利在线视频| 欧美欧美午夜aⅴ在线观看| 加勒比精品视频| 天天综合久久| 国产成人精品免费视频| 男人天堂一区二区| 亚洲欧美区自拍先锋| 玩弄japan白嫩少妇hd| 91亚洲无吗| 久久精品男人天堂| 69视频免费看| 99久久综合国产精品| 精品一区二区三区毛片| 影音成人av| 日韩精品中文字幕久久臀| 久久成人在线观看| 黑人巨大精品欧美黑白配亚洲| 欧美高清视频一区| 老司机深夜福利在线观看| 日韩欧美国产三级电影视频| 久久精品三级视频| 日韩一区欧美二区| 动漫精品视频| 在线观看男女av免费网址| 欧美日韩成人一区二区| 亚洲女优在线观看| 久久蜜桃精品| 欧美视频小说| 天堂资源在线| 亚洲精品色婷婷福利天堂| 免费一级特黄特色大片| 国产91精品欧美| 欧美日产一区二区三区在线观看| 神马午夜伦理不卡| 日韩欧美另类在线| 印度午夜性春猛xxx交| 男人的j进女人的j一区| 日本不卡在线播放| 韩国精品主播一区二区在线观看| 亚洲欧美日韩精品| 日韩国产成人在线| 国产精品久久久久影视| mm131国产精品| 999成人网| 91久久伊人青青碰碰婷婷| a毛片在线看免费观看| 日韩欧美视频一区| 日本一区二区欧美| 91视频在线观看免费| 1024av视频| 国产成人精品三级高清久久91| 国产精品久久久久久久久久久不卡 | 国产精品一区二区在线观看网站| 日本高清xxxx| 国产精品天天看天天狠| 97avcom| 蜜桃免费在线| 欧美性受xxxx黑人xyx| 日韩在线视频免费看| 国产一区二区三区日韩| 欧美图片激情小说| 亚洲影院天堂中文av色| 国产女人精品视频| 日本资源在线| 日韩精品免费在线播放| 亚洲一区二区色| 亚洲一区二区三区中文字幕| 五十路六十路七十路熟婆| 日韩综合小视频| 妞干网这里只有精品| 狼人精品一区二区三区在线| 国产91久久婷婷一区二区| 欧美天天影院| 亚洲第一视频在线观看| 波多野结衣高清在线| 亚洲人成影院在线观看| 国产精品300页| 毛片av一区二区| www.亚洲成人网| 国产一区二区三区91| 成人动漫网站在线观看| 国产免费拔擦拔擦8x在线播放 | 在线播放中文字幕一区| 国产乱码久久久久久| 国产女同互慰高潮91漫画| 国产老头和老头xxxx×| 久久综合狠狠| 国产成人亚洲综合无码| 精品一区二区三| 成人欧美一区二区三区视频| av在线一区不卡| 欧美激情精品久久久久久黑人| 成人性生交大片免费看午夜| 精品国产乱码久久久久久1区2区 | 青青操在线视频观看| av在线播放成人| 天堂av手机在线| 久久精品日产第一区二区 | 视频在线观看入口黄最新永久免费国产 | 久久国产精品亚洲人一区二区三区 | 久久国产乱子伦免费精品| 女同性一区二区三区人了人一| 欧美日韩一区二区三区免费| 亚洲综合网狠久久| 91精品视频在线免费观看| 欧美舌奴丨vk视频| 97精品一区二区视频在线观看| 老司机在线永久免费观看| 亚洲欧美制服丝袜| 深夜福利视频一区| 欧美成人精品1314www| 亚洲网站在线免费观看| 日韩欧美国产高清91| 国产真实乱偷精品视频| 亚洲欧美日韩中文字幕一区二区三区| 人人人妻人人澡人人爽欧美一区| 国产成人精品亚洲午夜麻豆| 天堂视频免费看| 日韩黄色在线观看| 日韩精品―中文字幕| 国产精品s色| 潘金莲一级淫片aaaaaa播放1| 欧美亚洲精品在线| 欧洲亚洲一区二区| 亚洲激情播播| 久久亚洲高清| 香蕉久久99| 老牛影视免费一区二区| 好吊妞国产欧美日韩免费观看网站 | 欧美大片在线播放| 亚洲精品女人| 国产精品12345| 亚洲激情偷拍| 婷婷无套内射影院| 在线国产日韩| 精品少妇一区二区三区在线| 日韩一级欧洲| 日韩avxxx| 久久xxxx精品视频| 国产成人精品无码播放| 日韩精品乱码av一区二区| 毛葺葺老太做受视频| 视频一区二区三区中文字幕| 国产激情在线观看视频| 美女视频免费一区| 天堂av8在线| 国产一区二区三区在线观看免费 | 不卡视频在线看| 中文字幕乱码在线| 91麻豆国产精品久久| 91网站免费入口| 久久久欧美精品sm网站| 亚洲图片另类小说| 国产精品女同一区二区三区| 国产中文av在线| 亚洲精品福利视频网站| 久久精品视频8| 欧美日韩国产在线看| 亚洲图片欧美日韩| 欧美人牲a欧美精品| www五月婷婷| 日韩精品视频在线免费观看 | 久久久www成人免费精品张筱雨| 爆操欧美美女| 91精品国产91久久久久久最新 | 欧美日韩亚洲一区二区三区在线| r级无码视频在线观看| 国产美女诱惑一区二区| 91插插插插插插插插| 国产盗摄精品一区二区三区在线 | 欧美日韩另类图片| 欧美久久久久久| 亚洲91视频| www国产精品内射老熟女| 日韩电影在线一区| 三上悠亚 电影| 久久五月婷婷丁香社区| 小早川怜子一区二区的演员表| 亚洲一区二区av在线| 日本黄色中文字幕| 日韩精品在线一区二区| 黄色片在线看| 美女少妇精品视频| 人人视频精品| 成人免费看片网站| 日韩1区在线| 日本欧美黄色片| 久久av中文字幕片| 国产精品jizz| 亚洲理论在线观看| 精品久久久久久久久久久国产字幕| 666欧美在线视频| 日本福利在线观看| 欧美另类第一页| 懂色aⅴ精品一区二区三区| 国产v亚洲v天堂无码| 日韩欧美二区| 日本免费黄视频| 国产成人免费视频一区| 国产7777777| 欧美日韩国产综合新一区| 国产a级免费视频| 国产亚洲视频在线观看| 岛国av在线网站| 91精品国产一区二区三区动漫| 精品一区不卡| 国产精品第12页| 粉嫩高潮美女一区二区三区 | 亚洲亚洲人成综合网络| 在线视频播放大全| 亚洲精品小视频| 国产伦子伦对白在线播放观看| 97超碰人人模人人爽人人看| 91视频综合| 日韩福利视频在线| 2020国产精品自拍| 日本三级网站在线观看| 91精品国产综合久久蜜臀| 1769视频在线播放免费观看| 欧美在线www| 欧美天堂社区| 熟女少妇在线视频播放| 成人免费视频网站在线观看| 久久久久久久久久91| 正在播放亚洲一区| 麻豆影视国产在线观看| 国产精品永久免费观看| 日韩在线观看| 色啦啦av综合| 国产精品国模大尺度视频| 成年人晚上看的视频| 亚洲欧美日韩直播| 欧美极品影院| 欧美日韩国产一二| 免费中文字幕日韩欧美| 亚洲专区区免费| 色噜噜狠狠成人中文综合| 欧洲亚洲在线| 日韩免费不卡av| 欧美久久综合网| 免费一区二区三区在线观看| 国产精品欧美久久久久无广告| 亚洲网站在线免费观看| 久久精品小视频| 日韩一区免费| 91亚洲精品国产| 成人动漫一区二区在线| 亚洲精品国产精品乱码| 亚洲欧美在线看| 电影一区二区| 五月天色婷婷综合| 国产aⅴ精品一区二区三区色成熟| 久久久久久久久久99| 亚洲精品国产品国语在线| 卡通欧美亚洲| 在线免费观看成人网| 国产经典欧美精品| 日韩av黄色片| 国产一区二区三区视频在线观看| 99re久久| 青青视频免费在线| 成人的网站免费观看| 久久精品视频5| 久久久av免费| 久久97久久97精品免视看秋霞| 久久精品午夜福利| 国产精品乱码久久久久久| av高清一区二区| 91国内揄拍国内精品对白| 日韩精品免费| 精人妻一区二区三区| 色噜噜狠狠色综合欧洲selulu| 精品孕妇一区二区三区| 国产欧美一区二区视频| 日韩高清不卡在线| 黄色一级片在线| 亚洲欧美日韩网| 欧美日本三级| 日本成人中文字幕在线| 亚洲精品午夜久久久| 欧美日韩影视| 亚洲va久久久噜噜噜| 国产亚洲一区在线| www欧美com| 精品调教chinesegay| 日本精品在线播放| 午夜免费一区二区| 亚洲成av人片| 伦xxxx在线| 日韩精品久久久毛片一区二区| 国产一区二区三区四区五区美女|