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

飛哥帶你揭秘:為什么HugePage能讓Oracle數據庫如虎添翼?

數據庫 Oracle
為了提升地址轉換效率。CPU 硬件中設計有 TLB 模塊,用于緩存內存中的頁表項,加速訪問。這樣 CPU 在執行虛擬地址轉換時,就可以避免很多的內存訪問,極大地提升效率。

大家如果有人部署過 Oracle 數據庫的話,一定也看到過 Oracle 為了性能考慮,是推薦開啟大頁(HugePage)的。

那么為什么開啟大頁 能有性能提升,它的優化原理是啥,又是如何實現的呢?今天飛哥就來和你一起深入地聊聊這個 Topic。

一、 內核四級頁表之殤

為了更好了解 HugePage,我們需要溫習一下內核的頁表機制。

在這個機制中有兩個前提知識點,那就是

  • 第一、應用程序申請內存時不會分配物理內存,訪問觸發缺頁中斷時才分配!
  • 第二、頁是內核分配物理內存的最小單位!

我們應用程序使用的都是虛擬內存地址。在程序實際運行的時候,需要轉換成實際的物理地址。如果轉換后的物理地址所在的頁面正好存在,那么直接訪問就可以了。如果頁面不存在,那么需要觸發缺頁中斷并申請一個完整的頁面后再供應用程序繼續訪問。頁的最小單位是 4 KB。

在《深入理解Linux進程與內存》里的第六章「進程如何使用內存」中,我們提到過 Linux 將虛擬地址到物理地址中用到的四級頁表機制。

圖片圖片

內核四級頁表機制把 64 位的內存地址范圍分成了幾段。

  • 第 63-48 位,額。。64位內存地址太大了,這段屬于廢棄不用的。
  • 第 39-47(9)位指定在一級頁表 PGD 中索引位置
  • 第 30-38(9)位指定在二級頁表 PUD 中索引位置
  • 第 21-29(9)位指定在對應三級頁表 PMD 中索引位置
  • 第 12-20(9)位指定在四級頁表 PTE 中索引位置


大家注意下,每一級頁表管理的地址范圍都是 9 個位。為啥是 9 ,不是 8 ,也不是 10。原因是為了將數據結構對齊到 4 KB。這樣具體的一個 PGD/PUD/PMD/PTE,保存著 2 的 9 次方, 512 個 64 位物理地址(8個字節)。512 * 8 = 正好是 4 KB。

在將某進程的一個具體的 64 位的虛擬內存地址轉換為物理地址時,首先按照上述地址范圍把虛擬地址切分成幾段。然后經過下面幾步轉換成物理地址。

  • 第一步:從 CPU 中名為 CR3 的寄存器中找到當前進程的一級頁表 PGD 的地址
  • 第二步:以虛擬地址中的 39 ~ 47 位作為索引,找到 PUD 所在的內存地址
  • 第三步:再以虛擬地址中的 30 ~ 38  位作為索引,找到 PMD 所在的內存地址
  • 第四步:再以虛擬地址中的 21 ~ 29  位作為索引,找到 PTE 所在的內存地址
  • 第五步:再以虛擬內存地址的 0 ~ 11 位作為物理內存頁的偏移量,得到最終的物理地址

Linux分頁機制就帶領大家簡單回憶這么一下。今天我們的重點是想說頁表機制帶來的額外的問題。

頁表是存在內存里的。完成一個虛擬地址轉換的過程中需要把當前虛擬地址對應的四個頁表全部找出來才能完成虛擬地址到物理地址的轉換。那就是一次內存 IO 光是虛擬地址到物理地址的轉換就要去內存查 4 次頁表。再算上真正的內存訪問,最壞情況下需要 5 次內存 IO 才能獲取一個內存數據!

為了提升地址轉換效率。既然進行地址轉換需要的內存 IO 次數多,且耗時。那么干脆就和 CPU 的 L1、L2、L3 的緩存思想一樣,在 CPU 里把頁表中的數據盡可能地緩存起來不就行了么,

