黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

Google和Facebook不使用Docker的原理解析

瀏覽:286日期:2024-10-28 09:49:50

寫作本文的起因是我想讓修改后的分布式 PyTorch 程序能更快的在 Facebook 的集群上啟動。探索過程很有趣,也展示了工業機器學習需要的知識體系。

2007 年我剛畢業后在 Google 工作過三年。當時覺得分布式操作系統 Borg 真好用。

從 2010 年離開 Google 之后就一直盼著它開源,直到 Kubernetes 的出現。

Kubernetes 調度的計算單元是 containers(準確的翻譯是“集裝箱”,而不是意思泛泛的“容器”,看看 Docker 公司的 Logo 上畫的是啥就知道作者的心意了)。

而一個 container 執行一個 image,就像一個 process 執行一個 program。

無論 Googlers 還是 ex-Googlers,恐怕在用 Borg 的時候都未曾接觸過 container 和 image 這兩個概念。為啥 Borg 里沒有,而 Kubernetes 卻要引入了這樣兩個概念呢?

這個曾經問題在我腦海中一閃而過就被忽略了。畢竟后來我負責開源項目比較多,比如百度 Paddle 以及螞蟻的 SQLFlow 和 ElasticDL,Docker 用起來很順手。于是也就沒有多想。

今年(2021 年)初,我加入 Facebook。恰逢 Facebook 發論文[1]介紹了其分布式集群管理系統 Tupperware。

不過 Tupperware 是一個注冊于 1946 年的品牌 https://en.wikipedia.org/wiki/Tupperware_Brands,所以在論文里只好起了另一個名字 Twine。

因為行業里知道 Tupperware 這個名字的朋友很多,本文就不說 Twine 了。

總之,這篇論文的發表又引發了我對于之前問題的回顧——Facebook 里也沒有 Docker!

和 Facebook Tuppware 團隊以及 Google Borg 幾位新老同事仔細聊了聊之后,方才恍然。因為行業里沒有看到相關梳理,本文是為記錄。

一言蔽之

簡單的說,如果用 monolithic repository 來管理代碼,則不需要 Docker image(或者 ZIP、tarball、RPM、deb)之類的“包”。

所謂 monolithic repo 就是一家公司的所有項目的所有代碼都集中放在一個(或者極少數)repo 里。

因為 monolithic repository 得有配套的統一構建系統(build system)否則編譯不動那么老大一坨代碼。

而既然有統一的 build system,一旦發現某個集群節點需要執行的程序依賴的某個模塊變化了,同步這個模塊到此節點既可。完全不需要打包再同步。

反之,如果每個項目在一個獨立的 git/svn repo 里,各自用不同的 build system,比如各個開源項目在不同的 GitHub repo 里,則需要把每個項目 build 的結果打包。

而 Docker image 這樣支持分層的包格式讓我們只需要傳輸那些容納被修改的項目的最上面幾層,而盡量復用被節點 cache 了的下面的幾層。

Google 和 Facebook 都使用 monolithic repository,也都有自己的 build systems(我這篇老文尋找 Google Blaze[2] 解釋過 Google 的 build system)所以不需要“包”,當然也就不需要 Docker images。

不過 Borg 和 Tupperware 都是有 container 的(使用 Linux kernel 提供的一些 system calls,比如 Google Borg 團隊十多年前貢獻給 Linux kernel 的 cgroup)來實現 jobs 之間的隔離。

只是因為如果不需要大家 build Docker image 了,那么 container 的存在就不容易被關注到了。

如果不想被上述蔽之,而要細究這個問題,那就待我一層一層剝開 Google 和 Facebook 的研發技術體系和計算技術體系。

Packaging

當我們提交一個分布式作業(job)到集群上去執行,我們得把要執行的程序(包括一個可執行文件以及相關的文件,比如 *.so,*.py)傳送到調度系統分配給這個 job 的一些機器(節點、nodes)上去。

這些待打包的文件是怎么來的呢?當時是 build 出來的。在 Google 里有 Blaze,在 Facebook 里有 Buck。

感興趣的朋友們可以看看 Google Blaze 的“開源版本”Bazel[3],以及 Facebook Buck 的開源版本[4]。

不過提醒在先:Blaze 和 Facebook Buck 的內部版都是用于 monolithic repo 的,而開源版本都是方便大家使用非 mono repos 的,所以理念和實現上有不同,不過基本使用方法還是可以感受一下的。

假設我們有如下模塊依賴(module dependencies),用 Buck 或者 Bazel 語法描述(兩者語法幾乎一樣):

python_binary(name='A', srcs=['A.py'], deps=['B', 'C'], ...)python_library(name='B', srcs=['B.py'], deps=['D'], ...)python_library(name='C', srcs=['C.py'], deps=['E'], ...)cxx_library(name='D', srcs=['D.cxx', 'D.hpp'], deps='F', ...)cxx_library(name='E', srcs=['E.cxx', 'E.hpp'], deps='F', ...)

那么模塊(build 結果)依賴關系如下:

A.py --> B.py --> D.so - -> C.py --> E.so --> F.so

如果是開源項目,請自行腦補,把上述模塊(modules)替換成 GPT-3,PyTorch,cuDNN,libc++ 等項目(projects)。

當然,每個 projects 里包含多個 modules 也依賴其他 projects,就像每個 module 有多個子 modules 一樣。

Tarball

最簡單的打包方式就是把上述文件 {A,B,C}.py, {D,E,F}.so 打包成一個文件 A.zip,或者 A.tar.gz。

更嚴謹的說,文件名里應該包括版本號。比如 A-953bc.zip,其中版本號 953bc 是 git/Mercurial commit ID。

引入版本號,可以幫助在節點本地 cache,下次運行同一個 tarball 的時候,就不需要下載這個文件了。

請注意這里我引入了 package caching 的概念。為下文解釋 Docker 預備。

XAR

ZIP 或者 tarball 文件拷貝到集群節點上之后,需要解壓縮到本地文件系統的某個地方,比如:/var/packages/A-953bc/{A,B,C}.py,{D,E,F}.so。

一個稍顯酷炫的方式是不用 Tarball,而是把上述文件放在一個 overlay filesystem 的 loopback device image 里。這樣“解壓”就變成了“mount”。

請注意這里我引入了 loopback device image 的概念。為下文解釋 Docker 預備。

什么叫 loopback device image 呢?在 Unix 里,一個目錄樹的文件們被稱為一個文件系統(filesystem)。

通常一個 filesystem 存儲在一個 block device 上。什么是 block device 呢?

簡單的說,但凡一個存儲空間可以被看作一個 byte array 的,就是一個 block device。

比如一塊硬盤就是一個 block device。在一個新買的硬盤里創建一個空的目錄樹結構的過程,就叫做格式化(format)。

既然 block device 只是一個 byte array,那么一個文件不也是一個 byte array 嗎?

是的!在 Unix 的世界里,我們完全可以創建一個固定大小的空文件(用 truncate 命令),然后“格式化”這個文件,在里面創建一個空的文件系統。然后把上述文件 {A,B,C}.py,{D,E,F}.so 放進去。

比如 Facebook 開源的 XAR 文件[5]格式。這是和 Buck 一起使用的。

如果我們運行 buck build A 就會得到 A.xar . 這個文件包括一個 header,以及一個 squashfs loopback device image,簡稱 squanshfs image。

這里 squashfs 是一個開源文件系統。感興趣的朋友們可以參考這個教程[6],創建一個空文件,把它格式化成 squashfs,然后 mount 到本地文件系統的某個目錄(mount point)里。

待到我們 umount 的時候,曾經加入到 mount point 里的文件,就留在這個“空文件”里了。

我們可以把它拷貝分發給其他人,大家都可以 mount 之,看到我們加入其中的文件。

因為 XAR 是在 squashfs image 前面加上了一個 header,所以沒法用 mount -t squashf 命令來 mount,得用 mount -t xar 或者 xarexec -m 命令。

比如,一個節點上如果有了 /packages/A-953bc.xar,我們可以用如下命令看到它的內容,而不需要耗費 CPU 資源來解壓縮:

xarexec -m A-953bc.xar

這個命令會打印出一個臨時目錄,是 XAR 文件的 mount point。

分層

如果我們現在修改了 A.py,那么不管是 build 成 tarball 還是 XAR,整個包都需要重新更新。

當然,只要 build system 支持 cache,我們是不需要重新生成各個 *.so 文件的。

但是這個不解決我們需要重新分發 .tar.gz 和 .xar 文件到集群的各個節點的麻煩。

之前節點上可能有老版本的 A-953bc87fe.{tar.gz,xar} 了,但是不能復用。為了復用 ,需要分層。

對于上面情況,我們可以根據模塊依賴關系圖,構造多個 XAR 文件。

A-953bc.xar --> B-953bc.xar --> D-953bc.xar - -> C-953bc.xar --> E-953bc.xar --> F-953bc.xar

其中每個 XAR 文件里只有對應的 build rule 產生的文件。比如,F-953bc.xar 里只有 F.so。

這樣,如果我們只修改了 A.py,則只有 A.xar 需要重新 build 和傳送到集群節點上。這個節點可以復用之前已經 cache 了的 {B,C,D,E,F}-953bc.xar 文件。

假設一個節點上已經有 /packages/{A,B,C,D,E,F}-953bc.xar,我們是不是可以按照模塊依賴順序,運行 xarexec -m 命令,依次 mount 這些 XAR 文件到同一個 mount point 目錄,既可得到其中所有的內容了呢?

很遺憾,不行。因為后一個 xarexec/mount 命令會報錯 —— 因為這個 mount point 已經被前一個 xarexec/mount 命令占據了。

下面解釋為什么文件系統 image 優于 tarball。

那退一步,不用 XAR 了,用 ZIP 或者 tar.gz 不行嗎?可以,但是慢。我們可以把所有 .tar.gz 都解壓縮到同一個目錄里。

但是如果 A.py 更新了,我們沒法識別老的 A.py 并且替換為新的,而是得重新解壓所有 .tar.gz 文件,得到一個新的文件夾。而重新解壓所有的 {B,C,D,E,F}.tar.gz 很慢。

Overlay Filesystem

有一個申請的開源工具 fuse-overlayfs。它可以把幾個目錄“疊加”(overlay)起來。

比如下面命令把 /tmp/{A,B,C,D,E,F}-953bc 這幾個目錄里的內容都“疊加”到 /pacakges/A-953bc 這個目錄里。

fuse-overlayfs -o lowerdir='/tmp/A-953bc:/tmp/B-953bc:...' /packages/A-953bc

而 /tmp/{A,B,C,D,E,F}-953bc 這幾個目錄來自 xarcexec -m /packages/{A,B,C,D,E,F}-953bc.xar。

請注意這里我引入了 overlay filesystem 的概念。為下文解釋 Docker 預備。fuse-overlayfs 是怎么做到這一點的呢?