所以 CPU 硬件中有個 TLB(Translation Lookaside Buffer) 模塊,專門用于加速虛擬地址到物理地址轉換速度的緩存。其訪問速度非常快,和寄存器相當,比 L1 訪問還快。

雖然有了 TLB 加速的方案,但這個方案并不是萬能的。最大的缺點是 TLB 太小了。一般的 CPU 中 L1 TLB 一般也就幾十個條目容量,L2 TLB 一般也就小幾千。

再看需求端,我們假設每個進程需要 40 GB 物理內存,那換算成 4 KB 頁面的話就是大約 1000 萬個頁面,也就對應 1000 萬個頁表條目。TLB 里這點點容量還是捉襟見肘。

正因為在四級頁表下有這樣潛在的性能隱患。所以 Oracle 這種內存密集型的應用就推薦配置 HugePage 來提高它的運行性能了。

二、HugePage 如何使用

可見,四級頁表最大的問題是在于頁面太多時性能較差。頁面一多,管理這些頁面的頁表項就多,TLB緩存命中率就會很差。那如果能把頁面數量給降下來,TLB 緩存命中率一定會有大幅度的提升。

假如說我們把 4 KB 的頁面換成 2 MB 的頁面,那么同樣對于 40 GB 物理內存消耗,那僅僅只需要 2 萬個頁面就夠了。相比于原來的 1000 萬 降低到了 500 之一。

另外這樣不光是 TLB 緩存命中率會有大幅度的提升。內核的虛擬地址轉換時的頁表機制也可以簡化成下面這樣的三級頁表,少了一次轉換開銷。

圖片

所以,一個結論是把 4 KB 的頁面換成 2 MB 的頁面,可以大幅度提升虛擬地址轉換物理地址時的性能!!

那么,如果你想獲取這個性能提升的話,該如何操作呢?

第一步首先是大頁的預留

預留的方式分為啟動階段預留和運行時預留。

對于啟動階段預留,需要修改 Linux 內核的啟動參數。編輯/boot/grub/grub.cfg 文件找到啟動參數行(不同的發行版可能修改方式會有一些出入)。添加以下內容,指定 HugePage 的頁面大小,指定預留的大頁數量。:

hugepagesz=2M hugepages=512

對于運行時預留,直接修改內核 hugetlbfs 暴露出來的偽文件即可。

// 預留特定size的大頁
echo 5 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

第二步是大頁的申請

申請的時候,先打開通過 open 打開 hugepage 偽文件句柄,再通過 mmap 來申請即可。