當我們訪問任何一個文件系統目錄,比如 /packages/A 的時候,我們使用的命令行工具(比如 ls )調用 system calls(比如 open/close/read/write) 來訪問其中的文件。

這些 system calls 和文件系統的 driver 打交道 —— 它們會問 driver:/packages/A 這個目錄里有沒有一個叫 A.py 的文件呀?

如果我們使用 Linux,一般來說,硬盤上的文件系統是 ext4 或者 btrfs。也就是說,Linux universal filesystem driver 會看看每個分區的文件系統是啥,然后把 system call 轉發給對應的 ext4/btrfs driver 去處理。

一般的 filesystem drivers 和其他設備的 drivers 一樣運行在 kernel mode 里。

這是為什么一般我們運行 mount 和 umount 這類操作 filesystems 的命令的時候,都需要 sudo。而 FUSE 是一個在 userland 開發 filesystem driver 的庫。

fuse-overlayfs 這命令利用 FUSE 這個庫,開發了一個運行在 userland 的 fuse-overlayfs driver。

當 ls 命令詢問這個 overlayfs driver /packages/A-953bc 目錄里有啥的時候,這個 fuse-overlayfs driver 記得之前用戶運行過 fuse-overlayfs 命令把 /tmp/{A,B,C,D,E}-953bc 這幾個目錄給疊加上去過,所以它返回這幾個目錄里的文件。

此時,因為 /tmp/{A,B,C,D,E}-953bc 這幾個目錄其實是 /packages/{A,B,C,D,E,F}-953bc.xar 的 mount points,所以每個 XAR 就相當于一個 layer。

像 fuse-overlayfs driver 這樣實現把多個目錄“疊加”起來的 filesystem driver 被稱為 overlay filesystem driver,有時簡稱為 overlay filesystems。

Docker Image and Layer

上面說到用 overlay filesystem 實現分層。用過 Docker 的人都會熟悉一個 Docker image 由多層構成。

當我們運行 docker pull <image-name> 命令的時候,如果本機已經 cache 了這個 image 的一部分 layers,則省略下載這些 layers。這其實就是用 overlay filesystem 實現的。

Docker 團隊開發了一個 filesystem(driver)叫做 overlayfs —— 這是一個特定的 filesystem 的名字。

顧名思義,Docker overlayfs 也實現了“疊加”(overlay)的能力,這就是我們看到每個 Docker image 可以有多個 layers 的原因。

Docker 的 overlayfs 以及它的后續版本 overlayfs2 都是運行在 kernel mode 里的。

這也是 Docker 需要機器的 root 權限的原因之一,而這又是 Docker 被詬病容易導致安全漏斗的原因。

有一個叫 btrfs 的 filesystem,是 Linux 世界里最近幾年發展很迅速的,用于管理硬盤效果很好。

這個 filesystem 的 driver 也支持 overlay。所以 Docker 也可以被配置為使用這個 filesystem 而不是 overlayfs。

不過只有 Docker 用戶的電腦的 local filesystem 是 btrfs 的時候,Docker 才能用 btrfs 在上面疊加 layers。

所以說,如果你用的是 macOS 或者 Windows,那肯定沒法讓 Docker 使用 btrfs 了。

不過如果你用的是 fuse-overlayfs,那就是用了一副萬靈藥了。只是通過 FUSE 在 userland 運行的 filesystem 的性能很一般,不過本文討論的情形對性能也沒啥需求。

其實 Docker 也可以被配置使用 fuse-overlayfs。Docker 支持的分層 filesystem 列表在這里 Docker storage drivers[7]。

為什么需要 Docker Image

總結上文所述,從編程到可以在集群上跑起來,我們要做幾個步驟:

編譯:把源碼編譯成可執行的形式。 打包:把編譯結果納入一個“包”里,以便部署和分發 傳輸:通常是集群管理系統(Borg、Kubernetes、Tupperware 來做)。如果要在某個集群節點上啟動 container,則需要把“包”傳輸到此節點上,除非這個節點曾經運行過這個程序,已經有包的 cache。 解包:如果“包”是 tarball 或者 zip,到了集群節點上之后需要解壓縮;如果“包”是一個 filesystem image,則需要 mount。

把源碼分成模塊,可以讓編譯這步充分利用每次修改只改動一小部分代碼的特點,只重新編譯被修改的模塊,從而節省時間。

為了節省 2,3 和 4 的時間,我們希望“包”是分層的。每一層最好只包含一個或者幾個代碼模塊。這樣,可以利用模塊之間的依賴關系,盡量復用容納底層模塊的“層”。

在開源的世界里,我們用 Docker image 支持分層的特點,一個基礎層可能只包括某個 Linux distribution(比如 CentOS)的 userland programs,如 ls、cat、grep 等。

在其上,可以有一個層包括 CUDA。再其上安裝 Python 和 PyTorch。再再之上的一層里是 GPT-3 模型的訓練程序。

這樣,如果我們只是修改了 GPT-3 訓練程序,則不需要重新打包和傳輸下面三層。

這里的邏輯核心是:存在“項目”(project)的概念。每個項目可以有自己的 repo,自己的 building system(GNU make、CMake、Buck、Bazel 等),自己的發行版本(release)。

所以每個項目的 release 裝進 Docker image 的一層 layer。與其前置多層合稱為一個 image。

為什么 Google 和 Facebook 不需要 Docker

經過上述這么多知識準備,請我們終于可以點題了。

因為 Google 和 Facebook 使用 monolithic repository,使用統一的 build system(Google Blaze 或者 Facebook Buck)。

雖然也可以利用“項目”的概念,把每個項目的 build result 裝入 Docker image 的一層。但是實際上并不需要。

利用 Blaze 和 Buck 的 build rules 定義的模塊,以及模塊之間依賴關系,我們可以完全去打包和解包的概念。

沒有了包,當然就不需要 zip、tarball、以及 Docker image 和 layers 了。

直接把每個模塊當做一個 layer 既可。如果 D.so 因為我們修改了 D.cpp 被重新編譯,那么只重新傳輸 D.so 既可,而不需要去傳輸一個 layer 其中包括 D.so。

于是,在 Google 和 Facebook 里,受益于 monolithic repository 和統一的 build 工具。

我們把上述四個步驟省略成了兩個:

編譯:把源碼編譯成可執行的形式。傳輸:如果某個模塊被重新編譯,則傳輸這個模塊。

Google 和 Facebook 沒在用 Docker

上一節說了 monolithic repo 可以讓 Google 和 Facebook 不需要 Docker image。

現實是 Google 和 Facebook 沒有在使用 Docker。這兩個概念有區別。

我們先說“沒在用”。歷史上,Google 和 Facebook 使用超大規模集群先于 Docker 和 Kubernetes 的出現。當時為了打包方便,連 tarball 都沒有。

對于 C/C++ 程序,直接全靜態鏈接,根本沒有 *.so。于是一個 executable binary file 就是“包”了。

直到今天,大家用開源的 Bazel 和 Buck 的時候,仍然可以看到默認鏈接方式就是全靜態鏈接。

Java 語言雖然是一種“全動態鏈接”的語言,不過其誕生和演進扣準了互聯網歷史機遇,其開發者發明 jar 文件格式,從而支持了全靜態鏈接。

Python 語言本身沒有 jar 包,所以 Blaze 和 Bazel 發明了 PAR 文件格式(英語叫 subpar),相當于為 Python 設計了一個 jar。開源實現在這里[8]。

類似的,Buck 發明了 XAR 格式,也就是我上文所說的 squashfs image 前面加了一個 header。其開源實現在這里[9]。

Go 語言默認就是全靜態鏈接的。在 Rob Pike 早期的一些總結里提到,Go 的設計,包括全靜態鏈接,基本就是繞坑而行,繞開 Google C/C++ 實踐中遇到過的各種坑。

熟悉 Google C++ style guide 的朋友們應該感覺到了 Go 語法覆蓋了 guide 說的“應該用的 C++ 語法”,而不支持 guide 說的 “不應該用的 C++ 的部分”。

簡單的說,歷史上 Google 和 Facebook 沒有在用 Docker image,很重要的一個原因是,其 build system 對各種常見語言的程序都可以全靜態鏈接,所以可執行文件就是“包”。

但這并不是最好的解法,畢竟這樣就沒有分層了。哪怕我只是修改了 main 函數里的一行代碼,重新編譯和發布,都需要很長時間,十分鐘甚至數十分鐘,要知道全靜態鏈接得到的可執行文件往往大小以 GB 計。

所以全靜態鏈接雖然是 Google 和 Facebook 沒有在用 Docker 的原因之一,但是并不是一個好選擇。

所以也沒被其他公司效仿。大家還是更愿意用支持分層 cache 的 Docker image。

完美解法的技術挑戰

完美的解法應該支持分層 cache(或者更精確的說是分塊 cache)。所以還是應該用上文介紹的 monolithic repo 和統一 build system 的特點。

但是這里有一個技術挑戰,build system 描述的模塊,而模塊通常比“項目”細粒度太多了。

以 C/C++ 語言為例,如果每個模塊生成一個 .so 文件,當做一個“層”或者“塊”以便作為 cache 的單元,那么一個應用程序可能需要的 .so 數量就太多了。

啟動應用的時候,恐怕要花幾十分鐘來 resolve symbols 并且完成鏈接。

所以呢,雖然 monolithic repo 有很多好處,它也有一個缺點,不像開源世界里,大家人力的把代碼分解成“項目”。

每個項目通常是一個 GitHub repo,其中可以有很多模塊,但是每個項目里所有模塊 build 成一個 *.so 作為一個 cache 的單元。

因為一個應用程序依賴的項目數量總不會太多,從而控制了 layer 的總數。

好在這個問題并非無解。既然一個應用程序對各個模塊的依賴關系是一個 DAG,那么我們總可以想辦法做一個 graph partitioning,把這個 DAG 分解成不那么多的幾個子圖。

仍然以 C/C++ 程序為例,我們可以把每個子圖里的每個模塊編譯成一個 .a,而每個子圖里的所有 .a 鏈接成一個 *.so,作為一個 cache 的單元。

于是,如何設計這個 graph partitioning 算法就成了眼前最重要的問題了。

相關鏈接:

https://engineering.fb.com/2019/06/06/data-center-engineering/twine/

https://zhuanlan.zhihu.com/p/55452964

https://bazel.build/

https://buck.build/

https://github.com/facebookincubator/xar

https://tldp.org/HOWTO/SquashFS-HOWTO/creatingandusing.html

https://docs.docker.com/storage/storagedriver/select-storage-driver/

https://github.com/google/subpar

https://github.com/facebookincubator/xar