int main(){
 // 打開 hugepage 句柄
 fd = open("/mnt/huge/hugepage...", O_CREAT|O_RDWR);
   
    // 申請大頁
    addr = mmap(0, MAP_LENGTH, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
}

這樣,你的應用程序就能享受 TLB 緩存命中率提升帶來的飛翔感覺了。

三、內核啟動時 HugePage 處理

咱們「開發內功修煉」公眾號的風格是不僅要會用,還要懂內部原理。接下來飛哥再來帶你看下內核是如何管理 HugePage 的!

3.1 回顧普通頁的伙伴系統

在《深入理解Linux進程與內存》里的第五章「系統物理內存初始化」中介紹過,

  • 內核先是通過固件 ACPI E820 規范探測安裝的內存的物理地址范圍
  • 將探測到的內存交給 memblock 初期內存分配器來管理,同時會再讀取 ACPI 中的 SRAT 表獲取 NUMA 信息
  • 接著在初期內存分配器中申請管理所有頁面的 struct page 對象(一個 struct page 一般是 64 字節)
  • 最后釋放其余的可用內存交給伙伴系統來管理
start_kernel
-> setup_arch
---> e820__memory_setup   // 內核把物理內存檢測保存從boot_params.e820_table保存到e820_table中,并打印出來
---> e820__memblock_setup // 根據e820信息構建memblock內存分配器,開啟調試能打印
---> initmem_init         // 內存中 NUMA 機制初始化)
---> x86_init.paging.pagetable_init(native_pagetable_init)
-----> paging_init        // 頁管理機制的初始化
-> mm_init
---> mem_init
-----> memblock_free_all  // 向伙伴系統移交控制權
// file:include/linux/mmzone.h
struct zone {
 ......
 // zone的名稱
 const char  *name;

 // 管理zone下面所有頁面的伙伴系統
 struct free_area free_area[MAX_ORDER];
 ......
}

圖片圖片

3.2 空閑 HugePage 的管理

相比伙伴系統中 4KB 頁面的管理,內核對 HugePage 頁面的管理要簡單許多。內核中維持一個各種 HugePage 頁面(內核支持多種大小的 HugePage,不僅僅只有 2 MB)的 struct hstate 數組。

// file:mm/hugetlb.c
struct hstate hstates[HUGE_MAX_HSTATE];

在每一個 hstate 成員內,有一個空閑鏈表 hugepage_freelists,會把所有的空閑頁面給串起來。

圖片

我們來看大致看下空閑頁面的初始化過程。內核啟動過程中,還會按照一定的順序執行初始化函數。HugePage 的初始化函數 hugetlb_init 通過 subsys_initcall 注冊。

// file:mm/hugetlb.c
subsys_initcall(hugetlb_init);

這樣內核啟動的時候,就會執行到 hugetlb_init 進行 HugePage 的初始化。

// file:mm/hugetlb.c
static int __init hugetlb_init(void)
{
 ...
 // 初始化默認大頁 state,空閑大內存頁鏈表 hugepage_freelists
 hugetlb_add_hstate(HUGETLB_PAGE_ORDER);
 // 申請大內存頁, 并且保存到 hugepage_freelists 鏈表中
 hugetlb_init_hstates();
 ...

 // 創建/sys/kernel/mm/hugepages相關目錄文件
 hugetlb_sysfs_init();
 // 創建/sys/device/system/node/node*/hugepages相關目錄文件
 hugetlb_register_all_nodes();
 ...
}

hugetlb_init 函數主要完成兩個工作:

第一:初始化默認大頁 state。在 Linux 中是支持多種規格的大頁的,存在一個全局變量 states 數組,其中每一個元素都對應一個規格的大頁的管理數據結構,包括所有空閑頁面管理用的鏈表 hugepage_freelists。

第二:為系統申請空閑的大內存頁,并且保存到空閑鏈表 hugepage_freelists 中。

第三:創建 hugetlbfs 相關偽文件,如 /sys/kernel/mm/hugepages、/sys/device/system/node/node*/hugepages。用戶后續可以通過這些偽文件來和內核交互。

我們來重點看下申請空閑大內存頁的邏輯,這是依次調用 hugetlb_init_hstates -> hugetlb_hstate_alloc_pages,在執行到 hugetlb_hstate_alloc_pages_onenode 中完成的。

// file:mm/hugetlb.c
static void __init hugetlb_hstate_alloc_pages_onenode(struct hstate *h, int nid)
{
 ...
 for (i = 0; i < h->max_huge_pages_node[nid]; ++i) {
  page = alloc_fresh_huge_page(h, gfp_mask, nid,
     &node_states[N_MEMORY], NULL);
  if (page)
   break;
 }

 free_huge_page(page);
 return 1;
}

其中 alloc_fresh_huge_page 是在申請頁面,free_huge_page 會將其放到空閑鏈表 hugepage_freelists 中。

四、mmap 申請內存

大頁的內存申請內核工作原理大概分三步:

  • 第一先是要打開 HugePage 偽文件句柄,
  • 第二是通過 mmap 申請大頁
  • 第三是在訪問缺頁中斷時實際申請真正的物理大頁
int main(){
 // 打開 hugepage 句柄
 fd = open("/mnt/huge/hugepage...", O_CREAT|O_RDWR);
   
    // 申請大頁
    addr = mmap(0, MAP_LENGTH, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
}

4.1 打開 HugePage 偽文件句柄

調用 open 打開 hugetlbfs 下的文件時,會執行到 hugetlb_file_setup 函數,在這里會給申請文件內核對象,為它指定它所綁定的各種 operations 方法。

// file:fs/hugetlbfs/inode.c
struct file *hugetlb_file_setup(const char *name, ...)
{
 ...
 file = alloc_file_pseudo(inode, mnt, name, O_RDWR,
     &hugetlbfs_file_operations);
 ...
}

其中 hugetlbfs_file_operations 指定了這類文件的各種具體的方法。

const struct file_operations hugetlbfs_file_operations = {
 .read_iter  = hugetlbfs_read_iter,
 .mmap   = hugetlbfs_file_mmap,
 .fsync   = noop_fsync,
 .get_unmapped_area = hugetlb_get_unmapped_area,
 ......
};

這樣當對該文件執行 mmap 操作時,就會調用到內核中的 hugetlbfs_file_mmap 函數。

4.2 mmap 分配虛擬內存

mmap 系統調用執行經過如下的復雜調用鏈后,最終會調用到 file 內核對象的 map 方法。

mmap                        // offset轉成頁為單位
+-- sys_mmap_pgoff          // 通過fd獲取file
    +-- vm_mmap_pgoff       // 信號量保護,映射完成后populate
        +-- do_mmap_pgoff   // 簡單封裝
            +-- do_mmap     // 映射長度頁對齊,prot和flags檢查,設置vm_flags,獲取映射虛擬地址
                +-- mmap_region      // 地址空間檢查,vma_merge,vma分配及初始化
                    |-- call_mmap    // 文件映射,簡單封裝
                    |   +-- file->f_op->mmap    // 調用實際文件的mmap方法
                    ....

執行到的 file->f_op->mmap 是一個函數指針。在上一小節我們看到對于 hugetlbfs 下的文件,其 mmap 函數指針對應的是 hugetlbfs_file_mmap 函數。

// file:fs/hugetlbfs/inode.c
static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma)
{
 ...
 // 為映射分配所需的大頁框
 hugetlb_reserve_pages(inode,
    vma->vm_pgoff >> huge_page_order(h),
    len >> huge_page_shift(h), vma,
    vma->vm_flags)
 ...
}

在該函數中主要做的就是調用 hugetlb_reserve_pages 預留大頁。

4.3 缺頁中斷處理

當缺頁中斷發生時,內核會調用到 handle_mm_fault 函數。在這里對于 HugePage、普通缺頁、透明大頁的處理都是不一樣的。

// file:mm/memory.c
vm_fault_t handle_mm_fault(struct vm_area_struct *vma, ...)
{
 ...
 // 是否是大頁缺頁
 if (is_vm_hugetlb_page(vma))
  ret = hugetlb_fault(vma->vm_mm, vma, address, flags);
 else
  // 普通的缺頁中斷,包括透明大頁也都在這里
  ret = __handle_mm_fault(vma, address, flags);
 ...
}

HugePage 缺頁會執行到 hugetlb_fault 函數,然后再調用 hugetlb_no_page。

static vm_fault_t hugetlb_no_page(struct mm_struct *mm, ...)
{
 page = find_lock_page(mapping, idx);
 if (!page) {
  ...
  // 1. 從空閑大內存頁鏈表 hugepage_freelists 中申請一個大內存頁
  page = alloc_huge_page(vma, haddr, 0);
 }

 // 2. 通過大內存頁的物理地址生成頁表表項
 new_pte = make_huge_pte(vma, page, ((vma->vm_flags & VM_WRITE)
    && (vma->vm_flags & VM_SHARED)));
 // 3. 將頁表表項掛到頁表中
 set_huge_pte_at(mm, haddr, ptep, new_pte);
 ...
 return ret;
}

在 hugetlb_no_page 中主要做了兩件事:

  • 第一件:調用 alloc_huge_page 從空閑鏈表中 hugepage_freelists 摘一個頁面下來 
  • 第二件:設置頁表。先是通過大內存頁的物理地址生成頁表表項,再將頁表表項掛到頁表中

這樣,應用程序就申請到了大頁物理內存了。

五、總結

我們應用程序使用的都是虛擬內存地址。在程序實際運行的時候,需要轉換成實際的物理地址。

為了提升地址轉換效率。CPU 硬件中設計有 TLB 模塊,用于緩存內存中的頁表項,加速訪問。這樣 CPU 在執行虛擬地址轉換時,就可以避免很多的內存訪問,極大地提升效率。

但可惜的是 TLB 緩存容量都不大,一般 CPU 中 L1 TLB 一般也就幾十個條目容量,L2 TLB 一般也就小幾千,我手頭的一臺服務器 L2 TLB 才是 1500 個條目。

如果使用 4 KB 的小頁面。假設每個進程需要 40 GB 物理內存,每個頁面 4 KB,那就是大約 1000 萬個頁面,也就要管理 1000 萬個頁表條目。區區 1500 個 TLB 緩存條目空間,顯然是捉襟見肘。

如果使用 2 MB 的 HugePage, 40 GB / 2 MB,只需要 2 萬個頁面。管理的頁表條目一下子從 1000 萬下降到了 2萬,這樣 1500 個條目就挺充裕的了。

使用 HugePage 能幫助 TLB 緩存命中率得到了大大的提升。應用程序在執行虛擬地址到物理地址的轉換過程中就會節約許多開銷。

Oracle 數據庫是一個存儲密集型的應用,會申請大量的內存,也會涉及到大量的內存訪問。那么用 HugePage 優化一下性能的話,對于它來講再合適不過了。

要補充提的一點是,如果你的應用程序使用的內存很小,例如只有幾百 M,那建議你還是不要費這個勁兒了,提升不了多少。

責任編輯:武曉燕 來源: 開發內功修煉
相關推薦

2021-12-07 09:12:32

Iptables 原理工具

2014-02-14 09:22:36

AWSOracle云數據庫

2020-03-27 16:05:49

數據庫數據MySQL

2020-02-19 15:01:30

數據庫SQL技術

2011-03-25 09:27:40

Oracle數據庫回滾前退

2020-05-28 11:25:55

AI 數據人工智能

2023-12-13 21:56:14

云數據庫性能云架構師

2020-02-25 17:04:05

數據庫云原生分布式

2025-04-03 11:04:40

2024-01-08 08:15:57

數據庫優化內存

2021-10-22 05:52:27

數據庫調整大小容量

2020-08-10 09:07:00

數據庫IT技術

2020-11-10 08:38:43

數據庫HugePages內存

2011-05-26 10:30:12

Oracle數據庫約束

2015-08-21 12:59:38

Oracle數據庫

2010-04-23 09:23:44

Oracle 數據庫

2011-03-10 13:24:26

2011-03-16 08:54:45

Oracle數據庫索引

2011-05-19 13:25:14

Oracle數據庫

2011-03-15 14:54:08

NoSQL
點贊
收藏

51CTO技術棧公眾號

丰满女人性猛交| 91在线观看免费高清| 69精品无码成人久久久久久| 成人久久网站| 亚洲在线观看免费视频| 久久影院理伦片| 国产一区二区三区黄片| 伊人影院久久| 视频在线一区二区| 久久久久亚洲av成人网人人软件| 成人性生交大片免费网站| 一区在线中文字幕| 蜜桃av久久久亚洲精品| 国产乱色精品成人免费视频| 国产深夜精品| 久久国产精品影视| 鲁丝一区二区三区| 国产一区福利| 日韩一区二区精品| 爱情岛论坛亚洲首页入口章节| 日本资源在线| 国产精品国产三级国产普通话蜜臀| 国产精品对白刺激久久久| 亚洲天堂中文在线| 久久福利影视| 91黄色8090| 青青草成人免费| 999国产精品999久久久久久| 精品亚洲男同gayvideo网站| 日本成人在线免费| 91精品国产一区二区在线观看| 色综合色狠狠综合色| 屁屁影院ccyy国产第一页| 91女主播在线观看| 久久久久国色av免费看影院| 5g国产欧美日韩视频| 亚洲中文一区二区三区| 日韩在线卡一卡二| 日本午夜人人精品| 台湾佬中文在线| av成人毛片| 欧美极品欧美精品欧美视频| 黑鬼狂亚洲人videos| 日韩一区二区在线免费| 亚洲天堂影视av| 免费在线观看污| 国产精品密蕾丝视频下载| 精品视频在线导航| 极品人妻一区二区三区| 亚洲精品国产动漫| 亚洲天堂免费观看| 中文字幕在线看高清电影| 日韩美女国产精品| 亚洲美女中文字幕| 无码一区二区三区在线| 精品国产一区二区三区久久久樱花| 亚洲精品久久久久| 30一40一50老女人毛片| 亚洲资源网站| 国产亚洲欧美aaaa| 少妇太紧太爽又黄又硬又爽小说| 国产精品免费不| 在线视频亚洲欧美| 亚洲一二三四五六区| 91视频综合| 米奇精品一区二区三区在线观看| 中文字幕亚洲欧美日韩| 国产精品豆花视频| 国语自产偷拍精品视频偷| 97超碰人人干| 石原莉奈在线亚洲二区| 国产精品久久精品| 国产精品特级毛片一区二区三区| 国精产品一区一区三区mba视频| 成人亲热视频网站| 亚洲xxxx天美| 久久免费美女视频| 在线免费观看成人| 肉体视频在线| 色999日韩国产欧美一区二区| 韩国视频一区二区三区| 日韩精品久久久久久久软件91 | 波多野结衣激情视频| 强制捆绑调教一区二区| 91久久精品国产91久久| 黄色av一区二区三区| 久久这里只有精品6| 亚洲精品无人区| 欧美1—12sexvideos| 欧美午夜精品久久久久久久| 成人性生交免费看| 福利电影一区| 伊人久久久久久久久久久久久| 在线观看黄网址| 亚洲国产一区二区三区a毛片| 日本三级久久久| www.久久成人| 久久精品亚洲一区二区三区浴池 | 一区视频在线| 国产精品激情av电影在线观看| 国产乱淫a∨片免费视频| 26uuu国产一区二区三区| 一本久道久久综合| 国产精品论坛| 日韩欧美一二三四区| 国产又粗又猛又爽视频| 黄色成人精品网站| 国产欧美在线视频| 色中色在线视频| 亚洲天堂2014| 中文字幕欧美人妻精品一区| ccyy激情综合| 久久精品欧美视频| 黄色一级视频免费看| 国产成人精品亚洲日本在线桃色| 日本一区二区三区视频在线播放| 免费影视亚洲| 欧美日韩免费一区二区三区视频| 亚洲男女在线观看| 一区二区三区四区在线观看国产日韩| 88xx成人精品| 亚洲第一页视频| 中文字幕一区在线| 中文字幕在线导航| 西瓜成人精品人成网站| 久久久久久久久国产精品| 国产绿帽一区二区三区| 国产精品视频一二三| 国产乱子夫妻xx黑人xyx真爽| 伊人久久大香线蕉av超碰| 久久精品中文字幕电影| 在线观看毛片av| 欧美激情在线一区二区三区| 久久久久狠狠高潮亚洲精品| 天美av一区二区三区久久| 欧美精品aaa| av中文字幕免费| 亚洲婷婷综合色高清在线| 婷婷免费在线观看| 日韩欧美三级| 国产精品中文字幕在线| a黄色在线观看| 在线看日本不卡| 亚洲性猛交xxxx乱大交| 久久久久99| 免费看成人av| 亚洲天堂一区二区| 亚洲视频网站在线观看| 无码人妻丰满熟妇区bbbbxxxx | 日日夜夜精品视频免费| 欧美精品与人动性物交免费看| 18aaaa精品欧美大片h| 亚洲成人动漫在线播放| 五月婷婷亚洲综合| 久久久欧美精品sm网站| www.超碰com| 色婷婷色综合| 7777奇米亚洲综合久久 | 亚洲在线视频网站| 男女一区二区三区| 久久亚洲不卡| 亚洲综合第一| 视频欧美一区| 97久久精品人搡人人玩| 麻豆app在线观看| 欧美午夜一区二区| av激情在线观看| 成人免费看的视频| 97国产精东麻豆人妻电影| 亚洲老女人视频免费| 国产精品www色诱视频| 男人资源在线播放| 欧美大片拔萝卜| 黄色大片网站在线观看| 国产精品女主播av| 国产免费无码一区二区| 99亚洲一区二区| 色视频一区二区三区| 国产一区二区三区免费观看在线| 欧美精品videos性欧美| 国产在线观看免费网站| 欧美福利视频导航| 国产精彩视频在线观看| 国产三区在线成人av| 一级黄色大片儿| 国产精品日韩久久久| 亚洲一区二区不卡视频| 超碰在线成人| 国产精品免费久久久| 日本在线视频网址| 国产亚洲欧洲高清| 亚洲欧美另类一区| 在线观看www91| 久久久久亚洲av片无码下载蜜桃| 久久无码av三级| 999热精品视频| 可以免费看不卡的av网站| 日韩中文在线字幕| 国产成人一区二区三区影院| 99久久久精品免费观看国产 | 色香蕉成人二区免费| 久久国产一级片| 欧美激情在线免费观看| 国产xxxx视频| 国内成人精品2018免费看| 91av在线免费播放| 亚洲韩日在线| 午夜久久久久久久久久久| 精品一区二区三| 黑人另类av| 亚洲日本视频在线| 国产情人节一区| 日韩欧美看国产| 97精品久久久中文字幕免费| 18加网站在线| 中文精品99久久国产香蕉| 性xxxx视频| 欧美v日韩v国产v| 91中文字幕在线视频| 在线一区二区三区| 国产婷婷色一区二区在线观看| 亚洲在线中文字幕| 国内偷拍精品视频| 亚洲欧美激情视频在线观看一区二区三区 | 在线不卡免费视频| 色域天天综合网| 日韩av在线播| 亚洲一级二级三级在线免费观看| 成人做爰视频网站| 国产精品婷婷午夜在线观看| 中文字幕在线1| 久久久精品一品道一区| 欧美丰满少妇人妻精品| av欧美精品.com| 日韩综合第一页| 成人精品一区二区三区四区| 欧美人与性动交α欧美精品| 国产激情一区二区三区四区| 亚洲一级片免费观看| 国产精品中文有码| 91人妻一区二区三区| 国产剧情一区在线| 国产精品久久久久久9999| 黄色资源网久久资源365| 中文字幕免费高清在线| 精品一区二区在线视频| 久久久久xxxx| 国产乱国产乱300精品| 亚洲国产欧美日韩在线| 国产精品亚洲视频| 91人妻一区二区| 91在线精品一区二区三区| 色噜噜在线观看| 久久久精品黄色| 午夜影院黄色片| 亚洲婷婷在线视频| 久久久久久久久久久97| 亚洲成人精品一区| 黄色一级片免费在线观看| 欧美视频13p| 波多野结衣网站| 欧美夫妻性生活| 国精产品乱码一区一区三区四区| 亚洲精品久久久久中文字幕二区| 午夜性色福利影院| 国产一区二区三区丝袜| 日本视频在线播放| 色综合久久久久久中文网| 国模雨婷捆绑高清在线| 5278欧美一区二区三区| 欧美不卡高清一区二区三区| 国产欧亚日韩视频| 国产欧美三级电影| 欧美一区二区三区精美影视| 99精品视频在线观看播放| 国产91在线亚洲| 午夜亚洲性色视频| 在线观看国产一级片| 国产精品一区2区| 人妻少妇精品视频一区二区三区| 国产亚洲综合在线| 免费网站观看www在线观| 欧美日韩免费在线观看| 一级黄色片免费看| 亚洲成人亚洲激情| 91九色在线porn| 欧美黄色三级网站| 国产综合色区在线观看| 亚洲最大成人网色| 中文字幕av一区二区三区人| 中文字幕一区二区三区四区五区六区 | 久久精品无码av| 欧美一区二区在线不卡| 天堂av在线资源| 不卡毛片在线看| 天然素人一区二区视频| 国产精品久久久对白| 成人亚洲一区| 缅甸午夜性猛交xxxx| 精品一区二区日韩| 最近中文字幕免费| 亚洲18色成人| 国产男女无套免费网站| 亚洲视频在线免费观看| 黄页网站在线| 成人中心免费视频| 视频一区中文| 国产精品久久久久9999爆乳| 麻豆精品一区二区综合av| 亚洲专区区免费| 亚洲曰韩产成在线| 国产又粗又长又黄| 一区二区欧美日韩视频| 丝袜老师在线| 国产精品视频免费观看| 亚洲激情中文在线| 国产3p在线播放| 中文字幕精品—区二区四季| 天天干在线播放| 亚洲福利影片在线| 免费男女羞羞的视频网站在线观看| 91精品国产综合久久香蕉最新版| 伊人久久大香线蕉综合网站 | 久久久久久久久久一区二区三区| 欧美三级电影网站| av电影在线观看网址| 欧美在线免费视频| 欧美高清视频看片在线观看 | 视频一区二区三区中文字幕| 熟妇人妻久久中文字幕| 亚洲午夜av在线| 亚洲成人一级片| 欧美另类69精品久久久久9999| **精品中文字幕一区二区三区| 亚洲国产高清国产精品| 青青草91视频| 久久一级免费视频| 欧美精品高清视频| 九七电影韩国女主播在线观看| 国产精品一区二区在线| 日韩精品一区二区久久| 污版视频在线观看| 国产精品国产精品国产专区不蜜| 一区二区自拍偷拍| 中文字幕亚洲图片| 亚洲成a人片777777久久| 中文有码久久| 国产精品一区二区久激情瑜伽| avtt天堂在线| 精品伦理精品一区| 91九色美女在线视频| 精品国产乱码久久久久久丨区2区| 亚洲美洲欧洲综合国产一区| 中文字幕在线永久| 色综合久久久久久久| av电影在线网| 亚洲伊人第一页| 亚洲黑丝一区二区| 亚洲天堂成人av| 欧美午夜影院一区| 91精选在线| 国产欧美丝袜| 日韩激情在线观看| 肉色超薄丝袜脚交69xx图片| 91精品国产一区二区三区香蕉| 欧美精品videosex| 久久66热这里只有精品| 日本在线不卡视频| 印度午夜性春猛xxx交| 亚洲精品国产suv| 性高爱久久久久久久久| 在线免费一区| 成人免费毛片嘿嘿连载视频| 久久青青草原亚洲av无码麻豆| 神马国产精品影院av| 日韩视频一区二区三区四区| 免费在线激情视频| 中文字幕亚洲在| 手机av在线免费观看| 国产精品视频自拍| 最新亚洲一区| 国产精品成人在线视频| 精品国产乱码久久久久久蜜臀 | 中文字幕国产综合| 777欧美精品| 中文在线中文资源| 91视频成人免费| 国产偷v国产偷v亚洲高清| av加勒比在线| 日本高清+成人网在线观看| 亚洲一区欧美| 精品人妻一区二区三区香蕉| 91精品国产一区二区三区蜜臀| 亚洲综合电影| 免费的av在线| 欧美经典一区二区三区| 欧美一级性视频| 国产欧美日韩视频| 性久久久久久| 久久久久免费看|