到此這篇關于Google和Facebook不使用Docker的原理解析的文章就介紹到這了,更多相關Google和Facebook不使用Docker內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Docker
相關文章:
主站蜘蛛池模板: 屁屁影院一区二区三区 | 亚洲老妈激情一区二区三区 | 性猛交xxxx乱大交孕妇2 | 浮妇高潮喷白浆视频 | 五月婷婷一区二区 | 最新国产麻豆aⅴ精品无码 天天摸天天透天天添 | 亚洲成人在线视频播放 | 强开小婷嫩苞又嫩又紧视频韩国 | 丁香五月缴情综合网 | 亚洲人成影院在线无码按摩店 | 国产伦孑沙发午休精品 | 性激烈的欧美三级 | 污污网站免费在线观看 | 国产第四页 | 91精品国产综合久久久久影院不卡 | 精品日韩欧美一区二区在线播放 | 一区二区国产精品精华液 | 亚洲成人午夜影院 | 国产成人久久av免费看 | 日韩激情国产 | 亚洲综合无码久久精品综合 | 亚洲国产欧美日韩在线 | 在线中文字幕播放 | 精品乱码一区内射人妻无码 | 最新无码a∨在线观看 | 日韩精品 中文字幕 视频在线 | 欧美美女性生活视频 | 91大片淫黄大片在线天堂 | 一级黄毛片 | 免费观看又色又爽又黄的韩国 | 欧洲精品视频在线观看 | 久久久久久臀欲欧美日韩 | 96福利视频 | 久久国产亚洲精品无码 | 天天操夜夜躁 | 亚洲天堂欧美在线 | 丰满蕾丝乳罩少妇呻吟91 | 最大胆裸体人体牲交 | 亚洲www啪成人一区二区麻豆 | 国产自偷自拍视频 | 成人91在线 | 少妇无码一区二区三区 | 少妇坐莲好爽91 | 国产成人a在线观看视频免费 | 18av视频| 中文字幕一区二区三区乱码不卡 | 天堂中文最新版在线中文 | 天天综合网天天综合色 | 91手机在线视频 | 久久久免费观看视频 | 久久婷婷五月综合色欧美 | 国产欧美不卡 | 无码精品视频一区二区三区 | 欧美性猛交xxx乱久交 | 日韩精品中文字幕在线观看 | h色视频在线观看 | 浪荡受张腿灌满双性h男男 老妇肥熟凸凹丰满刺激小说 | 无码无套少妇毛多18p | 国产精品免费麻豆入口 | 精品欧美一区二区久久久伦 | 成人毛片18女人 | 香蕉视频色 | 久草福利在线 | 免费国产网站 | 又大又粗又爽18禁免费看 | a√在线视频 | 国产第六页 | 麻豆免费观看视频 | 91网址在线观看 | 久久久精品久久日韩一区 | 狠狠五月激情六月丁香 | 伊人久久在线 | 91精品国产福利在线观看的优点 | 李丽珍aa一级a毛片 李丽珍a级裸体啪啪 | 婷婷嫩草国产精品一区二区三区 | 欧美日韩成人在线视频 | 美女免费黄视频 | 中国内地毛片免费高清 | 国产日韩精品一区二区三区在线 | 51视频精品全部免费 | 亚洲一区 国产精品 | 国产女教师bbwbbwbbw | 日本在线资源 | 婷婷射精av这里只有精品 | 91麻豆精品91久久久久同性 | 亚洲精品无码永久在线观看性色 | 欧美一区二区三区大片 | 色综合中文综合网 | 天天想夜夜爽 | 九九黄色 | 亚洲狠狠丁香婷婷综合久久久 | 国产精品综合久久 | 午夜不卡久久精品无码免费 | 日本不卡在线视频 | 国产综合视频在线 | 九九天堂网 | 欧美精品乱人伦久久久久久 | 亚州av一区二区 | 国产毛片毛片精品天天看软件 | 99re热在线视频 | 亚洲精品乱码久久久久久 | 精品国自产在线观看 | 丁香五香天综合情 | 尤物视频在线观看免费 | 三级全黄的女人高潮叫 | 国产精品久久久久久久久免费樱桃 | 国产精品不卡无码av在线播放 | 野外做受又硬又粗又大视频 | 最近中文字幕mv在线资源 | 老司机在线精品视频 | 69视频在线免费观看 | 少妇人妻偷人精品无码视频新浪 | 免费国产在线精品一区二区三区 | 午夜寂寞少妇aaa片毛片 | 欧美性受黑人性爽 | 国产精品揄拍500视频 | 又爽又黄axxx片免费观看 | 四虎影库久免费视频 | 夜夜爽av福利精品导航 | 99精品国产在热久久婷婷 | 久久精品国产免费 | 国产精品免费一区二区 | 337人体做爰大胆视频 | 一区二区在线视频播放 | 国产精品人妻熟女毛片av久 | 免费在线不卡av | 国产精品狼人久久久久影院 | 日韩欧美网址 | 天堂视频在线观看免费 | 日本伊人精品一区二区三区 | 青青草视频在线观看 | www.xxx亚洲| 精品av天堂毛片久久久借种 | 欧美成年黄网站色视频 | 熟妇人妻av无码一区二区三区 | 免费麻豆av| 久久99在线| 高级会所人妻互换94部分 | 日韩有码在线视频 | 韩国三级少妇高潮在线观看 | 国产女主播在线播放 | 欧美无遮挡很黄裸交视频 | 美女撒尿aaaaa级 | 国产91精清纯白嫩高中在线观看 | 国产乱码精品1区2区3区 | 青青草国产在线视频 | 亚洲va中文字幕无码 | 少妇饥渴偷公乱h姚蕊 | 中文字幕一精品亚洲无线一区 | 强行糟蹋人妻hd中文字 | 久久国产成人午夜av影院 | 蜜桃成人无码区免费视频网站 | 日韩精品一区二区三区视频 | 91精品国产综合久久四虎久久 | 久久免费观看视频 | 羞羞啪啪调教play男男黄 | 日本疯狂做爰xxxⅹ高潮视频 | 狼人伊人干 | 国产成人免费ā片在线观看 | 午夜丁香婷婷 | 超碰97干| 懂色av色吟av夜夜嗨 | 玩弄少妇人妻中文字幕 | 欧美视频一区二区在线观看 | 精品日韩欧美 | 欧美激情亚洲色图 | 国产熟女一区二区三区四区五区 | 国产激情午夜 | 欧美皮鞭调教wwwcom | 日韩中文字幕第一页 | 免费无码又爽又刺激高潮 | 日本色偷偷 | 婷婷综合久久中文字幕蜜桃三电影 | 老女人任你躁久久久久久老妇 | 亚洲中文精品久久久久久不卡 | 日韩精品视频在线观看一区二区 | 日韩av影片 | 男女啪啪无遮挡 | 午夜黄色影院 | 综合无码一区二区三区 | 亚洲国产成人精品无码一区二区 | 午夜在线视频观看日韩17c | 狠狠老司机 | 久久亚洲精品久久国产一区二区 | 国产盗摄精品一区二区酒店 | 天天射寡妇射 | 少妇又紧又深又湿又爽视频 | av免费福利| 日韩中文三级 | 亚洲区一区 | 亚洲丶国产丶欧美一区二区三区 | 成年人网站黄色 | 国产精品一二三区在线观看 | 黄色免费视屏 | 亚洲欧洲精品成人 | 国产 一二三四五六 | 奇米影视四色在线 | 嫩草视频在线观看免费 | yw在线观看| 蜜臀av夜夜澡人人爽人人 | 五月天丁香亚洲 | 色综合久久av | 日本三级香港三级人妇99 | 亚欧无线一线二线三线区别 | 狠狠色噜噜狠狠狠7777奇米 | 国产亚洲精品久久yy50 | 国产自偷自拍视频 | 国内精品久久久久久中文字幕 | 国产清纯粉嫩学生白丝在线观看 | 中文字幕亚洲一区二区三区 | 亚洲欧美日韩综合俺去了 | 国产精无久久久久久久免费 | 日韩福利片在线观看 | 青青操影院 | 超薄肉色丝袜一区二区 | 健美运动员性猛交xxxxx | 99色视频 | 真实的国产乱xxxx在线91 | av大帝在线| 一区高清| 欧洲高潮三级做爰 | 亚洲aⅴ在线 | 日本一级理论片在线大全 | 熟女少妇内射日韩亚洲 | 国产肉体xx裸体137大胆 | lutube成人福利在线观看污 | 成人精品一区二区三区网站 | 男人爱看的网站 | 国产大尺度做爰床 | 天天射天天搞 | 国产成人主播 | 国产乱子经典视频在线观看 | 国产一区二区三区美女 | 成人免费小视频 | 国产乡下妇女做爰 | 色玖玖 | 一区二区三区国产视频 | 亚洲综合色婷婷 | 漂亮人妻被黑人久久精品 | 亚洲欧美日韩另类精品一区二区三区 | jizzyou中国少妇农村 | 久久国产精品福利一区二区三区 | 在线va视频 | 日韩精品久久久免费观看夜色 | 国精产品一区一区三区mba视频 | 自拍 另类 综合 欧美小说 | 日韩在线观看一区 | 国产人妖ts重口系列喝尿视频 | 色哟哟黄色 | 久久久久这里只有精品 | 亚洲人成在线影院 | 日韩美女视频网站 | 免费a级毛片大学生免费观看 | 五月天av网 | 日日夜夜撸影院 | 成人激情视频网 | 欧洲自拍偷拍 | 香港三日本三级少妇66 | 午夜在线免费视频 | 一级肉体全黄裸片高潮不断 | 欧美日韩国产图片 | 小箩莉末发育娇小性色xxxx | 国产精品嫩草影院ccm | 黄色片网站在线播放 | 玩弄少妇人妻 | 亚洲乱码国产乱码精品精在线网站 | 久久影院午夜 | 国产成人涩涩涩视频在线观看 | 天天综合亚洲综合网天天αⅴ | 男人添女人下部高潮全视频 | 久久久国产亚洲 | 免费视频www在线观看网站 | 日韩在线视频播放 | 成人孕妇专区做爰高潮 | av片免费播放 | 插鸡网站在线播放免费观看 | frxxee欧美xxee麻豆 | 久久中文精品 | 欧美日韩二三区 | 免费观看性生交大片女神 | 国产午夜免费福利 | 亚洲国产影院av久久久久 | 人妻少妇精品无码专区app | 国产在线精品国自产拍影院同性 | 国产一级精品毛片 | 亚洲最大av无码国产 | 超色视频| 欧美日韩中文国产一区 | 嫩模写真一区二区三区三州 | 让少妇高潮无乱码高清在线观看 | 无套内谢少妇高潮免费 | а√资源新版在线天堂 | 国产成人精品日本亚洲第一区 | 日韩成人片 | 国产精品成人自拍 | 色视频www在线播放国产成人 | 中国女人性猛交 | 色老二导航| 久久精品国产三级 | 久久综合99re88久久爱 | 欧美精品1区2区 | 国产裸体视频 | 精品 日韩 国产 欧美 视频 | 久久精品一二三 | 超碰干 | 国产精品熟女人妻 | 国产夫妻精品 | 秋霞国产午夜精品免费视频 | 一本中文字幕 | 插嫩嫩学生妹p | 国产又猛又黄又爽三男一女 | 国产吴梦梦无套系列 | 手机看片1024久久 | 欧美做受高潮动漫 | 亚洲狠狠丁香综合一区 | 91av日本| 国产精品18久久久久久久 | 黄色免费一级 | 麻豆网站免费观看 | 亚洲国产中文字幕在线视频综合 | 五月久久久综合一区二区小说 | 久久久精品网站 | 在线观看无码不卡av | 亚洲黄色毛片 | 亚欧美在线| 日本高清一区二区三 | www夜插内射视频网站 | av日韩av | 国产精品久久久久久久免费软件 | 男女肉粗暴进来动态图 | 免费国产a级片 | 午夜精品久久久久 | 成人久久免费网站 | 九草在线观看 | 国产精品免费av | 一本精品99久久精品77 | 亚洲精品一区二区三区在线观看 | 后入到高潮免费观看 | 国产伦精品一区二区三区 | 清朝荒淫性艳史 | 黄色网址国产 | 亚洲六月婷婷 | 青青青网| 一本之道之高码清乱码加勒比 | 清朝荒淫性艳史 | 午夜毛片 | 日韩av一区二区精品不卡 | 亚洲天堂免费av | 黑人干亚洲女人 | 乖女从小调教h尿便器小说 关秀媚三级 | 欧美激情精品久久久久久蜜臀 | 天天操天天艹 | 999久久久无码国产精品 | 三个少妇的按摩69xx | 超薄肉色丝袜一二三 | 91狠狠狠狠狠狠狠狠 | 久久精品三级 | 国产做爰xxxⅹ高潮69 | 亚洲精品av中文字幕在线 | eeuss鲁片一区二区三区在线观看 | 黄色大片在线看 | 国产精品久久久久久久久久大牛 | 2020国产成人精品视频 | 午夜免费网站 | 在线观看特色大片免费网站 | 91丨九色丨国产在线观看 | 国产一区在线看 | 在线超碰91 | 欧美日韩国产片 | 日本一级视频 | av美国| 91av免费看 | 视频在线观看一区 | 无码人妻丰满熟妇区毛片 | 黄色视屏在线免费观看 | 手机看片1024国产 | 精品久久久一二三区播放播放播放视频 | 成人软件在线观看 | 国产放荡av国产精品 | 久久久久久久性 | 天堂av2020| 国产在线播放网站 | 在线成人毛片 | 永久天堂网 av手机版 | 天天色天天射天天干 | 丰满肥臀噗嗤啊x99av | 亚洲欧洲自拍偷拍 | 国产99色| 国产日韩欧美在线 | 精品一区中文字幕 | 欧美cccc极品丰满hd | 婷婷综合久久狠狠色99h | 国产乱子伦精品无码码专区 | 可以看污的网站 | 超碰神马 | 国产精品无码一区二区三区在 | 黄色免费网站观看 | 91区人人爽人人都喜欢人人都有 | 亚洲欧美偷拍另类a∨色屁股 | 国色天香亚欧乱码 | 亡は夫の上司中文字幕 | 欧美二级片| 米奇777四色精品人人爽 | 91丨九色丨尤物 | 亚洲精品9999久久久久 | 五月天天丁香婷婷在线中 | 肉嫁高柳家在线看 | 午夜精品一区二区三区免费 | 日韩成人免费在线 | 性视频黄色 | 日韩123区| 成人午夜网站 | 永久av在线免费观看 | 亚洲二三区 | 亚洲欧美日韩视频一区 | 总裁各种姿势顶弄呻吟h1v1 | 免费一级淫片红桃视频 | 亚洲欧洲一区二区在线观看 | 就去干成人网 | 国产做受高潮 | 亚洲天堂在线观看视频 | 青青操免费 | 福利国产视频 | 99热99精品| 唯美欧美亚洲 | 国产最爽的乱淫视频媛 | 熟妇人妻系列av无码一区二区 | 中文字幕日韩一级 | 国产免费人人看 | 超碰在线公开 | 国产免费一区二区三区在线能观看 | 高h av| 毛片9| 成人午夜免费福利视频 | 亚洲国产精品午夜久久久 | 国产精品一区二区免费在线观看 | 3d动漫精品啪啪一区二区 | 亚洲欧美自拍偷拍 | 中文字幕丰满孑伦无码精品 | 欧美视频二区欧美影视 | 国产a级全部精品 | 国产农村乱对白刺激视频 | 一本久久综合 | 午夜爽爽久久久毛片 | 天堂中文字幕免费一区 | 一个人在线观看www软件 | 日本成人在线免费视频 | 午夜国产一区二区 | 国产免费不卡av | 国产99久久精品一区二区永久免费 | 国产精品丝袜www爽爽爽 | 中文字幕在线欧美 | 国产精品久久久久久久久久免费看 | 这里只有精品9 | 国产精品久久久久野外 | 中国内地毛片免费高清 | 超碰国产人人 | 精品久久久免费视频 | 国产猛烈尖叫高潮视频免费 | 免费av网址大全 | 私人毛片免费高清影视院 | 午夜视频久久久 | 性欧美videos另类hd | 欧美性一级片 | 日韩欧美性视频 | 午夜视频福利网站 | 91精品国产综合久久久蜜臀粉嫩 | 337p粉嫩大胆噜噜噜亚瑟影院 | 久久精品丝袜高跟鞋 | 国产成人精品日本亚洲专区61 | 91亚洲国产精品 | 一本色道久久综合亚洲二区三区 | 亚洲www久久久 | 大肉大捧一进一出好爽mba | 正在播放重口老熟女露脸 | 深夜在线免费观看 | 国产又爽又黄又刺激的视频 | 国产精品成人av片免费看最爱 | 国产乱码字幕精品高清av | 天天都色 | 深爱激情站 | 色一情一区二 | 乱亲女h秽乱长久久久 | 亚洲毛片一区二区 | 亚洲国产精品高潮呻吟久久 | 黄色国产在线播放 | 丁香激情视频 | 久久在线视频精品 | 免费在线黄色片 | 成年女人永久免费观看视频 | 国产精品久久久久久一区二区 | 日韩欧美一卡二卡 | 中国性受xxxx免费 | 久久天堂国产香蕉三区 | 国产做受高潮漫动 | av卡一卡二 | 久草在线成人 | 夜夜动漫 | 波多野结衣调教 | 麻豆毛片在线看 | 欧美在线91 | 丁香婷婷激情国产高清秒播 | 夜夜爽爽爽久久久久久魔女 | avhd101高清在线迷片麻豆 | mm131美女久久精品美女图片 | 午夜久久网站 | 色综合自拍 | 国产精品无码一区二区三区不卡 | 一本本月无码- | 国产区二区| 中国少妇裸体bbbbb | 欧美a√在线 | 国产精品久久久久久久久久久新郎 | 成人交配视频 | 久操视频在线 | 欧美性大战久久久 | 日本www视频 | 国产福利片在线观看 | 香蕉视频免费看 | 性高朝久久久久久久3小时 av片在线观看 | 亚洲va欧美va天堂v国产综合 | 水蜜桃久久夜色精品一区怎么玩 | 97人妻天天摸天天爽天天 | 伊人狠狠色j香婷婷综合 | 91福利社在线观看 | 欧美猛少妇色xxxxx | 免费无码不卡视频在线观看 | 国产在线拍揄自揄拍视频 | 一性一交一口添一摸视频 | 午夜综合 | 国产成人免费高清激情视频 | 一女被多男玩喷潮视频 | 国产精选第一页 | 22222se男人的天堂 | 精品一卡二卡三卡 | 使劲快高潮了国语对白在线 | 男人用嘴添女人下身免费视频 | 免费看毛片的网站 | 精品国产第一区二区三区的特点 | 国产一三四2021不卡 | 97国产在线| av亚洲精华国产精华精 | 亚洲爱婷婷色婷婷五月 | 九一九色国产 | 久操免费在线视频 | 天天操夜夜添 | 亚洲欧美一区二区三区久久 | 欧美激情a∨在线视频播放 欧美激情aaa | 咪咪成人网 | 亚洲一区中文 | 亚洲欧洲av综合色无码 | 国产精品久久久久久久久久久久久久久久久久 | 91porn国产成人福利论坛 | 国产精品奇米一区二区三区小说 | 欧美在线你懂的 | 亚洲精品久久夜色撩人男男小说 | 玩弄人妻少妇精品视频 | 久久国产成人午夜av影院 | 免费的很黄很污的视频 | 欧美高清一区 | 91拔萝卜视频 | 国内精品视频在线观看 | 国产日产欧美a级毛片 | 少妇私密会所按摩到高潮呻吟 | 梦乃爱华av在线播放 | 无码日韩精品一区二区免费 | 久久精品国产99久久6动漫 | 中文字幕av一区二区三区谷原希美 | 久久精品国产亚洲 | 亚洲一区二区三区日本久久九 | 亚洲va欧美va国产综合先锋 | 久久综合社区 | 极品少妇被黑人白浆直流 | www国产亚洲精品久久麻豆 | 美女高清视频免费视频 | 欧美精品一区二区三区在线 | bnb99八度免费影院 | 中文字幕人成乱码熟女香港 | 亚洲国产精品久久久久 | 免费看黄色一级片 | 亚洲精品国产品国语在线观看 | 在线成人影视 | 久久综合伊人77777麻豆 | 日本精品中文字幕 | 日本三级aaa | 日韩在线视频免费观看 | 69免费| 亚洲日韩中文字幕在线播放 | 无码视频一区二区三区 | 成人精品一区日本无码网 | 日本中文字幕免费 | 亚洲日本中文字幕乱码在线电影 | 国内精品第一页 | 岛国av不卡| 午夜激情在线观看视频 | 又硬又粗又大一区二区三区视频 | 久久久久久免费毛片精品 | 久久综合色之久久综合 | 九一九色国产 | 国产内谢 | 亚无码乱人伦一区二区 | 18禁黄久久久aaa片广濑美月 | 91久久久久久波多野高潮 | 韩国三级与黑人 | 桃子视频在线www88av | 97在线视频人妻无码 | 一区二区三区在线观看视频 | 午夜亚洲 | 午夜精品久久久久久久久久久久久 | 老女人av在线 | 极品少妇网站 | 日日摸天天摸97狠狠婷婷 | 9久久9毛片又大又硬又粗 | 女女百合高h喷汁呻吟视频 女女百合国产免费网站 | 香蕉视频在线播放 |