久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

调度系统设计精要

發布時間:2025/3/20 windows 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 调度系统设计精要 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者 | Draveness

導讀:本文作者寫這篇文章前前后后大概 2 個月的時間,全文大概 2w 字,建議收藏后閱讀或者通過電腦閱讀。

調度是一個非常廣泛的概念,很多領域都會使用調度這個術語,在計算機科學中,調度就是一種將任務(Work)分配給資源的方法。任務可能是虛擬的計算任務,例如線程、進程或者數據流,這些任務會被調度到硬件資源上執行,例如:處理器 CPU 等設備。

圖 1 - 調度系統設計精要

本文會介紹調度系統的常見場景以及設計過程中的一些關鍵問題,調度器的設計最終都會歸結到一個問題上 — 如何對資源高效的分配和調度以達到我們的目的,可能包括對資源的合理利用、最小化成本、快速匹配供給和需求。

圖 2 - 文章脈絡和內容

除了介紹調度系統設計時會遇到的常見問題之外,本文還會深入分析幾種常見的調度器的設計、演進與實現原理,包括操作系統的進程調度器,Go 語言的運行時調度器以及 Kubernetes 的工作負載調度器,幫助我們理解調度器設計的核心原理。

設計原理

調度系統其實就是調度器(Scheduler),我們在很多系統中都能見到調度器的身影,就像我們在上面說的,不止操作系統中存在調度器,編程語言、容器編排以及很多業務系統中都會存在調度系統或者調度模塊。

這些調度模塊的核心作用就是對有限的資源進行分配,以實現最大化資源的利用率或者降低系統的尾延遲,調度系統面對的就是資源的需求和供給不平衡的問題。

圖 3 - 調度器的任務和資源

我們在這一節中將從多個方面介紹調度系統設計時需要重點考慮的問題,其中包括調度系統的需求調研、調度原理以及架構設計。

1. 需求調研

在著手構建調度系統之前,首要的工作就是進行詳細的需求調研和分析,在這個過程中需要完成以下兩件事:

  • 調研調度系統的應用場景,深入研究場景中待執行的任務(Work)和能用來執行任務的資源(Resource)的特性;
  • 分析調度系統的目的,可能是成本優先、質量優先、最大化資源的利用率等,調度目的一般都是動態的,會隨著需求的變化而轉變;

應用場景

調度系統應用的場景是我們首先需要考慮的問題,對應用場景的分析至關重要,我們需要深入了解當前場景下待執行任務和能用來執行任務的資源的特點。我們需要分析待執行任務的以下特征:

  • 任務是否有截止日期,必須在某個時間點之前完成;
  • 任務是否支持搶占,搶占的具體規則是什么;
  • 任務是否包含前置的依賴條件;
  • 任務是否只能在指定的資源上運行;

而用于執行任務的資源也可能存在資源不平衡,不同資源處理任務的速度不一致的問題。

資源和任務特點的多樣性決定了調度系統的設計,我們在這里舉幾個簡單的例子幫助各位讀者理解調度系統需求分析的過程。

圖 4 - Linux 操作系統

在操作系統的進程調度器中,待調度的任務就是線程,這些任務一般只會處于正在執行或者未執行(等待或者終止)的狀態;而用于處理這些任務的 CPU 往往都是不可再分的,同一個 CPU 在同一時間只能執行一個任務,這是物理上的限制。簡單總結一下,操作系統調度器的任務和資源有以下特性:

  • 任務 —— Thread。狀態簡單:只會處于正在執行或者未被執行兩種狀態;優先級不同:待執行的任務可能有不同的優先級,在考慮優先級的情況下,需要保證不同任務的公平性;
  • 資源 —— CPU 時間。資源不可再分:同一時間只能運行一個任務;

在上述場景中,待執行的任務是操作系統調度的基本單位 —— 線程,而可分配的資源是 CPU 的時間。Go 語言的調度器與操作系統的調度器面對的是幾乎相同的場景,其中的任務是 Goroutine,可以分配的資源是在 CPU 上運行的線程。

圖 5 - 容器編排系統 Kubernetes

除了操作系統和編程語言這種較為底層的調度器之外,容器和計算任務調度在今天也很常見,Kubernetes 作為容器編排系統會負責調取集群中的容器,對它稍有了解的人都知道,Kubernetes 中調度的基本單元是 Pod,這些 Pod 會被調度到節點 Node 上執行:

  • 任務 —— Pod。優先級不同:Pod 的優先級可能不同,高優先級的系統 Pod 可以搶占低優先級 Pod 的資源;有狀態:Pod 可以分為無狀態和有狀態,有狀態的 Pod 需要依賴持久存儲卷;

  • 資源 —— Node。類型不同:不同節點上的資源類型不同,包括 CPU、GPU 和內存等,這些資源可以被拆分但是都屬于當前節點;不穩定:節點可能由于突發原因不可用,例如:無網絡連接、磁盤損壞等;

調度系統在生活和工作中都很常見,除了上述的兩個場景之外,其他需要調度系統的場景包括 CDN 的資源調度、訂單調度以及離線任務調度系統等。在不同場景中,我們都需要深入思考任務和資源的特性,它們對系統的設計起者指導作用。

調度目的

在深入分析調度場景后,我們需要理解調度的目的。我們可以將調度目的理解成機器學習中的成本函數(Cost function),確定調度目的就是確定成本函數的定義,調度理論一書中曾經介紹過常見的調度目的,包含以下內容:

  • 完成跨度(Makesapan) — 第一個到最后一個任務完成調度的時間跨度;
  • 最大延遲(Maximum Lateness) — 超過截止時間最長的任務;
  • 加權完成時間的和(Total weighted completion time)— 權重乘完成時間的總和;

這些都是偏理論的調度的目的,多數業務調度系統的調度目的都是優化與業務聯系緊密的指標 — 成本和質量。如何在成本和質量之間達到平衡是需要仔細思考和設計的,由于篇幅所限以及業務場景的復雜,本文不會分析如何權衡成本和質量,這往往都是需要結合業務考慮的事情,不具有足夠的相似性。

2. 調度原理

性能優異的調度器是實現特定調度目的前提,我們在討論調度場景和目的時往往都會忽略調度的額外開銷,然而調度器執行時的延時和吞吐量等指標在調度負載較重時是不可忽視的。本節會分析與調度器實現相關的一些重要概念,這些概念能夠幫助我們實現高性能的調度器:

  • 協作式調度與搶占式調度;
  • 單調度器與多調度器;
  • 任務分享與任務竊取;

協作式與搶占式

協作式(Cooperative)與搶占式(Preemptive)調度是操作系統中常見的多任務運行策略。這兩種調度方法的定義完全不同:

  • 協作式調度允許任務執行任意長的時間,直到任務主動通知調度器讓出資源;
  • 搶占式調度允許任務在執行過程中被調度器掛起,調度器會重新決定下一個運行的任務;

圖 6 - 協作式調度與搶占式調度

任務的執行時間和任務上下文切換的額外開銷決定了哪種調度方式會帶來更好的性能。如下圖所示,圖 7 展示了一個協作式調度器調度任務的過程,調度器一旦為某個任務分配了資源,它就會等待該任務主動釋放資源,圖中 4 個任務盡管執行時間不同,但是它們都會在任務執行完成后釋放資源,整個過程也只需要 4 次上下文的切換。

圖 7 - 協作式調度

圖 8 展示了搶占式調度的過程,由于調度器不知道所有任務的執行時間,所以它為每一個任務分配了一段時間切片。任務 1 和任務 4 由于執行時間較短,所以在第一次被調度時就完成了任務;但是任務 2 和任務 3 因為執行時間較長,超過了調度器分配的上限,所以為了保證公平性會觸發搶占,等待隊列中的其他任務會獲得資源。在整個調度過程中,一共發生了 6 次上下文切換。

圖 8 - 搶占式調度

如果部分任務的執行時間很長,協作式的任務調度會使部分執行時間長的任務餓死其他任務;不過如果待執行的任務執行時間較短并且幾乎相同,那么使用協作式的任務調度能減少任務中斷帶來的額外開銷,從而帶來更好的調度性能。

因為多數情況下任務執行的時間都不確定,在協作式調度中一旦任務沒有主動讓出資源,那么就會導致其它任務等待和阻塞,所以調度系統一般都會以搶占式的任務調度為主,同時支持任務的協作式調度。

單調度器與多調度器

使用單個調度器還是多個調度器也是設計調度系統時需要仔細考慮的,多個調度器并不一定意味著多個進程,也有可能是一個進程中的多個調度線程,它們既可以選擇在多核上并行調度、在單核上并發調度,也可以同時利用并行和并發提高性能。

圖 9 - 單調度器調度任務和資源

不過對于調度系統來說,因為它做出的決策會改變資源的狀態和系統的上下文進而影響后續的調度決策,所以單調度器的串行調度是能夠精準調度資源的唯一方法。單個調度器利用不同渠道收集調度需要的上下文,并在收到調度請求后會根據任務和資源情況做出當下最優的決策。

隨著調度器的不斷演變,單調度器的性能和吞吐量可能會受到限制,我們還是需要引入并行或者并發調度來解決性能上的瓶頸,這時我們需要將待調度的資源分區,讓多個調度器分別負責調度不同區域中的資源。

圖 10 - 多調度器與資源分區

多調度器的并發調度能夠極大提升調度器的整體性能,例如 Go 語言的調度器。Go 語言運行時會將多個 CPU 交給不同的處理器分別調度,這樣通過并行調度能夠提升調度器的性能。

上面介紹的兩種調度方法都建立在需要精準調度的前提下,多調度器中的每一個調度器都會面對無關的資源,所以對于同一個分區的資源,調度還是串行的。

圖 11 - 多調度器粗粒度調度

使用多個調度器同時調度多個資源也是可行的,只是可能需要犧牲調度的精確性 — 不同的調度器可能會在不同時間接收到狀態的更新,這就會導致不同調度器做出不同的決策。負載均衡就可以看做是多線程和多進程的調度器,因為對任務和資源掌控的信息有限,這種粗粒度調度的結果很可能就是不同機器的負載會有較大差異,所以無論是小規模集群還是大規模集群都很有可能導致某些實例的負載過高。

工作分享與工作竊取

這一小節將繼續介紹在多個調度器間重新分配任務的兩個調度范式 — 工作分享(Work Sharing)和工作竊取(Work Stealing)。獨立的調度器可以同時處理所有的任務和資源,所以它不會遇到多調度器的任務和資源的不平衡問題。在多數的調度場景中,任務的執行時間都是不確定的,假設多個調度器分別調度相同的資源,由于任務的執行時間不確定,多個調度器中等待調度的任務隊列最終會發生差異 — 部分隊列中包含大量任務,而另外一些隊列不包含任務,這時就需要引入任務再分配策略。

工作分享和工作竊取是完全不同的兩種再分配策略。在工作分享中,當調度器創建了新任務時,它會將一部分任務分給其他調度器;而在工作竊取中,當調度器的資源沒有被充分利用時,它會從其他調度器中竊取一些待分配的任務,如下圖所示:

圖 12 - 工作竊取調度器

這兩種任務再分配的策略都為系統增加了額外的開銷,與工作分享相比,工作竊取只會在當前調度器的資源沒有被充分利用時才會觸發,所以工作竊取引入的額外開銷更小。工作竊取在生產環境中更加常用,Linux 操作系統和 Go 語言都選擇了工作竊取策略。

3. 架構設計

本節將從調度器內部和外部兩個角度分析調度器的架構設計,前者分析調度器內部多個組件的關系和做出調度決策的過程;后者分析多個調度器應該如何協作,是否有其他的外部服務可以輔助調度器做出更合理的調度決策。

調度器內部

當調度器收到待調度任務時,會根據采集到的狀態和待調度任務的規格(Spec)做出合理的調度決策,我們可以從下圖中了解常見調度系統的內部邏輯。

圖 13 - 調度器做出調度決策

常見的調度器一般由兩部分組成 — 用于收集狀態的狀態模塊和負責做決策的決策模塊。

  • 狀態模塊

狀態模塊會從不同途徑收集盡可能多的信息為調度提供豐富的上下文,其中可能包括資源的屬性、利用率和可用性等信息。根據場景的不同,上下文可能需要存儲在 MySQL 等持久存儲中,一般也會在內存中緩存一份以減少調度器訪問上下文的開銷。

  • 決策模塊

決策模塊會根據狀態模塊收集的上下文和任務的規格做出調度決策,需要注意的是做出的調度決策只是在當下有效,在未來某個時間點,狀態的改變可能會導致之前做的決策不符合任務的需求,例如:當我們使用 Kubernetes 調度器將工作負載調度到某些節點上,這些節點可能由于網絡問題突然不可用,該節點上的工作負載也就不能正常工作,即調度決策失效。

調度器在調度時都會通過以下的三個步驟為任務調度合適的資源:

  • 通過優先級、任務創建時間等信息確定不同任務的調度順序;
  • 通過過濾和打分兩個階段為任務選擇合適的資源;
  • 不存在滿足條件的資源時,選擇犧牲的搶占對象。
  • 圖 14 - 調度框架

    上圖展示了常見調度器決策模塊執行的幾個步驟,確定優先級、對閑置資源進行打分、確定搶占資源的犧牲者,上述三個步驟中的最后一個往往都是可選的,部分調度系統不需要支持搶占式調度的功能。

    調度器外部

    如果我們將調度器看成一個整體,從調度器外部看架構設計就會得到完全不同的角度 — 如何利用外部系統增強調度器的功能。在這里我們將介紹兩種調度器外部的設計,分別是多調度器和反調度器(Descheduler)。

    • 多調度器

    串行調度與并行調度一節已經分析了多調度器的設計,我們可以將待調度的資源進行分區,讓多個調度器線程或者進程分別負責各個區域中資源的調度,充分利用多和 CPU 的并行能力。

    • 反調度器

    反調度器是一個比較有趣的概念,它能夠移除決策不再正確的調度,降低系統中的熵,讓調度器根據當前的狀態重新決策。

    圖 15 - 調度器與反調度器

    反調度器的引入使得整個調度系統變得更加健壯。調度器負責根據當前的狀態做出正確的調度決策,反調度器根據當前的狀態移除錯誤的調度決策,它們的作用看起來相反,但是目的都是為任務調度更合適的資源。

    反調度器的使用沒有那么廣泛,實際的應用場景也比較有限。作者第一次發現這個概念是在 Kubernetes 孵化的descheduler 項目中,不過因為反調度器移除調度關系可能會影響正在運行的線上服務,所以 Kubernetes 也只會在特定場景下使用。

    操作系統

    調度器是操作系統中的重要組件,操作系統中有進程調度器、網絡調度器和 I/O 調度器等組件,本節介紹的是操作系統中的進程調度器。

    有一些讀者可能會感到困惑,操作系統調度的最小單位不是線程么,為什么這里使用的是進程調度。在 Linux 操作系統中,調度器調度的不是進程也不是線程,它調度的是 task_struct 結構體,該結構體既可以表示線程,也可以表示進程,而調度器會將進程和線程都看成任務,我們在這里先說明這一問題,避免讀者感到困惑。我們會使用進程調度器這個術語,但是一定要注意 Linux 調度器中并不區分線程和進程。

    Linux incorporates process and thread scheduling by treating them as one in the same. A process can be viewed as a single thread, but a process can contain multiple threads that share some number of resources (code and/or data).

    接下來,本節會研究操作系統中調度系統的類型以及 Linux 進程調度器的演進過程。

    1. 調度系統類型

    操作系統會將進程調度器分成三種不同的類型,即長期調度器、中期調度器和短期調度器。這三種不同類型的調度器分別提供了不同的功能,我們將在這一節中依次介紹它們。

    長期調度器

    長期調度器(Long-Term Scheduler)也被稱作任務調度器(Job Scheduler),它能夠決定哪些任務會進入調度器的準備隊列。當我們嘗試執行新的程序時,長期調度器會負責授權或者延遲該程序的執行。長期調度器的作用是平衡同時正在運行的 I/O 密集型或者 CPU 密集型進程的任務數量:

    • 如果 I/O 密集型任務過多,就緒隊列中就不存在待調度的任務,短期調度器不需要執行調度,CPU 資源就會面臨閑置;
    • 如果 CPU 密集型任務過多,I/O 等待隊列中就不存在待調度的任務,I/O 設備就會面臨閑置;

    長期調度器能平衡同時正在運行的 I/O 密集型和 CPU 密集型任務,最大化的利用操作系統的 I/O 和 CPU 資源。

    中期調度器

    中期調度器會將不活躍的、低優先級的、發生大量頁錯誤的或者占用大量內存的進程從內存中移除,為其他的進程釋放資源。

    圖 16 - 中期調度器

    當正在運行的進程陷入 I/O 操作時,該進程只會占用計算資源,在這種情況下,中期調度器就會將它從內存中移除等待 I/O 操作完成后,該進程會重新加入就緒隊列并等待短期調度器的調度。

    短期調度器

    短期調度器應該是我們最熟悉的調度器,它會從就緒隊列中選出一個進程執行。進程的選擇會使用特定的調度算法,它會同時考慮進程的優先級、入隊時間等特征。因為每個進程能夠得到的執行時間有限,所以短期調度器的執行十分頻繁。

    2. 設計與演進

    本節將重點介紹 Linux 的 CPU 調度器,也就是短期調度器。Linux 的 CPU 調度器并不是從設計之初就是像今天這樣復雜的,在很長的一段時間里(v0.01 ~ v2.4),Linux 的進程調度都由幾十行的簡單函數負責,我們先了解一下不同版本調度器的歷史:

    • 初始調度器 · v0.01 ~ v2.4。由幾十行代碼實現,功能非常簡陋;同時最多處理 64 個任務;

    • 調度器 · v2.4 ~ v2.6。調度時需要遍歷全部任務當待執行的任務較多時,同一個任務兩次執行的間隔很長,會有比較嚴重的饑餓問題;

    • 調度器 · v2.6.0 ~ v2.6.22。通過引入運行隊列和優先數組實現 的時間復雜度;使用本地運行隊列替代全局運行隊列增強在對稱多處理器的擴展性;引入工作竊取保證多個運行隊列中任務的平衡;

    • 完全公平調度器 · v2.6.23 ~ 至今。引入紅黑樹和運行時間保證調度的公平性;引入調度類實現不同任務類型的不同調度策略;

    這里會詳細介紹從最初的調度器到今天復雜的完全公平調度器(Completely Fair Scheduler,CFS)的演變過程。

    初始調度器

    Linux 最初的進程調度器僅由 sched.h 和 sched.c 兩個文件構成。你可能很難想象 Linux 早期版本使用只有幾十行的 schedule 函數負責了操作系統進程的調度:

    void schedule(void) {int i,next,c;struct task_struct ** p;for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) {...}while (1) {c = -1;next = 0;i = NR_TASKS;p = &task[NR_TASKS];while (--i) {if (!*--p) continue;if ((*p)->state == TASK_RUNNING && (*p)->counter > c)c = (*p)->counter, next = i;}if (c) break;for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)if (*p)(*p)->counter = ((*p)->counter >> 1) + (*p)->priority;}switch_to(next); }

    無論是進程還是線程,在 Linux 中都被看做是 task_struct 結構體,所有的調度進程都存儲在上限僅為 64 的數組中,調度器能夠處理的進程上限也只有 64 個。

    圖 17 - 最初的進程調度器

    上述函數會先喚醒獲得信號的可中斷進程,然后從隊列倒序查找計數器 counter 最大的可執行進程,counter 是進程能夠占用的時間切片數量,該函數會根據時間切片的值執行不同的邏輯:

    • 如果最大的 counter 時間切片大于 0,調用匯編語言的實現的 switch_to 切換進程;
    • 如果最大的 counter 時間切片等于 0,意味著所有進程的可執行時間都為 0,那么所有進程都會獲得新的時間切片;

    Linux 操作系統的計時器會每隔 10ms 觸發一次 do_timer 將當前正在運行進程的 counter 減一,當前進程的計數器歸零時就會重新觸發調度。

    O(n)調度器

    調度器是 Linux 在 v2.4 ~ v2.6 版本使用的調度器,由于該調取器在最壞的情況下會遍歷所有的任務,所以它調度任務的時間復雜度就是 。Linux 調度算法將 CPU 時間分割成了不同的時期(Epoch),也就是每個任務能夠使用的時間切片。

    我們可以在 sched.h 和 sched.c 兩個文件中找到調度器的源代碼。與上一個版本的調度器相比, 調度器的實現復雜了很多,該調度器會在 schedule 函數中遍歷運行隊列中的所有任務并調用 goodness 函數分別計算它們的權重獲得下一個運行的進程:

    asmlinkage void schedule(void){... still_running_back:list_for_each(tmp, &runqueue_head) {p = list_entry(tmp, struct task_struct, run_list);if (can_schedule(p, this_cpu)) {int weight = goodness(p, this_cpu, prev->active_mm);if (weight > c)c = weight, next = p;}}... }

    在每個時期開始時,上述代碼都會為所有的任務計算時間切片,因為需要執行 n 次,所以調度器被稱作 調度器。在默認情況下,每個任務在一個周期都會分配到 200ms 左右的時間切片,然而這種調度和分配方式是 調度器的最大問題:

    • 每輪調度完成之后就會陷入沒有任務需要調度的情況,需要提升交互性能的場景會受到嚴重影響,例如:在桌面拖動鼠標會感覺到明顯的卡頓;
    • 每次查找權重最高的任務都需要遍歷數組中的全部任務;
    • 調度器分配的平均時間片大小為 210ms,當程序中包含 100 個進程時,同一個進程被運行兩次的間隔是 21s,這嚴重影響了操作系統的可用性.

    正是因為調度器存在了上述的問題,所以 Linux 內核在兩個版本后使用新的 調度器替換該實現。

    O(1)調度器

    調度器在 v2.6.0 到 v2.6.22 的 Linux 內核中使用了四年的時間,它能夠在常數時間內完成進程調度,你可以在sched.h 和 sched.c 中查看 調度器的源代碼。因為實現和功能復雜性的增加,調度器的代碼行數從 的 2100 行增加到 5000 行,它在調度器的基礎上進行了如下的改進:

    • 調度器支持了 時間復雜度的調度;
    • 調度器支持了對稱多處理(Symmetric multiprocessing,SMP)的擴展性;
    • 調度器優化了對稱多處理的親和性。

    數據結構

    調度器通過運行隊列 runqueue 和優先數組 prio_array 兩個重要的數據結構實現了 的時間復雜度。每一個運行隊列都持有兩個優先數組,分別存儲活躍的和過期的進程數組:

    struct runqueue {...prio_array_t *active, *expired, arrays[2];... } struct prio_array {unsignedint nr_active;unsignedlong bitmap[BITMAP_SIZE];struct list_head queue[MAX_PRIO]; };

    優先數組中的 nr_active 表示活躍的進程數,而 bitmap 和 list_head 共同組成了如下圖所示的數據結構:

    圖 18 - 優先數組

    優先數組的 bitmap 總共包含 140 位,每一位都表示對應優先級的進程是否存在。圖 17 中的優先數組包含 3 個優先級為 2 的進程和 1 個優先級為 5 的進程。每一個優先級的標志位都對應一個 list_head 數組中的鏈表。 調度器使用上述的數據結構進行如下所示的調度:

    • 調用 sched_find_first_bit 按照優先級分配 CPU 資源;
    • 調用 schedule 從鏈表頭選擇進程執行;
    • 通過 schedule 輪訓調度同一優先級的進程,該函數在每次選中待執行的進程后,將進程添加到隊列的末尾,這樣可以保證同一優先級的進程會依次執行(Round-Robin);
    • 計時器每隔 1ms 會觸發一次 scheduler_tick 函數,如果當前進程的執行時間已經耗盡,就會將其移入過期數組;
    • 當活躍隊列中不存在待運行的進程時,schedule 會交換活躍優先數組和過期優先數組;

    上述的這些規則是 調度器運行遵守的主要規則,除了上述規則之外,調度器還需要支持搶占、CPU 親和等功能,不過在這里就不展開介紹了。

    本地運行隊列

    全局的運行隊列是 調度器難以在對稱多處理器架構上擴展的主要原因。為了保證運行隊列的一致性,調度器在調度時需要獲取運行隊列的全局鎖,隨著處理器數量的增加,多個處理器在調度時會導致更多的鎖競爭,嚴重影響調度性能。 調度器通過引入本地運行隊列解決這個問題,不同的 CPU 可以通過 this_rq 獲取綁定在當前 CPU 上的運行隊列,降低了鎖的粒度和沖突的可能性。

    #define this_rq() (&__get_cpu_var(runqueues))

    圖 19 - 全局運行隊列和本地運行隊列

    多個處理器由于不再需要共享全局的運行隊列,所以增強了在對稱對處理器架構上的擴展性,當我們增加新的處理器時,只需要增加新的運行隊列,這種方式不會引入更多的鎖沖突。

    優先級和時間切片

    調度器中包含兩種不同的優先級計算方式,一種是靜態任務優先級,另一種是動態任務優先級。在默認情況下,任務的靜態任務優先級都是 0,不過我們可以通過系統調用 nice 改變任務的優先級; 調度器會獎勵 I/O 密集型任務并懲罰 CPU 密集型任務,它會通過改變任務的靜態優先級來完成優先級的動態調整,因為與用戶交互的進程時 I/O 密集型的進程,這些進程由于調度器的動態策略會提高自身的優先級,從而提升用戶體驗。

    完全公平調度器

    完全公平調度器(Completely Fair Scheduler,CFS)是 v2.6.23 版本被合入內核的調度器,也是內核的默認進程調度器,它的目的是最大化 CPU 利用率和交互的性能。Linux 內核版本 v2.6.23 中的 CFS 由以下的多個文件組成:

    • include/linux/sched.h
    • kernel/sched_stats.h
    • kernel/sched.c
    • kernel/sched_fair.c
    • kernel/sched_idletask.c
    • kernel/sched_rt.c

    通過 CFS 的名字我們就能發現,該調度器的能為不同的進程提供完全公平性。一旦某些進程受到了不公平的待遇,調度器就會運行這些進程,從而維持所有進程運行時間的公平性。這種保證公平性的方式與『水多了加面,面多了加水』有一些相似:

    • 調度器會查找運行隊列中受到最不公平待遇的進程,并為進程分配計算資源,分配的計算資源是與其他資源運行時間的差值加上最小能夠運行的時間單位;
    • 進程運行結束之后發現運行隊列中又有了其他的進程受到了最不公平的待遇,調度器又會運行新的進程;

    調度器算法不斷計算各個進程的運行時間并依次調度隊列中的受到最不公平對待的進程,保證各個進程的運行時間差不會大于最小運行的時間單位。

    數據結構

    雖然我們還是會延用運行隊列這一術語,但是 CFS 的內部已經不再使用隊列來存儲進程了,cfs_rq 是用來管理待運行進程的新結構體,該結構體會使用紅黑樹(Red-black tree)替代鏈表:

    struct cfs_rq {struct load_weight load;unsignedlong nr_running;s64 fair_clock;u64 exec_clock;s64 wait_runtime;u64 sleeper_bonus;unsignedlong wait_runtime_overruns, wait_runtime_underruns;struct rb_root tasks_timeline;struct rb_node *rb_leftmost;struct rb_node *rb_load_balance_curr;struct sched_entity *curr;struct rq *rq;struct list_head leaf_cfs_rq_list; };

    紅黑樹(Red-black tree)是平衡的二叉搜索樹,紅黑樹的增刪改查操作的最壞時間復雜度為 ,也就是樹的高度,樹中最左側的節點 rb_leftmost 運行的時間最短,也是下一個待運行的進程。

    注:在最新版本的 CFS 實現中,內核使用虛擬運行時間 vruntime 替代了等待時間,但是基本的調度原理和排序方式沒有太多變化。

    調度過程

    CFS 的調度過程還是由 schedule 函數完成的,該函數的執行過程可以分成以下幾個步驟:

    • 關閉當前 CPU 的搶占功能;
    • 如果當前 CPU 的運行隊列中不存在任務,調用 idle_balance 從其他 CPU 的運行隊列中取一部分執行;
    • 調用 pick_next_task 選擇紅黑樹中優先級最高的任務;
    • 調用 context_switch 切換運行的上下文,包括寄存器的狀態和堆棧;
    • 重新開啟當前 CPU 的搶占功能。

    CFS 的調度過程與 調度器十分類似,當前調度器與前者的區別只是增加了可選的工作竊取機制并改變了底層的數據結構。

    調度類

    CFS 中的調度類是比較有趣的概念,調度類可以決定進程的調度策略。每個調度類都包含一組負責調度的函數,調度類由如下所示的 sched_class 結構體表示:

    struct sched_class {struct sched_class *next;void (*enqueue_task) (struct rq *rq, struct task_struct *p, int wakeup);void (*dequeue_task) (struct rq *rq, struct task_struct *p, int sleep);void (*yield_task) (struct rq *rq, struct task_struct *p);void (*check_preempt_curr) (struct rq *rq, struct task_struct *p);struct task_struct * (*pick_next_task) (struct rq *rq);void (*put_prev_task) (struct rq *rq, struct task_struct *p);unsigned long (*load_balance) (struct rq *this_rq, int this_cpu,struct rq *busiest,unsigned long max_nr_move, unsigned long max_load_move,struct sched_domain *sd, enum cpu_idle_type idle,int *all_pinned, int *this_best_prio);void (*set_curr_task) (struct rq *rq);void (*task_tick) (struct rq *rq, struct task_struct *p);void (*task_new) (struct rq *rq, struct task_struct *p); };

    調度類中包含任務的初始化、入隊和出隊等函數,這里的設計與面向對象中的設計稍微有些相似。內核中包含 SCHED_NORMAL、SCHED_BATCH、SCHED_IDLE、SCHED_FIFO 和 SCHED_RR 調度類,這些不同的調度類分別實現了 sched_class 中的函數以提供不同的調度行為。

    3. 小結

    本節介紹了操作系統調度器的設計原理以及演進的歷史,從 2007 年合入 CFS 到現在已經過去了很長時間,目前的調度器也變得更加復雜,社區也在不斷改進進程調度器。

    我們可以從 Linux 調度器的演進的過程看到主流系統架構的變化,最初幾十行代碼的調度器就能完成基本的調度功能,而現在要使用幾萬行代碼來完成復雜的調度,保證系統的低延時和高吞吐量。

    由于篇幅有限,我們很難對操作系統的調度器進行面面俱到的分析,你可以在 這里 找到作者使用的 Linux 源代碼,親自動手分析不同版本的進程調度器。

    4. 延伸閱讀

    • Understanding the Linux 2.6.8.1 CPU Scheduler
    • CFS Scheduler
    • Inside the Linux 2.6 Completely Fair Scheduler
    • The Linux desktop may soon be a lot faster
    • Modular Scheduler Core and Completely Fair Scheduler
    • The Linux Scheduler: A Decade of Wasted Cores

    Go 語言

    Go 語言是誕生自 2009 年的編程語言,相信很多人對 Go 語言的印象都是語法簡單,能夠支撐高并發的服務。語法簡單是編程語言的頂層設計哲學,而語言的高并發支持依靠的是運行時的調度器,這也是本節將要研究的內容。

    對 Go 語言稍微有了解的人都知道,通信順序進程(Communicating sequential processes,CSP)影響著 Go 語言的并發模型,其中的 Goroutine 和 Channel 分別表示實體和用于通信的媒介。

    圖 20 - Go 和 Erlang 的并發模型

    『不要通過共享內存來通信,我們應該使用通信來共享內存』不只是 Go 語言鼓勵的設計哲學,更為古老的 Erlang 語言其實也遵循了同樣的設計,但是 Erlang 選擇使用了Actor 模型,我們在這里就不介紹 CSP 和 Actor 的區別和聯系的,感興趣的讀者可以在推薦閱讀和應引用中找到相關資源。

    1. 設計與演進

    今天的 Go 語言調度器有著非常優異的性能,但是如果我們回過頭重新看 Go 語言的 v0.x 版本的調度器就會發現最初的調度器非常簡陋,也無法支撐高并發的服務。整個調度器經過幾個大版本的迭代才有了今天的優異性能。

    • 單線程調度器 · 0.x - 源代碼。只包含 40 多行代碼;只能單線程調度,由 G-M 模型組成;
    • 多線程調度器 · 1.0 - 源代碼。引入了多線程調度;全局鎖導致競爭嚴重;
    • 任務竊取調度器 · 1.1 - 源代碼。引入了處理器 P,構成了目前的 G-M-P 模型;在處理器 P 的基礎上實現了基于工作竊取的調度器;在某些情況下,Goroutine 不會讓出線程造成饑餓問題;時間過長的程序暫停(Stop-the-world,STW)會導致程序無法工作;
    • 搶占式調度器 · 1.2 ~ 至今 - 源代碼。實現基于信號的真搶占式調度;垃圾回收對棧進行掃描時會觸發搶占調度;搶占的時間點不夠多,還不能覆蓋全部的邊緣情況;通過編譯器在函數調用時插入檢查指令,實現基于協作的搶占式調度;GC 和循環可能會導致 Goroutine 長時間占用資源導致程序暫停;協作的搶占式調度器 - 1.2 ~ 1.13;搶占式調度器 - 1.14 ~ 至今;
    • 非均勻存儲訪問調度器 · 提案。對運行時中的各種資源進行分區;實現非常復雜,到今天還沒有提上日程;

    除了多線程、任務竊取和搶占式調度器之外,Go 語言社區目前還有一個非均勻存儲訪問(Non-uniform memory access,NUMA)調度器的提案,將來有一天可能 Go 語言會實現這個調度器。在這一節中,我們將依次介紹不同版本調度器的實現以及未來可能會實現的調度器提案。

    單線程調度器

    Go 語言在 0.x 版本調度器中只包含表示 Goroutine 的 G 和表示線程的 M 兩種結構體,全局也只有一個線程。我們可以在 clean up scheduler 提交中找到單線程調度器的源代碼,在這時 Go 語言的 調度器 還是由 C 語言實現的,調度函數 schedule 中也只包含 40 多行代碼 :

    static void scheduler(void) {G* gp;lock(&sched);if(gosave(&m->sched)){lock(&sched);gp = m->curg;switch(gp->status){case Grunnable:case Grunning:gp->status = Grunnable;gput(gp);break;...}notewakeup(&gp->stopped);}gp = nextgandunlock();noteclear(&gp->stopped);gp->status = Grunning;m->curg = gp;g = gp;gogo(&gp->sched); }

    該函數會遵循如下所示的過程執行:

    • 獲取調度器的全局鎖;
    • 調用 gosave 保存棧寄存器和程序計數器;
    • 調用 nextgandunlock 獲取下一個線程 M 需要運行的 Goroutine 并解鎖調度器;
    • 修改全局線程 m 上要執行的 Goroutine;
    • 調用 gogo 函數運行最新的 Goroutine。

    這個單線程調度器的唯一優點就是能跑,不過從這次提交中我們能看到 G 和 M 兩個重要的數據結構,它建立了 Go 語言調度器的框架。

    多線程調度器

    Go 語言 1.0 版本在正式發布時就支持了多線程的調度器,與上一個版本完全不可用的調度器相比,Go 語言團隊在這一階段完成了從不可用到可用。我們可以在 proc.c 中找到 1.0.1 版本的調度器,多線程版本的調度函數 schedule 包含 70 多行代碼,我們在這里保留了其中的核心邏輯:

    static void schedule(G *gp) {schedlock();if(gp != nil) {gp->m = nil;uint32 v = runtime·xadd(&runtime·sched.atomic, -1<<mcpuShift);if(atomic_mcpu(v) > maxgomaxprocs)runtime·throw("negative mcpu in scheduler");switch(gp->status){case Grunning:gp->status = Grunnable;gput(gp);break;case ...:}} else {...}gp = nextgandunlock();gp->status = Grunning;m->curg = gp;gp->m = m;runtime·gogo(&gp->sched, 0); }

    整體的邏輯與單線程調度器沒有太多區別,多線程調度器引入了 GOMAXPROCS 變量幫助我們控制程序中的最大線程數,這樣我們的程序中就可能同時存在多個活躍線程。

    多線程調度器的主要問題是調度時的鎖競爭,Scalable Go Scheduler Design Doc 中對調度器做的性能測試發現 14% 的時間都花費在 runtime.futex 函數上,目前的調度器實現有以下問題需要解決:

    • 全局唯一的調度器和全局鎖,所有的調度狀態都是中心化存儲的,帶來了鎖競爭;
    • 線程需要經常互相傳遞可運行的 Goroutine,引入了大量的延遲和額外開銷;
    • 每個線程都需要處理內存緩存,導致大量的內存占用并影響數據局部性(Data locality);
    • 系統調用頻繁阻塞和解除阻塞正在運行的線程,增加了額外開銷。

    這里的全局鎖問題和 Linux 操作系統調度器在早期遇到的問題比較相似,解決方案也都大同小異。

    任務竊取調度器

    2012 年 Google 的工程師 Dmitry Vyukov 在 Scalable Go Scheduler Design Doc 中指出了現有多線程調度器的問題并在多線程調度器上提出了兩個改進的手段:

    • 在當前的 G-M 模型中引入了處理器 P;
    • 在處理器 P 的基礎上實現基于工作竊取的調度器。

    基于任務竊取的 Go 語言調度器使用了沿用至今的 G-M-P 模型,我們能在 runtime: improved scheduler 提交中找到任務竊取調度器剛被實現時的源代碼,調度器的 schedule 函數到現在反而更簡單了:

    static void schedule(void) {G *gp;top:if(runtime·gcwaiting) {gcstopm();goto top;}gp = runqget(m->p);if(gp == nil)gp = findrunnable();...execute(gp); }
    • 如果當前運行時在等待垃圾回收,調用 gcstopm 函數;
    • 調用 runqget 和 findrunnable 從本地的或者全局的運行隊列中獲取待執行的 Goroutine;
    • 調用 execute 函數在當前線程 M 上運行 Goroutine。

    當前處理器本地的運行隊列中不包含 Goroutine 時,調用 findrunnable 函數會觸發工作竊取,從其他的處理器的隊列中隨機獲取一些 Goroutine。

    運行時 G-M-P 模型中引入的處理器 P 是線程 M 和 Goroutine 之間的中間層,我們從它的結構體中就能看到 P 與 M 和 G 的關系:

    struct P {Lock;uint32 status; // one of Pidle/Prunning/...P* link;uint32 tick; // incremented on every scheduler or system callM* m; // back-link to associated M (nil if idle)MCache* mcache;G** runq;int32 runqhead;int32 runqtail;int32 runqsize;G* gfree;int32 gfreecnt; };

    處理器 P 持有一個運行隊列 runq,這是由可運行的 Goroutine 組成的數組,它還反向持有一個線程 M 的指針。調度器在調度時會從處理器的隊列中選擇隊列頭的 Goroutine 放到線程 M 上執行。如下所示的圖片展示了 Go 語言中的線程 M、處理器 P 和 Goroutine 的關系。

    圖 21 - G-M-P 模型

    基于工作竊取的多線程調度器將每一個線程綁定到了獨立的 CPU 上并通過不同處理器分別管理,不同處理器中通過工作竊取對任務進行再分配,提升了調度器和 Go 語言程序的整體性能,今天所有的 Go 語言服務的高性能都受益于這一改動。

    搶占式調度器

    對 Go 語言并發模型的修改提升了調度器的性能,但是在 1.1 版本中的調度器仍然不支持搶占式調度,程序只能依靠 Goroutine 主動讓出 CPU 資源。Go 語言的調度器在1.2 版本中引入了基于協作的搶占式調度解決下面的問題:

    • 單獨的 Goroutine 可以一直占用線程運行,不會切換到其他的 Goroutine,造成饑餓問題;
    • 垃圾回收需要暫停整個程序(Stop-the-world,STW),如果沒有搶占可能需要等待幾分鐘的時間,導致整個程序無法工作。

    然而 1.2 版本中實現的搶占式調度是基于協作的,在很長的一段時間里 Go 語言的調度器都包含一些無法被搶占的邊緣情況,直到 1.14 才實現了基于信號的真搶占式調度解決部分問題。

    基于協作的搶占式調度

    我們可以在 proc.c 文件中找到引入搶占式調度后的調度器實現。Go 語言會在當前的分段棧機制上實現搶占式的調度,所有的 Goroutine 在函數調用時都有機會進入運行時檢查是否需要執行搶占。基于協作的搶占是通過以下的多個提交實現的:

    • runtime: mark runtime.goexit as nosplit
    • runtime: add stackguard0 to G。為 Goroutine 引入 stackguard0 字段,當該字段被設置成 StackPreempt 時,Goroutine 會被搶占;
    • runtime: introduce preemption function (not used for now)。引入搶占函數 preemptone 和 preemptall,這兩個函數會設置 Goroutine 的 StackPreempt;引入搶占請求 StackPreempt;
    • runtime: preempt goroutines for GC。在垃圾回收調用的 runtime·stoptheworld 中調用 preemptall 函數設置所有處理器上 Goroutine 的 StackPreempt;在 runtime·newstack 函數中增加搶占的代碼,當 stackguard0 等于 StackPreempt 時觸發調度器的搶占;
    • runtime: preempt long-running goroutines。在系統監控中,如果一個 Goroutine 的運行時間超過 10ms,就會調用 retake 和 preemptone;
    • runtime: more reliable preemption。修復 Goroutine 因為周期性執行非阻塞的 CGO 或者系統調用不會被搶占的問題。

    從上述一系列的提交中,我們會發現 Go 語言運行時會在垃圾回收暫停程序、系統監控發現 Goroutine 運行超過 10ms 時提出搶占請求 StackPreempt;因為編譯器會在函數調用中插入 runtime.newstack,所以函數調用時會通過 runtime.newstack 檢查 Goroutine 的 stackguard0 是否為 StackPreempt 進而觸發搶占讓出當前線程。

    這種做法沒有帶來運行時的過多額外開銷,實現也相對比較簡單,不過增加了運行時的復雜度,總體來看還是一種比較成功的實現。因為上述的搶占是通過編譯器在特定時機插入函數實現的,還是需要函數調用作為入口才能觸發搶占,所以這是一種協作式的搶占式調度。

    基于信號的搶占式調度

    協作的搶占式調度實現雖然巧妙,但是留下了很多的邊緣情況,我們能在 runtime: non-cooperative goroutine preemption 中找到一些遺留問題:

    • runtime: tight loops should be preemptible #10958
    • An empty for{} will block large slice allocation in another goroutine, even with GOMAXPROCS > 1 ? #17174
    • runtime: tight loop hangs process completely after some time #15442

    Go 語言在 1.14 版本中實現了非協作的搶占式調度,在實現的過程中我們對已有的邏輯進行重構并為 Goroutine 增加新的狀態和字段來支持搶占。Go 團隊通過下面提交的實現了這一功能,我們可以順著提交的順序理解其實現原理:

    • runtime: add general suspendG/resumeG。掛起 Goroutine 的過程是在棧掃描時完成的,我們通過 runtime.suspendG 和 runtime.resumeG 兩個函數重構棧掃描這一過程;調用 runtime.suspendG 函數時會將運行狀態的 Goroutine 的 preemptStop 標記成 true;調用 runtime.preemptPark 函數可以掛起當前 Goroutine、將其狀態更新成 _Gpreempted 并觸發調度器的重新調度,該函數能夠交出線程控制權;
    • runtime: asynchronous preemption function for x86。在 x86 架構上增加異步搶占的函數 runtime.asyncPreempt 和 runtime.asyncPreempt2;
    • runtime: use signals to preempt Gs for suspendG。支持通過向線程發送信號的方式暫停運行的 Goroutine;在 runtime.sighandler 函數中注冊了 SIGURG 信號的處理函數 runtime.doSigPreempt;runtime.preemptM 函數可以向線程發送搶占請求;
    • runtime: implement async scheduler preemption。修改 runtime.preemptone 函數的實現,加入異步搶占的邏輯。

    目前的搶占式調度也只會在垃圾回收掃描任務時觸發,我們可以梳理一下觸發搶占式調度的過程:

    • 程序啟動時,在 runtime.sighandler 函數中注冊了 SIGURG 信號的處理函數 runtime.doSigPreempt;
    • 在觸發垃圾回收的棧掃描時會調用 runtime.suspendG 函數掛起 Goroutine。將 _Grunning 狀態的 Goroutine 標記成可以被搶占,即 preemptStop 設置成 true;調用 runtime.preemptM 函數觸發搶占;
    • runtime.preemptM 函數會調用 runtime.signalM 向線程發送信號 SIGURG;
    • 操作系統會中斷正在運行的線程并執行預先注冊的信號處理函數 runtime.doSigPreempt;
    • runtime.doSigPreempt 函數會處理搶占信號,獲取當前的 SP 和 PC 寄存器并調用 runtime.sigctxt.pushCall;
    • runtime.sigctxt.pushCall 會修改寄存器并在程序回到用戶態時從 runtime.asyncPreempt 開始執行;
    • 匯編指令 runtime.asyncPreempt 會調用運行時函數 runtime.asyncPreempt2;
    • runtime.asyncPreempt2 會調用 runtime.preemptPark 函數;
    • runtime.preemptPark 會修改當前 Goroutine 的狀態到 _Gpreempted 并調用 runtime.schedule 讓當前函數陷入休眠并讓出線程,調度器會選擇其他的 Goroutine 繼續執行;

    上述 9 個步驟展示了基于信號的搶占式調度的執行過程。我們還需要討論一下該過程中信號的選擇,提案根據以下的四個原因選擇 SIGURG 作為觸發異步搶占的信號:

    • 該信號需要被調試器透傳;
    • 該信號不會被內部的 libc 庫使用并攔截;
    • 該信號可以隨意出現并且不觸發任何后果;
    • 我們需要處理多個平臺上的不同信號。

    目前的搶占式調度也沒有解決所有潛在的問題,因為 STW 和棧掃描時更可能出現問題,也是一個可以搶占的安全點(Safe-points),所以我們會在這里先加入搶占功能,在未來可能會加入更多搶占時間點。

    非均勻內存訪問調度器

    非均勻內存訪問(Non-uniform memory access,NUMA)調度器目前只是 Go 語言的提案,因為該提案過于復雜,而目前的調度器的性能已經足夠優異,所以暫時沒有實現該提案。該提案的原理就是通過拆分全局資源,讓各個處理器能夠就近獲取本地資源,減少鎖競爭并增加數據局部性。

    在目前的運行時中,線程、處理器、網絡輪訓器、運行隊列、全局內存分配器狀態、內存分配緩存和垃圾收集器都是全局的資源。運行時沒有保證本地化,也不清楚系統的拓撲結構,部分結構可以提供一定的局部性,但是從全局來看沒有這種保證。

    圖 22 - Go 語言 NUMA 調度器

    如上圖所示,堆棧、全局運行隊列和線程池會按照 NUMA 節點進行分區,網絡輪訓器和計時器會由單獨的處理器持有。這種方式雖然能夠利用局部性提高調度器的性能,但是本身的實現過于復雜,所以 Go 語言團隊還沒有著手實現這一提案。

    2. 小結

    Go 語言的調度器在最初的幾個版本中迅速迭代,但是從 1.2 版本之后調度器就沒有太多的變化,直到 1.14 版本引入了真正的搶占式調度解決了自 1.2 以來一直存在的問題。在可預見的未來,Go 語言的調度器還會進一步演進,增加搶占式調度的時間點減少存在的邊緣情況。

    本節內容選擇《Go 語言設計與實現》一書中的 Go 語言調度器實現原理,你可以點擊鏈接了解更多與 Go 語言設計與實現原理相關的內容。

    3. 延伸閱讀

    • How Erlang does scheduling
    • Analysis of the Go runtime scheduler
    • Go’s work-stealing scheduler
    • runtime: clean up async preemption loose ends
    • The Go netpoller
    • System Calls Make the World Go Round
    • Linux Syscall Reference

    Kubernetes

    Kubernetes 是生產級別的容器調度和管理系統,在過去的一段時間中,Kubernetes 迅速占領市場,成為容器編排領域的實施標準。

    圖 23 - 容器編排系統演進

    Kubernetes 是希臘語『舵手』的意思,它最開始由 Google 的幾位軟件工程師創立,深受公司內部Borg 和 Omega 項目的影響,很多設計都是從 Borg 中借鑒的,同時也對 Borg 的缺陷進行了改進,Kubernetes 目前是 Cloud Native Computing Foundation (CNCF) 的項目,也是很多公司管理分布式系統的解決方案。

    調度器是 Kubernetes 的核心組件,它的主要功能是為待運行的工作負載 Pod 綁定運行的節點 Node。與其他調度場景不同,雖然資源利用率在 Kubernetes 中也非常重要,但是這只是 Kubernetes 關注的一個因素,它需要在容器編排這個場景中支持非常多并且復雜的業務需求,除了考慮 CPU 和內存是否充足,還需要考慮其他的領域特定場景,例如:兩個服務不能占用同一臺機器的相同端口、幾個服務要運行在同一臺機器上,根據節點的類型調度資源等。

    這些復雜的業務場景和調度需求使 Kubernetes 調度器的內部設計與其他調度器完全不同,但是作為用戶應用層的調度器,我們卻能從中學到很多有用的模式和設計。接下來,本節將介紹 Kubernetes 中調度器的設計以及演變。

    1. 設計與演進

    Kubernetes 調度器的演變過程比較簡單,我們可以將它的演進過程分成以下的兩個階段:

    • 基于謂詞和優先級的調度器 · v1.0.0 ~ v1.14.0
    • 基于調度框架的調度器 · v1.15.0 ~ 至今

    Kubernetes 從 v1.0.0 版本發布到 v1.14.0,總共 15 個版本一直都在使用謂詞和優先級來管理不同的調度算法,知道 v1.15.0 開始引入調度框架(Alpha 功能)來重構現有的調度器。我們在這里將以 v1.14.0 版本的謂詞和優先級和 v1.17.0 版本的調度框架分析調度器的演進過程。

    謂詞和優先級算法

    謂詞(Predicates)和優先級(Priorities)調度器是從 Kubernetes v1.0.0 發布時就存在的模式,v1.14.0 的最后實現與最開始的設計也沒有太多區別。然而從 v1.0.0 到 v1.14.0 期間也引入了很多改進:

    • 調度器擴展 · v1.2.0 - Scheduler extension。通過調用外部調度器擴展的方式改變調度器的決策;

    • Map-Reduce 優先級算法 · v1.5.0 - MapReduce-like scheduler priority functions。為調度器的優先級算法支持 Map-Reduce 的計算方式,通過引入可并行的 Map 階段優化調度器的計算性能;

    • 調度器遷移 · v1.10.0 - Move scheduler code out of plugin directory。從 plugin/pkg/scheduler 移到 pkg/scheduler;kube-scheduler 成為對外直接提供的可執行文件;

    謂詞和優先級都是 Kubernetes 在調度系統中提供的兩個抽象,謂詞算法使用 FitPredicate 類型,而優先級算法使用 PriorityMapFunction 和 PriorityReduceFunction 兩個類型:

    type FitPredicate func(pod *v1.Pod, meta PredicateMetadata, nodeInfo *schedulernodeinfo.NodeInfo) (bool, []PredicateFailureReason, error) type PriorityMapFunction func(pod *v1.Pod, meta interface{}, nodeInfo *schedulernodeinfo.NodeInfo) (schedulerapi.HostPriority, error) type PriorityReduceFunction func(pod *v1.Pod, meta interface{}, nodeNameToInfo map[string]*schedulernodeinfo.NodeInfo, result schedulerapi.HostPriorityList) error

    因為 v1.14.0 也是作者剛開始參與 Kubernetes 開發的第一個版本,所以對當時的設計印象也非常深刻,v1.14.0 的 Kubernetes 調度器會使用 PriorityMapFunction 和 PriorityReduceFunction 這種 Map-Reduce 的方式計算所有節點的分數并從其中選擇分數最高的節點。下圖展示了,v1.14.0 版本中調度器的執行過程:

    圖 24 - 謂詞和優先級算法

    如上圖所示,我們假設調度器中存在一個謂詞算法和一個 Map-Reduce 優先級算法,當我們為一個 Pod 在 6 個節點中選擇最合適的一個時,6 個節點會先經過謂詞的篩選,圖中的謂詞算法會過濾掉一半的節點,剩余的 3 個節點經過 Map 和 Reduce 兩個過程分別得到了 5、10 和 5 分,最終調度器就會選擇分數最高的 4 號節點。

    genericScheduler.Schedule 是 Kubernetes 為 Pod 選擇節點的方法,我們省略了該方法中用于檢查邊界條件以及打點的代碼:

    func (g *genericScheduler) Schedule(pod *v1.Pod, nodeLister algorithm.NodeLister) (result ScheduleResult, err error) {nodes, err := nodeLister.List()if err != nil {return result, err}iflen(nodes) == 0 {return result, ErrNoNodesAvailable}filteredNodes, failedPredicateMap, err := g.findNodesThatFit(pod, nodes)if err != nil {return result, err}...priorityList, err := PrioritizeNodes(pod, g.nodeInfoSnapshot.NodeInfoMap, ..., g.prioritizers, filteredNodes, g.extenders)if err != nil {return result, err}host, err := g.selectHost(priorityList)return ScheduleResult{SuggestedHost: host,EvaluatedNodes: len(filteredNodes) + len(failedPredicateMap),FeasibleNodes: len(filteredNodes),}, err }
    • 從 NodeLister 中獲取當前系統中存在的全部節點;
    • 調用 genericScheduler.findNodesThatFit 方法并行執行全部的謂詞算法過濾節點。謂詞算法會根據傳入的 Pod 和 Node 對節點進行過濾,這時會過濾掉端口號沖突、資源不足的節點;調用所有調度器擴展的 Filter 方法輔助過濾;
    • 調用 PrioritizeNodes 函數為所有的節點打分。以 Pod 和 Node 作為參數并發執行同一優先級的 PriorityMapFunction;Pod 和優先級返回的 Node 到分數的映射為參數調用 PriorityReduceFunction 函數;調用所有調度器擴展的 Prioritize 方法;將所有分數按照權重相加后返回從 Node 到分數的映射;
    • 調用 genericScheduler.selectHost 方法選擇得分最高的節點。

    這就是使用謂詞和優先級算法時的調度過程,我們在這里省略了調度器的優先隊列中的排序,出現調度錯誤時的搶占以及 Pod 持久存儲卷綁定到 Node 上的過程,只保留了核心的調度邏輯。

    調度框架

    Kubernetes 調度框架是 Babak Salamat 和 Jonathan Basseri 2018 年提出的最新調度器設計,這個提案明確了 Kubernetes 中的各個調度階段,提供了設計良好的基于插件的接口。調度框架認為 Kubernetes 中目前存在調度(Scheduling)和綁定(Binding)兩個循環:

    • 調度循環在多個 Node 中為 Pod 選擇最合適的 Node;
    • 綁定循環將調度決策應用到集群中,包括綁定 Pod 和 Node、綁定持久存儲等工作。

    除了兩個大循環之外,調度框架中還包含 QueueSort、PreFilter、Filter、PostFilter、Score、Reserve、Permit、PreBind、Bind、PostBind 和 Unreserve 11 個擴展點(Extension Point),這些擴展點會在調度的過程中觸發,它們的運行順序如下:

    圖 25 - Kubernetes 調度框架

    我們可以將調度器中的 Scheduler.scheduleOne 方法作為入口分析基于調度框架的調度器實現,每次調用該方法都會完成一遍為 Pod 調度節點的全部流程,我們將該函數的執行過程分成調度和綁定兩個階段,首先是調度器的調度階段:

    func (sched *Scheduler) scheduleOne(ctx context.Context) {fwk := sched.FrameworkpodInfo := sched.NextPod()pod := podInfo.Podstate := framework.NewCycleState()scheduleResult, _ := sched.Algorithm.Schedule(schedulingCycleCtx, state, pod)assumedPod := podInfo.DeepCopy().PodallBound, _ := sched.VolumeBinder.Binder.AssumePodVolumes(assumedPod, scheduleResult.SuggestedHost)if err != nil {return}if sts := fwk.RunReservePlugins(schedulingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost); !sts.IsSuccess() {return}if err := sched.assume(assumedPod, scheduleResult.SuggestedHost); err != nil {fwk.RunUnreservePlugins(schedulingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)return}... }
    • 調用內部優先隊列的 MakeNextPodFunc 返回的函數從隊列中獲取下一個等待調度的 Pod,用于維護等待 Pod 的隊列會執行 QueueSort 插件;
    • 調用 genericScheduler.Schedule 函數選擇節點,該過程會執行 PreFilter、Filter、PostFilter、Score 四個擴展點的插件;
    • 調用 framework.RunReservePlugins 函數運行 Reserve 插件用于保留資源并進入綁定階段(綁定階段運行時間較長,避免資源被搶占)。如果運行失敗執行,調用 framework.RunUnreservePlugins 函數運行 Unreserve 插件。

    因為每一次調度決策都會改變上下文,所以該階段 Kubernetes 需要串行執行。而綁定階段就是實現調度的過程了,我們會創建一個新的 Goroutine 并行執行綁定循環:

    func (sched *Scheduler) scheduleOne(ctx context.Context) {...gofunc() {bindingCycleCtx, cancel := context.WithCancel(ctx)defer cancel()fwk.RunPermitPlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)if !allBound {sched.bindVolumes(assumedPod)}fwk.RunPreBindPlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)if err := sched.bind(bindingCycleCtx, assumedPod, scheduleResult.SuggestedHost, state); err != nil {fwk.RunUnreservePlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)} else {fwk.RunPostBindPlugins(bindingCycleCtx, state, assumedPod, scheduleResult.SuggestedHost)}}() }
    • 啟動一個 Goroutine 并調用 framework.RunPermitPlugin 異步運行 Permit 插件,這個階段可以用來實現批調度器;
    • 調用 Scheduler.bindVolumes 將卷先綁定到 Node 上;
    • 調用 Scheduler.bind 函數將 Pod 綁定到 Node 上完成調度,綁定的過程會執行 PreBind、Bind 和 PostBind 三個擴展點的插件。

    目前的調度框架在 Kubernetes v1.17.0 版本中還是 Alpha 階段,很多功能還不明確,為了支持更多、更豐富的場景,在接下來的幾個版本還可能會做出很多改進,不過調度框架在很長的一段時間中都會是調度器的核心。

    2. 小結

    本節介紹了 Kubernetes 調度器從 v1.0.0 到最新版本中的不同設計,Kubernetes 調度器中總共存在兩種不同的設計,一種是基于謂詞和優先級算法的調度器,另一種是基于調度框架的調度器。

    很多的業務調度器也需要從多個選項中選出最優的選擇,無論是成本最低還是質量最優,我們可以考慮將調度的過程分成過濾和打分兩個階段為調度器建立合適的抽象,過濾階段會按照需求過濾掉不滿足需求的選項,打分階段可能會按照質量、成本和權重對多個選項進行排序,遵循這種設計思路可以解決很多類似問題。

    目前的 Kubernetes 已經通過調度框架詳細地支持了多個階段的擴展方法,幾乎是調度器內部實現的最終形態了。不過隨著調度器功能的逐漸復雜,未來可能還會遇到更復雜的調度場景,例如:多租戶的調度資源隔離、多調度器等功能,而 Kubernetes 社區也一直都在為構建高性能的調度器而努力。

    3. 延伸閱讀

    • Scheduling Framework #624
    • Create a custom Kubernetes scheduler
    • Scheduler extender Document

    總結

    從操作系統、編程語言到應用程序,我們在這篇文章中分析了 Linux、Go 語言和 Kubernetes 調度器的設計與實現原理,這三個不同的調度器其實有相互依賴的關系:

    圖 26 - 三層調度器

    如上圖所示,Kubernetes 的調度器依賴于 Go 語言的運行時調度器,而 Go 語言的運行時調度器也依賴于 Linux 的進程調度器,從上到下離用戶越來越遠,從下到上越來越關注具體業務。我們在最后通過兩個比較分析一下這幾個調度器的異同:

    • Linux 進程調度器與 Go 語言調度器;
    • 系統級調度器(Linux 和 Go)與業務調度器(Kubernetes)。

    這是兩種不同層面的比較,相信通過不同角度的比較能夠讓我們對調度器的設計有更深入的認識。

    1. Linux 和 Go

    首先是 Linux 和 Go 語言調度器,這兩個調度器的場景都非常相似,它們最終都是要充分利用機器上的 CPU 資源,所以在實現和演進上有很多相似之處:

    • 調度器的初始版本都非常簡單,甚至很簡陋,只能支持協作式的調度;
    • 按照運行隊列進行分區,通過工作竊取的方式平衡不同 CPU 或者線程上的運行隊列;
    • 最終都通過某些方式實現了基于信號的搶占式調度,不過 Go 語言的實現并不完善。

    因為場景非常相似,所以它們的目的也非常相似,只是它們調度的任務粒度會有不同,Linux 進程調度器的最小調度單位是線程,而 Go 語言是 Goroutine,與 Linux 進程調度器相比,Go 語言在用戶層建立新的模型,實現了另一個調度器,為使用者提供輕量級的調度單位來增強程序的性能,但是它也引入了很多組件來處理系統調用、網絡輪訓等線程相關的操作,同時組合多個不同粒度的任務導致實現相對復雜。

    Linux 調度器的最終設計引入了調度類的概念,讓不同任務的類型分別享受不同的調度策略以此來調和低延時和實時性這個在調度上兩難的問題。

    Go 語言的調度器目前剛剛引入了基于信號的搶占式調度,還有很多功能都不完善。除了搶占式調度之外,復雜的 NUMA 調度器提案也可能是未來 Go 語言的發展方向。

    2. 系統和業務

    如果我們將系統調度器和業務調度器進行對比的話,你會發現兩者在設計差別非常大,畢竟它們處于系統的不同層級。系統調度器考慮的是極致的性能,所以它通過分區的方式將運行隊列等資源分離,通過降低鎖的粒度來降低系統的延遲;而業務調度器關注的是完善的調度功能,調度的性能雖然十分重要,但是一定要建立在滿足特定調度需求之上,而因為業務上的調度需求往往都是比較復雜,所以只能做出權衡和取舍。

    正是因為需求的不同,我們會發現不同調度器的演進過程也完全不同。系統調度器都會先充分利用資源,降低系統延時,隨后在性能無法優化時才考慮加入調度類等功能滿足不同場景下的調度,而 Kubernetes 調度器更關注內部不同調度算法的組織,如何同時維護多個復雜的調度算法,當設計了良好的抽象之后,它才會考慮更加復雜的多調度器、多租戶等場景。

    3. 最后

    這種研究歷史變化帶來的快樂是很不同的,當我們發現代碼發生變化的原因時也會感到欣喜,這讓我們站在今天重新見證了歷史上的決策,本文中的相應章節已經包含了對應源代碼的鏈接,各位讀者可以自行閱讀相應內容,也衷心希望各位讀者能夠有所收獲。

    延伸閱讀

    • Cooperative vs. Preemptive: a quest to maximize concurrency power
    • Randomized Work Stealing versus Sharing in Large-scale Systems with Non-exponential Job Sizes
    • Scalable work stealing

    “阿里巴巴云原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦云原生流行技術趨勢、云原生大規模的落地實踐,做最懂云原生開發者的技術圈。”

    總結

    以上是生活随笔為你收集整理的调度系统设计精要的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久亚洲中文字幕精品一区 | 55夜色66夜色国产精品视频 | 熟妇人妻无码xxx视频 | 国产成人精品久久亚洲高清不卡 | 国产精品鲁鲁鲁 | 激情内射日本一区二区三区 | 四虎影视成人永久免费观看视频 | 精品 日韩 国产 欧美 视频 | 久久综合网欧美色妞网 | 国产精品久久精品三级 | 国产两女互慰高潮视频在线观看 | 无码国产乱人伦偷精品视频 | 一本色道久久综合亚洲精品不卡 | 无人区乱码一区二区三区 | 波多野结衣av一区二区全免费观看 | 亚洲欧洲中文日韩av乱码 | 国产亚洲日韩欧美另类第八页 | 人妻天天爽夜夜爽一区二区 | 国产亚洲精品久久久久久国模美 | 国产女主播喷水视频在线观看 | 欧美日韩人成综合在线播放 | 无码av最新清无码专区吞精 | 丰满少妇女裸体bbw | 国精产品一区二区三区 | 97资源共享在线视频 | 日本xxxx色视频在线观看免费 | 日韩少妇内射免费播放 | 国产99久久精品一区二区 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 乱码av麻豆丝袜熟女系列 | 欧洲极品少妇 | 国产激情无码一区二区app | 日日夜夜撸啊撸 | 国産精品久久久久久久 | 18精品久久久无码午夜福利 | 久久综合久久自在自线精品自 | 纯爱无遮挡h肉动漫在线播放 | 婷婷五月综合缴情在线视频 | 牲交欧美兽交欧美 | 任你躁在线精品免费 | 亚洲综合精品香蕉久久网 | 老头边吃奶边弄进去呻吟 | 麻豆精产国品 | 亚洲欧美国产精品专区久久 | 亚洲综合色区中文字幕 | 日本高清一区免费中文视频 | 日本精品人妻无码免费大全 | 成人一在线视频日韩国产 | 日本熟妇乱子伦xxxx | 国产热a欧美热a在线视频 | 男女猛烈xx00免费视频试看 | 精品无码一区二区三区爱欲 | 久久熟妇人妻午夜寂寞影院 | 正在播放东北夫妻内射 | 国产xxx69麻豆国语对白 | 色妞www精品免费视频 | 色一情一乱一伦 | 麻豆国产人妻欲求不满谁演的 | 亚洲精品国偷拍自产在线观看蜜桃 | 5858s亚洲色大成网站www | 人妻少妇精品视频专区 | av香港经典三级级 在线 | 最新版天堂资源中文官网 | 久久精品国产一区二区三区 | 免费无码的av片在线观看 | 婷婷丁香六月激情综合啪 | 性欧美熟妇videofreesex | 欧美人与动性行为视频 | 日韩精品无码一本二本三本色 | 无码av中文字幕免费放 | 免费无码午夜福利片69 | 亚洲精品午夜无码电影网 | 大屁股大乳丰满人妻 | 2019午夜福利不卡片在线 | 亚洲国产成人a精品不卡在线 | 无码av免费一区二区三区试看 | 野狼第一精品社区 | 无码国产激情在线观看 | av人摸人人人澡人人超碰下载 | 日韩av无码中文无码电影 | 九九久久精品国产免费看小说 | 国产成人无码专区 | 牲欲强的熟妇农村老妇女 | 成人精品视频一区二区三区尤物 | 真人与拘做受免费视频 | 国产熟妇另类久久久久 | 欧美日韩一区二区三区自拍 | 精品国产一区av天美传媒 | 日本一区二区三区免费播放 | 亚洲日韩一区二区三区 | 特级做a爰片毛片免费69 | 男女猛烈xx00免费视频试看 | 日日麻批免费40分钟无码 | 日韩精品久久久肉伦网站 | 日韩欧美成人免费观看 | 中文字幕久久久久人妻 | 中文字幕亚洲情99在线 | 国产无av码在线观看 | 老司机亚洲精品影院无码 | 国产精品丝袜黑色高跟鞋 | 久久国产精品偷任你爽任你 | 精品成在人线av无码免费看 | 中国大陆精品视频xxxx | 国内少妇偷人精品视频 | 欧美老熟妇乱xxxxx | 亚洲一区二区三区偷拍女厕 | 国产色精品久久人妻 | 天堂无码人妻精品一区二区三区 | 国产三级久久久精品麻豆三级 | 黑人玩弄人妻中文在线 | 欧美人与动性行为视频 | 久久这里只有精品视频9 | 国产亚洲精品久久久久久国模美 | 国产成人无码专区 | 国产av久久久久精东av | 六月丁香婷婷色狠狠久久 | √天堂中文官网8在线 | 99精品国产综合久久久久五月天 | 国产成人无码区免费内射一片色欲 | 国产精品.xx视频.xxtv | 蜜桃无码一区二区三区 | 天海翼激烈高潮到腰振不止 | 老头边吃奶边弄进去呻吟 | 日韩av激情在线观看 | 久久国产劲爆∧v内射 | 九九热爱视频精品 | 精品少妇爆乳无码av无码专区 | av香港经典三级级 在线 | 久久亚洲精品成人无码 | 无码人妻av免费一区二区三区 | 无码精品人妻一区二区三区av | 国产麻豆精品精东影业av网站 | 在线成人www免费观看视频 | 久久国产精品偷任你爽任你 | 国产偷国产偷精品高清尤物 | 精品一区二区三区波多野结衣 | 国产办公室秘书无码精品99 | 性生交片免费无码看人 | 国产又爽又黄又刺激的视频 | 亚洲成a人一区二区三区 | 久久精品成人欧美大片 | 四虎国产精品一区二区 | 人人澡人人妻人人爽人人蜜桃 | 欧美阿v高清资源不卡在线播放 | 无码人妻精品一区二区三区下载 | 亚洲理论电影在线观看 | 国产香蕉尹人综合在线观看 | 亚洲第一网站男人都懂 | 亚洲 欧美 激情 小说 另类 | 亚洲成av人片天堂网无码】 | 色综合久久久无码中文字幕 | 2020久久超碰国产精品最新 | 亚洲人成人无码网www国产 | 一二三四在线观看免费视频 | 99久久精品午夜一区二区 | 高潮毛片无遮挡高清免费 | 国产精品久久精品三级 | 日韩少妇白浆无码系列 | 免费观看激色视频网站 | 鲁大师影院在线观看 | 内射欧美老妇wbb | 中文无码成人免费视频在线观看 | 亚洲男人av香蕉爽爽爽爽 | 国产成人精品久久亚洲高清不卡 | 99久久久无码国产精品免费 | 好男人社区资源 | 亚洲七七久久桃花影院 | 97夜夜澡人人双人人人喊 | 亚洲精品综合五月久久小说 | 又大又黄又粗又爽的免费视频 | 中文字幕乱码人妻二区三区 | 中文字幕av日韩精品一区二区 | 少妇高潮一区二区三区99 | 欧美日韩色另类综合 | 又粗又大又硬毛片免费看 | 国产亚洲tv在线观看 | 日本在线高清不卡免费播放 | 激情五月综合色婷婷一区二区 | 亚洲男人av天堂午夜在 | 六月丁香婷婷色狠狠久久 | 精品久久久久久人妻无码中文字幕 | 国内精品久久久久久中文字幕 | 亚洲 a v无 码免 费 成 人 a v | 精品无码国产一区二区三区av | 色综合久久久久综合一本到桃花网 | 国产 浪潮av性色四虎 | 久久精品国产大片免费观看 | 国产午夜福利100集发布 | 中文字幕 人妻熟女 | 久久国产精品_国产精品 | 国产精品99爱免费视频 | 国产成人无码一二三区视频 | 中文字幕人妻无码一夲道 | 一本加勒比波多野结衣 | 亚洲国产av精品一区二区蜜芽 | 国产乱子伦视频在线播放 | 国产在线一区二区三区四区五区 | 午夜精品久久久内射近拍高清 | 亚洲精品中文字幕乱码 | 国产偷抇久久精品a片69 | 131美女爱做视频 | 国产亚洲精品精品国产亚洲综合 | 欧美国产日产一区二区 | 欧美人与牲动交xxxx | 国产精品美女久久久网av | 超碰97人人射妻 | 欧美老人巨大xxxx做受 | 成人免费视频视频在线观看 免费 | 亚洲精品综合一区二区三区在线 | 国产片av国语在线观看 | 亚洲精品中文字幕乱码 | 国内老熟妇对白xxxxhd | 性史性农村dvd毛片 | 国产极品视觉盛宴 | 精品成在人线av无码免费看 | 成熟女人特级毛片www免费 | 性欧美熟妇videofreesex | 国产午夜无码视频在线观看 | 激情国产av做激情国产爱 | 成人免费视频视频在线观看 免费 | 国产成人精品一区二区在线小狼 | av香港经典三级级 在线 | 日本一卡二卡不卡视频查询 | 性色av无码免费一区二区三区 | 亚洲第一无码av无码专区 | 国产精品久久久久久无码 | 精品乱子伦一区二区三区 | 亚洲中文字幕va福利 | 中文字幕无码av激情不卡 | 国产精品理论片在线观看 | 久久综合激激的五月天 | 国产9 9在线 | 中文 | 国产精品99久久精品爆乳 | 青青青手机频在线观看 | 一本久久伊人热热精品中文字幕 | 十八禁真人啪啪免费网站 | 99国产欧美久久久精品 | 丰满诱人的人妻3 | 国产av一区二区三区最新精品 | 国产av无码专区亚洲awww | 国产精品久久久久影院嫩草 | 免费国产黄网站在线观看 | 亚无码乱人伦一区二区 | 一二三四社区在线中文视频 | 亚洲欧洲无卡二区视頻 | 亚洲中文字幕无码一久久区 | 岛国片人妻三上悠亚 | 午夜福利不卡在线视频 | 强辱丰满人妻hd中文字幕 | www一区二区www免费 | 国产成人无码a区在线观看视频app | 女人和拘做爰正片视频 | 久久久久久av无码免费看大片 | 久久久久久a亚洲欧洲av冫 | 欧美日韩综合一区二区三区 | 国产成人精品一区二区在线小狼 | 欧洲熟妇精品视频 | 成人片黄网站色大片免费观看 | 性欧美牲交xxxxx视频 | 又大又硬又爽免费视频 | 成在人线av无码免观看麻豆 | 久久精品国产99精品亚洲 | 亚拍精品一区二区三区探花 | 一本无码人妻在中文字幕免费 | ass日本丰满熟妇pics | 欧美日韩精品 | 偷窥日本少妇撒尿chinese | 国产精品无码一区二区桃花视频 | 欧美性猛交内射兽交老熟妇 | 夜夜高潮次次欢爽av女 | 亚洲成色在线综合网站 | 国产欧美精品一区二区三区 | 国产69精品久久久久app下载 | 国产午夜无码视频在线观看 | 蜜桃视频韩日免费播放 | av香港经典三级级 在线 | 日韩精品a片一区二区三区妖精 | 国产激情无码一区二区app | 亚洲欧美国产精品专区久久 | 国产97色在线 | 免 | 澳门永久av免费网站 | 亚洲一区二区观看播放 | 97精品人妻一区二区三区香蕉 | 噜噜噜亚洲色成人网站 | 俺去俺来也在线www色官网 | 精品一区二区三区无码免费视频 | 中文字幕人成乱码熟女app | 亚洲男人av香蕉爽爽爽爽 | 亚洲精品鲁一鲁一区二区三区 | 婷婷色婷婷开心五月四房播播 | 爱做久久久久久 | 扒开双腿疯狂进出爽爽爽视频 | 99精品久久毛片a片 | 久久亚洲国产成人精品性色 | 亚洲精品美女久久久久久久 | 又色又爽又黄的美女裸体网站 | 日韩欧美群交p片內射中文 | 国产猛烈高潮尖叫视频免费 | 丝袜 中出 制服 人妻 美腿 | 亚洲狠狠婷婷综合久久 | 极品嫩模高潮叫床 | a在线亚洲男人的天堂 | 永久黄网站色视频免费直播 | 欧美 日韩 亚洲 在线 | 国产成人综合在线女婷五月99播放 | 欧美性生交活xxxxxdddd | аⅴ资源天堂资源库在线 | 国产农村乱对白刺激视频 | 国产亚洲日韩欧美另类第八页 | 国产sm调教视频在线观看 | 99久久久国产精品无码免费 | 亚洲日本va中文字幕 | 久精品国产欧美亚洲色aⅴ大片 | 久久精品国产日本波多野结衣 | 在线视频网站www色 | 双乳奶水饱满少妇呻吟 | 亚洲精品午夜国产va久久成人 | 理论片87福利理论电影 | 欧美 日韩 亚洲 在线 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲va欧美va天堂v国产综合 | 日本乱偷人妻中文字幕 | 色五月五月丁香亚洲综合网 | 国产在线精品一区二区高清不卡 | 精品国精品国产自在久国产87 | 天天爽夜夜爽夜夜爽 | 日日碰狠狠躁久久躁蜜桃 | 狠狠色噜噜狠狠狠狠7777米奇 | 国产乱人偷精品人妻a片 | 青青久在线视频免费观看 | 日本在线高清不卡免费播放 | 久久久精品人妻久久影视 | 国语自产偷拍精品视频偷 | 欧洲精品码一区二区三区免费看 | 国产午夜视频在线观看 | 色婷婷久久一区二区三区麻豆 | 国内精品一区二区三区不卡 | 国产精品沙发午睡系列 | 国产精品18久久久久久麻辣 | 131美女爱做视频 | 日本熟妇人妻xxxxx人hd | 国语自产偷拍精品视频偷 | 亚洲最大成人网站 | 久久久精品456亚洲影院 | 亚洲爆乳大丰满无码专区 | 亚洲国产一区二区三区在线观看 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲热妇无码av在线播放 | 国产精品久久久久久亚洲影视内衣 | 漂亮人妻洗澡被公强 日日躁 | 国产精品高潮呻吟av久久4虎 | 55夜色66夜色国产精品视频 | 精品亚洲成av人在线观看 | 国产特级毛片aaaaaa高潮流水 | 久久婷婷五月综合色国产香蕉 | 国内精品人妻无码久久久影院 | 亚洲国产精品无码一区二区三区 | 国产亚洲视频中文字幕97精品 | 少妇厨房愉情理9仑片视频 | 蜜臀aⅴ国产精品久久久国产老师 | 一本久久a久久精品vr综合 | 日韩精品无码免费一区二区三区 | 亚洲色无码一区二区三区 | 国产欧美熟妇另类久久久 | 久久精品一区二区三区四区 | 十八禁视频网站在线观看 | 人妻天天爽夜夜爽一区二区 | 日韩在线不卡免费视频一区 | 综合网日日天干夜夜久久 | 日本精品少妇一区二区三区 | 亚洲欧美综合区丁香五月小说 | 欧美精品无码一区二区三区 | 久久综合色之久久综合 | 欧美激情综合亚洲一二区 | 国产办公室秘书无码精品99 | 伊在人天堂亚洲香蕉精品区 | 欧美zoozzooz性欧美 | 国内少妇偷人精品视频 | 狂野欧美性猛交免费视频 | 亚洲啪av永久无码精品放毛片 | 十八禁真人啪啪免费网站 | 任你躁在线精品免费 | 无码国产乱人伦偷精品视频 | 无码人妻丰满熟妇区毛片18 | 精品一二三区久久aaa片 | 国产人成高清在线视频99最全资源 | 熟女体下毛毛黑森林 | 欧美三级a做爰在线观看 | 欧美丰满少妇xxxx性 | 中文字幕乱码人妻二区三区 | 日本www一道久久久免费榴莲 | 熟妇人妻无乱码中文字幕 | 午夜不卡av免费 一本久久a久久精品vr综合 | 99久久无码一区人妻 | 国产一区二区不卡老阿姨 | 国产亚洲精品久久久久久久 | 妺妺窝人体色www在线小说 | 亚洲欧美日韩综合久久久 | 欧美35页视频在线观看 | 亚洲日韩av一区二区三区四区 | 午夜成人1000部免费视频 | yw尤物av无码国产在线观看 | 国产精品嫩草久久久久 | 色狠狠av一区二区三区 | 国产精品久久精品三级 | 日本大乳高潮视频在线观看 | 99视频精品全部免费免费观看 | 午夜熟女插插xx免费视频 | 亚洲无人区一区二区三区 | 亚洲综合色区中文字幕 | 天堂一区人妻无码 | 少妇无套内谢久久久久 | 亚洲精品一区二区三区在线 | 国产乱人偷精品人妻a片 | 久久五月精品中文字幕 | 狂野欧美性猛xxxx乱大交 | 国内精品一区二区三区不卡 | 狠狠噜狠狠狠狠丁香五月 | 欧美老熟妇乱xxxxx | 日韩 欧美 动漫 国产 制服 | 男女猛烈xx00免费视频试看 | 国产做国产爱免费视频 | 国产小呦泬泬99精品 | 男人的天堂av网站 | 成人片黄网站色大片免费观看 | 日本精品久久久久中文字幕 | 国产办公室秘书无码精品99 | 亚洲无人区午夜福利码高清完整版 | 国语自产偷拍精品视频偷 | 亚洲国产精华液网站w | 成年美女黄网站色大免费视频 | 亚洲精品中文字幕 | 又紧又大又爽精品一区二区 | 国产香蕉97碰碰久久人人 | 97精品人妻一区二区三区香蕉 | 日本一卡2卡3卡四卡精品网站 | 国产精品美女久久久网av | 国产精品久久国产三级国 | 婷婷丁香六月激情综合啪 | 97人妻精品一区二区三区 | 漂亮人妻洗澡被公强 日日躁 | 99精品久久毛片a片 | 人人妻人人藻人人爽欧美一区 | 狠狠cao日日穞夜夜穞av | 国产99久久精品一区二区 | 国产97色在线 | 免 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲国产av精品一区二区蜜芽 | 中文字幕人妻无码一夲道 | 特黄特色大片免费播放器图片 | 精品国精品国产自在久国产87 | 福利一区二区三区视频在线观看 | 99在线 | 亚洲 | 亚洲 另类 在线 欧美 制服 | 久久久成人毛片无码 | 久久99精品久久久久婷婷 | 亚洲综合色区中文字幕 | 少妇性l交大片欧洲热妇乱xxx | 亚洲精品国产第一综合99久久 | 精品久久综合1区2区3区激情 | 水蜜桃亚洲一二三四在线 | 日本熟妇人妻xxxxx人hd | 精品乱子伦一区二区三区 | 国产人妖乱国产精品人妖 | 四虎国产精品免费久久 | 人妻插b视频一区二区三区 | 少妇太爽了在线观看 | 久久亚洲中文字幕精品一区 | 乱人伦中文视频在线观看 | 国产国语老龄妇女a片 | 澳门永久av免费网站 | 日本精品久久久久中文字幕 | 欧美人与善在线com | www国产亚洲精品久久久日本 | 国产三级久久久精品麻豆三级 | 午夜精品一区二区三区在线观看 | 久青草影院在线观看国产 | 国产精华av午夜在线观看 | 国产一区二区不卡老阿姨 | 狠狠躁日日躁夜夜躁2020 | 亚洲中文字幕无码一久久区 | 国产精品无码一区二区三区不卡 | 亚洲精品成人av在线 | 久久综合九色综合97网 | 亚洲欧美日韩综合久久久 | 性色欲情网站iwww九文堂 | 成熟女人特级毛片www免费 | 奇米影视7777久久精品人人爽 | 亚洲一区二区三区香蕉 | 久久久精品456亚洲影院 | 精品无码一区二区三区的天堂 | 国产美女极度色诱视频www | 图片区 小说区 区 亚洲五月 | 亚洲中文字幕乱码av波多ji | 国产精品无码一区二区三区不卡 | 亚洲熟妇自偷自拍另类 | 宝宝好涨水快流出来免费视频 | 国产情侣作爱视频免费观看 | 欧美日本精品一区二区三区 | 久久人妻内射无码一区三区 | 久久久婷婷五月亚洲97号色 | 人妻插b视频一区二区三区 | 天天摸天天碰天天添 | 亚洲欧洲日本综合aⅴ在线 | 亚洲国产精品一区二区美利坚 | 国产真实乱对白精彩久久 | 精品国产aⅴ无码一区二区 | 欧美丰满老熟妇xxxxx性 | 亚洲综合无码一区二区三区 | 黑人巨大精品欧美一区二区 | 无码av免费一区二区三区试看 | 熟女体下毛毛黑森林 | 精品人妻人人做人人爽夜夜爽 | 亚洲综合久久一区二区 | 中文字幕日韩精品一区二区三区 | 波多野结衣高清一区二区三区 | 久久久久久国产精品无码下载 | 亚洲精品美女久久久久久久 | 日日摸夜夜摸狠狠摸婷婷 | 窝窝午夜理论片影院 | 波多野结衣一区二区三区av免费 | 波多野结衣一区二区三区av免费 | 欧美午夜特黄aaaaaa片 | 久久人人爽人人爽人人片ⅴ | 国产成人精品三级麻豆 | 国产无遮挡又黄又爽免费视频 | 在线精品亚洲一区二区 | 亚洲日韩中文字幕在线播放 | 精品无人国产偷自产在线 | 国产深夜福利视频在线 | 奇米影视888欧美在线观看 | 少妇人妻偷人精品无码视频 | 99国产精品白浆在线观看免费 | 日本爽爽爽爽爽爽在线观看免 | 精品无码国产自产拍在线观看蜜 | 久久久久se色偷偷亚洲精品av | 欧美阿v高清资源不卡在线播放 | 无码av免费一区二区三区试看 | 内射欧美老妇wbb | 无码人妻少妇伦在线电影 | 水蜜桃色314在线观看 | 国产另类ts人妖一区二区 | 国产人妻精品午夜福利免费 | 鲁一鲁av2019在线 | 中文字幕人妻丝袜二区 | 亚洲精品欧美二区三区中文字幕 | 国产精品久久福利网站 | 在线观看国产午夜福利片 | a在线亚洲男人的天堂 | 国产精品二区一区二区aⅴ污介绍 | 亚欧洲精品在线视频免费观看 | 一个人看的视频www在线 | 国产97色在线 | 免 | 久久婷婷五月综合色国产香蕉 | 久久综合网欧美色妞网 | 一个人看的视频www在线 | 东京热无码av男人的天堂 | 粗大的内捧猛烈进出视频 | 久久精品国产99精品亚洲 | 婷婷综合久久中文字幕蜜桃三电影 | 色综合久久久无码中文字幕 | 粉嫩少妇内射浓精videos | 国产精品国产自线拍免费软件 | 欧美真人作爱免费视频 | 亚洲精品成a人在线观看 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲午夜福利在线观看 | 日本大香伊一区二区三区 | 日韩av激情在线观看 | 国产亚洲视频中文字幕97精品 | 久久精品女人的天堂av | 一本一道久久综合久久 | 色五月丁香五月综合五月 | 精品水蜜桃久久久久久久 | 亚洲成av人综合在线观看 | 欧美精品国产综合久久 | 亚洲国产精品久久人人爱 | 久久精品国产99久久6动漫 | 宝宝好涨水快流出来免费视频 | 99精品国产综合久久久久五月天 | 亚洲国产精品美女久久久久 | 熟女体下毛毛黑森林 | 99久久无码一区人妻 | 免费看少妇作爱视频 | 99久久久无码国产aaa精品 | 天天摸天天透天天添 | 亚洲精品国偷拍自产在线麻豆 | 色一情一乱一伦一区二区三欧美 | www国产精品内射老师 | 色诱久久久久综合网ywww | 内射老妇bbwx0c0ck | 天天av天天av天天透 | 未满小14洗澡无码视频网站 | 久久99精品国产.久久久久 | 日本熟妇人妻xxxxx人hd | 成人试看120秒体验区 | 男女猛烈xx00免费视频试看 | 国产av一区二区三区最新精品 | 国产欧美精品一区二区三区 | 麻豆国产人妻欲求不满 | 玩弄人妻少妇500系列视频 | 99久久精品午夜一区二区 | 人人妻人人澡人人爽欧美精品 | 日日噜噜噜噜夜夜爽亚洲精品 | 真人与拘做受免费视频一 | 国产欧美熟妇另类久久久 | 欧美亚洲日韩国产人成在线播放 | 久久zyz资源站无码中文动漫 | 日本熟妇乱子伦xxxx | 日产精品99久久久久久 | 精品无人国产偷自产在线 | 中文字幕乱码人妻无码久久 | 日日摸天天摸爽爽狠狠97 | 国产手机在线αⅴ片无码观看 | 国产成人精品必看 | 亚洲伊人久久精品影院 | 欧美日韩综合一区二区三区 | 奇米影视7777久久精品 | 国产国语老龄妇女a片 | 国产成人久久精品流白浆 | 性开放的女人aaa片 | 国产黑色丝袜在线播放 | 成人影院yy111111在线观看 | 久久亚洲日韩精品一区二区三区 | | 久久午夜夜伦鲁鲁片无码免费 | 日韩av无码中文无码电影 | 好爽又高潮了毛片免费下载 | 狂野欧美性猛交免费视频 | 欧美性猛交内射兽交老熟妇 | 国产亚洲精品久久久久久久久动漫 | 无码午夜成人1000部免费视频 | 欧美性生交活xxxxxdddd | 亚洲色偷偷男人的天堂 | 男女性色大片免费网站 | 中文字幕无码av波多野吉衣 | 亚洲爆乳大丰满无码专区 | 久久久久av无码免费网 | 国产精品人人爽人人做我的可爱 | 欧美激情一区二区三区成人 | 亚洲国产一区二区三区在线观看 | 国产va免费精品观看 | 特大黑人娇小亚洲女 | 双乳奶水饱满少妇呻吟 | 亚洲人成人无码网www国产 | 无码免费一区二区三区 | 久久久中文久久久无码 | 国产舌乚八伦偷品w中 | 欧美丰满熟妇xxxx性ppx人交 | 玩弄人妻少妇500系列视频 | 樱花草在线播放免费中文 | 国产无遮挡吃胸膜奶免费看 | 久久久精品欧美一区二区免费 | 99久久无码一区人妻 | 亚洲精品一区二区三区在线 | 国产亲子乱弄免费视频 | 国产成人精品必看 | 夜先锋av资源网站 | 亚洲日韩乱码中文无码蜜桃臀网站 | 中文字幕无码免费久久99 | 久久久久免费精品国产 | 久久久国产精品无码免费专区 | 国产黄在线观看免费观看不卡 | 亚洲精品综合五月久久小说 | 妺妺窝人体色www在线小说 | 国产明星裸体无码xxxx视频 | 久久久久久久久蜜桃 | 青青青爽视频在线观看 | 国产精品久久久久影院嫩草 | 国精产品一品二品国精品69xx | 国产精品无码mv在线观看 | 国产精品无码久久av | 免费人成网站视频在线观看 | 1000部夫妻午夜免费 | 日韩精品乱码av一区二区 | 成人一在线视频日韩国产 | 久久综合狠狠综合久久综合88 | 亚洲狠狠色丁香婷婷综合 | 亚洲一区二区三区四区 | 黑人玩弄人妻中文在线 | 丰满妇女强制高潮18xxxx | 欧美一区二区三区视频在线观看 | 国产人妻人伦精品 | 久久综合色之久久综合 | 午夜男女很黄的视频 | 久久97精品久久久久久久不卡 | 搡女人真爽免费视频大全 | 影音先锋中文字幕无码 | 免费网站看v片在线18禁无码 | 国产高潮视频在线观看 | 丰满人妻被黑人猛烈进入 | 欧美丰满老熟妇xxxxx性 | 欧美freesex黑人又粗又大 | 国产精品视频免费播放 | 国产人妻精品午夜福利免费 | 麻豆国产人妻欲求不满 | 性色欲情网站iwww九文堂 | 国产精品毛片一区二区 | 免费看少妇作爱视频 | 女人被爽到呻吟gif动态图视看 | 国产午夜福利亚洲第一 | 精品人妻av区 | 十八禁真人啪啪免费网站 | 亚洲国产精品毛片av不卡在线 | 一区二区三区乱码在线 | 欧洲 | 人人爽人人澡人人人妻 | 波多野结衣一区二区三区av免费 | 成人性做爰aaa片免费看不忠 | 国产在线精品一区二区高清不卡 | 欧美日韩一区二区三区自拍 | √8天堂资源地址中文在线 | 高清国产亚洲精品自在久久 | 亚洲精品久久久久久久久久久 | 性欧美videos高清精品 | 久久精品女人的天堂av | 久久久久久av无码免费看大片 | 一本一道久久综合久久 | 国产精品欧美成人 | 亚洲精品久久久久久久久久久 | 扒开双腿吃奶呻吟做受视频 | 性生交大片免费看女人按摩摩 | 久久人人爽人人爽人人片av高清 | 国产又爽又猛又粗的视频a片 | 精品亚洲成av人在线观看 | 国产性生大片免费观看性 | 亚洲欧美国产精品专区久久 | 天天爽夜夜爽夜夜爽 | 极品尤物被啪到呻吟喷水 | 男女作爱免费网站 | 99久久婷婷国产综合精品青草免费 | 免费看男女做好爽好硬视频 | 波多野42部无码喷潮在线 | 无码中文字幕色专区 | 强奷人妻日本中文字幕 | 99久久精品午夜一区二区 | 偷窥村妇洗澡毛毛多 | 欧美性色19p | 久久久av男人的天堂 | 精品国产乱码久久久久乱码 | 国产在线aaa片一区二区99 | 欧美人妻一区二区三区 | 十八禁真人啪啪免费网站 | 国产精品久免费的黄网站 | 国产人妻人伦精品 | 亚洲精品国产品国语在线观看 | 狠狠色欧美亚洲狠狠色www | 精品国产精品久久一区免费式 | 天干天干啦夜天干天2017 | 久久伊人色av天堂九九小黄鸭 | 久久精品视频在线看15 | 精品厕所偷拍各类美女tp嘘嘘 | 久久久精品456亚洲影院 | 国产香蕉尹人综合在线观看 | 亚洲经典千人经典日产 | 成在人线av无码免观看麻豆 | 捆绑白丝粉色jk震动捧喷白浆 | 久久久成人毛片无码 | 给我免费的视频在线观看 | 欧美乱妇无乱码大黄a片 | 伊在人天堂亚洲香蕉精品区 | 人妻少妇精品久久 | 婷婷六月久久综合丁香 | 在线成人www免费观看视频 | 扒开双腿吃奶呻吟做受视频 | 51国偷自产一区二区三区 | 亚洲天堂2017无码中文 | 樱花草在线播放免费中文 | 亚洲 另类 在线 欧美 制服 | 动漫av一区二区在线观看 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲小说春色综合另类 | 色情久久久av熟女人妻网站 | 国产成人精品一区二区在线小狼 | 欧美午夜特黄aaaaaa片 | 漂亮人妻洗澡被公强 日日躁 | 福利一区二区三区视频在线观看 | 性色欲情网站iwww九文堂 | 国产亚洲欧美日韩亚洲中文色 | 亚洲综合另类小说色区 | 精品无码一区二区三区的天堂 | 激情内射日本一区二区三区 | 亚洲精品久久久久中文第一幕 | 精品 日韩 国产 欧美 视频 | 四十如虎的丰满熟妇啪啪 | 人妻无码αv中文字幕久久琪琪布 | 澳门永久av免费网站 | 国产精品无码一区二区三区不卡 | 国产精品怡红院永久免费 | 东北女人啪啪对白 | 亚洲熟悉妇女xxx妇女av | 久久精品人人做人人综合试看 | 国产97在线 | 亚洲 | 免费网站看v片在线18禁无码 | 成人精品视频一区二区三区尤物 | 国产精品鲁鲁鲁 | 国内揄拍国内精品人妻 | 乱码午夜-极国产极内射 | 中文字幕av无码一区二区三区电影 | 国产精品久久国产精品99 | 日本熟妇人妻xxxxx人hd | 大色综合色综合网站 | 99久久婷婷国产综合精品青草免费 | 国产香蕉尹人综合在线观看 | 国产在热线精品视频 | 日日麻批免费40分钟无码 | 亚洲熟妇色xxxxx欧美老妇y | 国产人成高清在线视频99最全资源 | 少妇邻居内射在线 | 成人aaa片一区国产精品 | 97色伦图片97综合影院 | 在线视频网站www色 | 日韩精品久久久肉伦网站 | 夜精品a片一区二区三区无码白浆 | 一二三四在线观看免费视频 | 久久亚洲国产成人精品性色 | 无码人中文字幕 | 四虎国产精品一区二区 | 人人爽人人澡人人高潮 | 精品偷自拍另类在线观看 | 台湾无码一区二区 | 黑森林福利视频导航 | 国产午夜亚洲精品不卡下载 | 亚洲国产精品一区二区第一页 | 精品一区二区三区波多野结衣 | 国产精品va在线播放 | 中文字幕中文有码在线 | 欧美日韩亚洲国产精品 | 国产特级毛片aaaaaaa高清 | 草草网站影院白丝内射 | 女人被爽到呻吟gif动态图视看 | 亚洲欧洲无卡二区视頻 | 人人妻人人澡人人爽欧美精品 | 国产极品视觉盛宴 | 国产精品久久久久9999小说 | 女人和拘做爰正片视频 | 成年美女黄网站色大免费全看 | 久久久久成人片免费观看蜜芽 | 国产xxx69麻豆国语对白 | 国产美女极度色诱视频www | 99精品国产综合久久久久五月天 | 亚洲成色www久久网站 | 亚洲小说图区综合在线 | 人人澡人人妻人人爽人人蜜桃 | 亚洲 日韩 欧美 成人 在线观看 | 久久午夜无码鲁丝片午夜精品 | 少妇被粗大的猛进出69影院 | 免费无码av一区二区 | 国产做国产爱免费视频 | www国产亚洲精品久久网站 | 国产无套粉嫩白浆在线 | 色婷婷香蕉在线一区二区 | 成 人 网 站国产免费观看 | 久久精品一区二区三区四区 | 国产舌乚八伦偷品w中 | 骚片av蜜桃精品一区 | 国产无套粉嫩白浆在线 | 亚洲日韩一区二区 | 东京热一精品无码av | 成人免费视频一区二区 | 国产亚洲人成在线播放 | 免费看男女做好爽好硬视频 | 99er热精品视频 | 三上悠亚人妻中文字幕在线 | 国产色视频一区二区三区 | 大乳丰满人妻中文字幕日本 | 天天拍夜夜添久久精品大 | 久久国产精品萌白酱免费 | 性欧美大战久久久久久久 | 日产精品高潮呻吟av久久 | 日本精品高清一区二区 | 欧美放荡的少妇 | 老司机亚洲精品影院 | 国产做国产爱免费视频 | 撕开奶罩揉吮奶头视频 | 国产美女极度色诱视频www | 国产亚洲精品久久久久久大师 | 欧美三级a做爰在线观看 | 中文字幕亚洲情99在线 | 精品人妻中文字幕有码在线 | 久久久久免费看成人影片 | 国内精品久久久久久中文字幕 | 亚洲精品国偷拍自产在线麻豆 | 天堂久久天堂av色综合 | 国内少妇偷人精品视频免费 | 女人被男人爽到呻吟的视频 | 国产精品久久精品三级 | 久久精品国产大片免费观看 | 一区二区传媒有限公司 | 美女极度色诱视频国产 | aa片在线观看视频在线播放 | 乱码午夜-极国产极内射 | 国产精品美女久久久久av爽李琼 | 国产亚洲精品久久久久久久久动漫 | 国产情侣作爱视频免费观看 | 亚洲国产精品无码久久久久高潮 | 一区二区三区高清视频一 | 亚洲精品国产第一综合99久久 | 欧美猛少妇色xxxxx | 少女韩国电视剧在线观看完整 | 免费视频欧美无人区码 | 亚洲成av人影院在线观看 | 亚洲日本va中文字幕 | 久久精品国产一区二区三区 | 人人澡人人透人人爽 | 日日躁夜夜躁狠狠躁 | 国产亚洲欧美日韩亚洲中文色 | 亚洲第一无码av无码专区 | 亚洲国产综合无码一区 | 天堂无码人妻精品一区二区三区 | 国产亚洲精品久久久久久国模美 | 国产乱人伦av在线无码 | 国产精品无码一区二区桃花视频 | 国产人妻精品午夜福利免费 | 领导边摸边吃奶边做爽在线观看 | 女人被男人爽到呻吟的视频 | 野外少妇愉情中文字幕 | 青春草在线视频免费观看 | 亚洲国产精品无码一区二区三区 | 97久久国产亚洲精品超碰热 | 国产精品久久久久久久9999 | 国产成人无码a区在线观看视频app | ass日本丰满熟妇pics | 狠狠亚洲超碰狼人久久 | 在线精品亚洲一区二区 | 亚拍精品一区二区三区探花 | 在线观看欧美一区二区三区 | 国产精品对白交换视频 | 国产亚洲精品久久久久久国模美 | 国产人妻精品一区二区三区不卡 | 曰本女人与公拘交酡免费视频 | 国产人妻大战黑人第1集 | 东京一本一道一二三区 | 色狠狠av一区二区三区 | 国产午夜亚洲精品不卡 | 久久亚洲中文字幕精品一区 | 青青草原综合久久大伊人精品 | 亚洲精品国产第一综合99久久 | 欧美人与禽猛交狂配 | 扒开双腿疯狂进出爽爽爽视频 | 在线 国产 欧美 亚洲 天堂 | 国产色xx群视频射精 | 夫妻免费无码v看片 | 国产精品久久久久久亚洲毛片 | 大地资源中文第3页 | 少妇无码av无码专区在线观看 | 日本高清一区免费中文视频 | 亚洲色成人中文字幕网站 | 亚洲欧美精品伊人久久 | 三级4级全黄60分钟 | 亚洲熟妇自偷自拍另类 | 黑人巨大精品欧美黑寡妇 | 欧美日韩在线亚洲综合国产人 | 蜜桃视频韩日免费播放 | 欧美 日韩 亚洲 在线 | 色窝窝无码一区二区三区色欲 | 精品夜夜澡人妻无码av蜜桃 | 国产精品久久久久久久9999 | 四虎国产精品免费久久 | 一区二区传媒有限公司 | 中文精品无码中文字幕无码专区 | 国产精品美女久久久网av | 51国偷自产一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲午夜久久久影院 | 日本在线高清不卡免费播放 | 久久久久99精品国产片 | 午夜精品一区二区三区的区别 | 日本丰满熟妇videos | aⅴ在线视频男人的天堂 | 人妻夜夜爽天天爽三区 | 日本精品少妇一区二区三区 | 一本无码人妻在中文字幕免费 | 久久久久久久久蜜桃 | 高清不卡一区二区三区 | 无码福利日韩神码福利片 | 亚洲国产精品美女久久久久 | 国产成人av免费观看 | 久久国内精品自在自线 | 精品国产aⅴ无码一区二区 | 色一情一乱一伦一区二区三欧美 | 亚洲精品一区二区三区在线观看 | 久久99精品国产.久久久久 | 欧美国产日韩久久mv | 国产在线无码精品电影网 | 久久久久久国产精品无码下载 | 熟妇人妻无码xxx视频 | 国产 浪潮av性色四虎 | 亚洲熟妇色xxxxx亚洲 | 久久99精品久久久久久动态图 | 中文无码精品a∨在线观看不卡 | 少妇一晚三次一区二区三区 | 国产suv精品一区二区五 | 国产香蕉尹人视频在线 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产口爆吞精在线视频 | 中文字幕无码热在线视频 | 亚洲 欧美 激情 小说 另类 | 国产精品成人av在线观看 | 国产av一区二区三区最新精品 | 精品国产精品久久一区免费式 | 无码人妻少妇伦在线电影 | 亚洲日本va中文字幕 | 亚洲熟妇色xxxxx欧美老妇 | 日本欧美一区二区三区乱码 | 久久久久久久人妻无码中文字幕爆 | 巨爆乳无码视频在线观看 | 精品一区二区不卡无码av | aa片在线观看视频在线播放 | 亚洲自偷自偷在线制服 | 国内少妇偷人精品视频免费 | 亚洲 另类 在线 欧美 制服 | 成人精品视频一区二区三区尤物 | 中文字幕无码免费久久9一区9 | 兔费看少妇性l交大片免费 | 亚洲日韩精品欧美一区二区 | 麻豆精品国产精华精华液好用吗 | 亚洲国产一区二区三区在线观看 | 色一情一乱一伦一视频免费看 | 久久久久久久人妻无码中文字幕爆 | 两性色午夜视频免费播放 | 久久午夜无码鲁丝片午夜精品 | 四虎国产精品一区二区 | 黄网在线观看免费网站 | 欧美高清在线精品一区 | 久久精品国产一区二区三区肥胖 | 亚洲小说春色综合另类 | 人妻中文无码久热丝袜 | 久久综合香蕉国产蜜臀av | 色狠狠av一区二区三区 | 国产精品怡红院永久免费 | 97夜夜澡人人双人人人喊 | 国产艳妇av在线观看果冻传媒 | 男人和女人高潮免费网站 | 国产女主播喷水视频在线观看 | 国产精品沙发午睡系列 | 欧洲vodafone精品性 | 麻豆国产丝袜白领秘书在线观看 | 熟妇激情内射com | 久久久婷婷五月亚洲97号色 | 一个人看的视频www在线 | 中国大陆精品视频xxxx | 国产亚洲精品久久久久久久 | 精品无码国产一区二区三区av | aa片在线观看视频在线播放 | 久久精品国产精品国产精品污 | 久久精品人妻少妇一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 亚洲国产欧美日韩精品一区二区三区 | 啦啦啦www在线观看免费视频 | 久久亚洲日韩精品一区二区三区 | 久久人人爽人人爽人人片ⅴ | 亚洲人成网站在线播放942 | 高清国产亚洲精品自在久久 | 国产乡下妇女做爰 | 欧美丰满熟妇xxxx | 国产午夜福利亚洲第一 | 狠狠cao日日穞夜夜穞av | 亚洲の无码国产の无码影院 | 国产精品无码久久av | 十八禁真人啪啪免费网站 | 国产精品va在线播放 | 丰满护士巨好爽好大乳 | 日本精品少妇一区二区三区 | 中文字幕中文有码在线 | 亚洲成色www久久网站 | 性欧美大战久久久久久久 | 丰满少妇弄高潮了www | 亚洲人亚洲人成电影网站色 | 欧洲熟妇色 欧美 | 国内少妇偷人精品视频 | 国产精品亚洲综合色区韩国 | 高清无码午夜福利视频 | 欧洲极品少妇 | 装睡被陌生人摸出水好爽 | 亚洲精品一区二区三区四区五区 | 麻豆人妻少妇精品无码专区 | 成人精品一区二区三区中文字幕 | 性欧美videos高清精品 | 亚洲色在线无码国产精品不卡 | 欧美日韩久久久精品a片 | 国产女主播喷水视频在线观看 | 午夜精品久久久内射近拍高清 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 天海翼激烈高潮到腰振不止 | 噜噜噜亚洲色成人网站 | 国产极品美女高潮无套在线观看 | 亚洲成色在线综合网站 | 成人女人看片免费视频放人 | 国产艳妇av在线观看果冻传媒 | 2020久久香蕉国产线看观看 | 国产性生大片免费观看性 | 午夜精品久久久久久久 | 99麻豆久久久国产精品免费 | 日韩精品a片一区二区三区妖精 | 欧洲美熟女乱又伦 | 动漫av网站免费观看 | 久久精品女人的天堂av | 人人澡人人透人人爽 | 国产亚洲精品久久久久久大师 | 日韩av无码一区二区三区 | 最新版天堂资源中文官网 | 一区二区三区乱码在线 | 欧洲 | 麻豆精品国产精华精华液好用吗 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲国产精品毛片av不卡在线 | 亚洲色偷偷偷综合网 | 亚洲一区二区三区偷拍女厕 | 亚洲小说图区综合在线 | 精品无码成人片一区二区98 | 欧美国产亚洲日韩在线二区 | 久久人人爽人人爽人人片ⅴ | 色偷偷人人澡人人爽人人模 | 人妻尝试又大又粗久久 | 奇米影视7777久久精品 | 国产精品久久久午夜夜伦鲁鲁 | 国产网红无码精品视频 | 野外少妇愉情中文字幕 | www国产亚洲精品久久网站 | 亚洲成a人一区二区三区 | 无遮挡啪啪摇乳动态图 | 欧美日韩在线亚洲综合国产人 | 在线看片无码永久免费视频 | 国产肉丝袜在线观看 | 久久久中文久久久无码 | 久久国产自偷自偷免费一区调 | 国产成人一区二区三区别 | 中文字幕 亚洲精品 第1页 | 荡女精品导航 | 精品久久久久久亚洲精品 | 精品成人av一区二区三区 | 亚洲熟妇色xxxxx欧美老妇y | 香港三级日本三级妇三级 | 免费无码午夜福利片69 | 国产精品多人p群无码 | 日韩成人一区二区三区在线观看 | 无码人妻少妇伦在线电影 | 亚洲一区av无码专区在线观看 | 四虎4hu永久免费 | 国产精品久久久久7777 | 日韩精品无码一本二本三本色 | 色一情一乱一伦 | 国产后入清纯学生妹 | 亚洲色欲色欲天天天www | 精品欧美一区二区三区久久久 | 国产精品99久久精品爆乳 | 无码国产色欲xxxxx视频 | 中国女人内谢69xxxxxa片 | 国产av人人夜夜澡人人爽麻豆 | 真人与拘做受免费视频一 | 欧美熟妇另类久久久久久不卡 | 国产手机在线αⅴ片无码观看 | 亚洲色成人中文字幕网站 | 欧美性生交活xxxxxdddd | 精品国产麻豆免费人成网站 | 精品无人国产偷自产在线 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 欧美老妇与禽交 | 欧美成人免费全部网站 | 黑人玩弄人妻中文在线 | 久久99久久99精品中文字幕 | 老熟妇仑乱视频一区二区 | 欧美日韩久久久精品a片 | 日韩精品一区二区av在线 | 亚洲精品中文字幕乱码 | 国色天香社区在线视频 | 免费网站看v片在线18禁无码 | 国产小呦泬泬99精品 | 最新版天堂资源中文官网 | 免费看少妇作爱视频 | 特级做a爰片毛片免费69 | 久久久久久a亚洲欧洲av冫 | 台湾无码一区二区 | 色五月五月丁香亚洲综合网 | 久久精品中文字幕一区 | 成人免费视频在线观看 | 国产av久久久久精东av | 少妇无套内谢久久久久 | 4hu四虎永久在线观看 | 国产精品久免费的黄网站 | 中文字幕无码av激情不卡 | 欧美性生交活xxxxxdddd | 国产人妻久久精品二区三区老狼 | 国产精品久久久久9999小说 | 久久久久久av无码免费看大片 | 亚洲精品一区二区三区在线观看 | 国产一区二区不卡老阿姨 | 六十路熟妇乱子伦 | 日本一卡2卡3卡四卡精品网站 | 国产成人综合在线女婷五月99播放 | 白嫩日本少妇做爰 | 一二三四在线观看免费视频 | 久激情内射婷内射蜜桃人妖 | 亚洲一区二区三区含羞草 | 夫妻免费无码v看片 | 久久久久亚洲精品男人的天堂 | 国产猛烈高潮尖叫视频免费 | 人妻少妇精品无码专区动漫 | 乱码午夜-极国产极内射 | 欧美一区二区三区视频在线观看 | 亚洲欧洲日本无在线码 | 国产精品久久国产精品99 | 亚洲国产综合无码一区 | 免费国产黄网站在线观看 | 激情内射日本一区二区三区 | 全球成人中文在线 | 免费看男女做好爽好硬视频 | 国产欧美精品一区二区三区 | 亚洲小说图区综合在线 | 无码精品国产va在线观看dvd | 男人和女人高潮免费网站 | 欧美性猛交内射兽交老熟妇 | 日本精品少妇一区二区三区 | 亚洲综合在线一区二区三区 | 国产午夜福利亚洲第一 | 午夜无码区在线观看 | 一个人看的www免费视频在线观看 | 国产色在线 | 国产 | 久久天天躁狠狠躁夜夜免费观看 | 全球成人中文在线 | 中文字幕色婷婷在线视频 | 欧美日韩一区二区免费视频 | 久久久精品欧美一区二区免费 | 草草网站影院白丝内射 | 色五月五月丁香亚洲综合网 | 精品国产一区二区三区av 性色 | 国产明星裸体无码xxxx视频 | 亚洲中文字幕成人无码 | 久久久久久久女国产乱让韩 | 成在人线av无码免费 | 一本久久伊人热热精品中文字幕 | 国产精品福利视频导航 | 国产亚洲美女精品久久久2020 | 国产精品久久久久影院嫩草 | 99国产欧美久久久精品 | 亚洲精品国偷拍自产在线麻豆 | 精品偷拍一区二区三区在线看 | 亚洲熟妇自偷自拍另类 | 欧美丰满熟妇xxxx | 亚洲中文字幕乱码av波多ji | 玩弄少妇高潮ⅹxxxyw | 一本大道伊人av久久综合 | 日本肉体xxxx裸交 | √天堂资源地址中文在线 | 国产手机在线αⅴ片无码观看 | 亚洲精品久久久久avwww潮水 | 捆绑白丝粉色jk震动捧喷白浆 | 人妻少妇被猛烈进入中文字幕 | 国产三级久久久精品麻豆三级 | 久久97精品久久久久久久不卡 | 人人爽人人澡人人高潮 | 亚洲a无码综合a国产av中文 | 色窝窝无码一区二区三区色欲 | √天堂资源地址中文在线 | 亚洲小说春色综合另类 | 2019nv天堂香蕉在线观看 | 国产一区二区三区日韩精品 | 国产色xx群视频射精 | 久精品国产欧美亚洲色aⅴ大片 | 四虎影视成人永久免费观看视频 | 国产成人精品一区二区在线小狼 | 亚洲va中文字幕无码久久不卡 | 国产真实伦对白全集 | 欧美兽交xxxx×视频 | 久久99精品久久久久久 | 99久久无码一区人妻 | 熟妇人妻无乱码中文字幕 | 久久亚洲中文字幕无码 | 久久人妻内射无码一区三区 | 国产av无码专区亚洲awww | 日本一卡二卡不卡视频查询 | 日产精品99久久久久久 | 小泽玛莉亚一区二区视频在线 | 麻豆成人精品国产免费 | 97精品人妻一区二区三区香蕉 | 久久99精品久久久久婷婷 | 日韩无套无码精品 | 六月丁香婷婷色狠狠久久 | 亚洲成a人片在线观看无码 | 亚洲码国产精品高潮在线 | 少妇被粗大的猛进出69影院 | 强开小婷嫩苞又嫩又紧视频 | 无套内谢的新婚少妇国语播放 | 玩弄中年熟妇正在播放 | 欧美 丝袜 自拍 制服 另类 | 久久人人97超碰a片精品 | 乱码午夜-极国产极内射 | 国产精品久久久久久亚洲毛片 | 欧美国产亚洲日韩在线二区 | 国精产品一区二区三区 | 久久99精品久久久久久动态图 | 99精品无人区乱码1区2区3区 | 初尝人妻少妇中文字幕 | 精品成人av一区二区三区 | 亚洲国产欧美国产综合一区 | 丰满少妇弄高潮了www | 亚洲国精产品一二二线 | 久久久久人妻一区精品色欧美 | 亚洲七七久久桃花影院 | 狂野欧美性猛xxxx乱大交 | 国产精品二区一区二区aⅴ污介绍 | 中文无码成人免费视频在线观看 | 97无码免费人妻超级碰碰夜夜 | 久久久久av无码免费网 | 欧美人与物videos另类 | 黑人巨大精品欧美一区二区 | 亚洲热妇无码av在线播放 | 亚洲人成网站在线播放942 | 无码帝国www无码专区色综合 | 女人被爽到呻吟gif动态图视看 | 99久久久无码国产精品免费 | 亚洲日韩乱码中文无码蜜桃臀网站 | 中文精品无码中文字幕无码专区 | 欧美黑人性暴力猛交喷水 | 精品久久久久香蕉网 | 日产精品高潮呻吟av久久 | 亚洲色无码一区二区三区 | 女人被男人躁得好爽免费视频 | 日本丰满熟妇videos | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 成人片黄网站色大片免费观看 | 国产在线无码精品电影网 | 正在播放东北夫妻内射 | 一区二区三区乱码在线 | 欧洲 | 久久精品人人做人人综合 | 一个人免费观看的www视频 | 国产99久久精品一区二区 | 亚洲色欲色欲欲www在线 | 国产精品久久久 | 六月丁香婷婷色狠狠久久 | 亚洲а∨天堂久久精品2021 | 丰满少妇弄高潮了www | 国产亚洲视频中文字幕97精品 | 日本熟妇浓毛 | 日韩人妻无码一区二区三区久久99 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 乱人伦人妻中文字幕无码 | 高清国产亚洲精品自在久久 | 亚洲综合伊人久久大杳蕉 | 国产综合色产在线精品 | 亚洲日韩乱码中文无码蜜桃臀网站 | 精品无码一区二区三区的天堂 | 国产香蕉尹人视频在线 | 小sao货水好多真紧h无码视频 | 国产精品亚洲五月天高清 | 精品国精品国产自在久国产87 | 精品人妻av区 | 免费国产黄网站在线观看 | 国产人妻人伦精品1国产丝袜 | 亚洲国产av美女网站 | 中文字幕日韩精品一区二区三区 | 无码吃奶揉捏奶头高潮视频 | 亚洲成av人在线观看网址 | 天海翼激烈高潮到腰振不止 | 美女毛片一区二区三区四区 | 久久精品国产99精品亚洲 | 国产午夜视频在线观看 | 成人动漫在线观看 | 久久精品中文字幕一区 | 无码帝国www无码专区色综合 | 蜜桃视频插满18在线观看 | 妺妺窝人体色www在线小说 | 香港三级日本三级妇三级 | 蜜桃臀无码内射一区二区三区 | 性生交大片免费看女人按摩摩 | 欧美亚洲国产一区二区三区 | 丰满少妇女裸体bbw | 最新版天堂资源中文官网 | 18禁止看的免费污网站 | 亚洲色在线无码国产精品不卡 | 5858s亚洲色大成网站www | 4hu四虎永久在线观看 | 老太婆性杂交欧美肥老太 | 色一情一乱一伦 | 澳门永久av免费网站 | 色婷婷欧美在线播放内射 | 国产莉萝无码av在线播放 | 国产成人精品无码播放 | 中文字幕无码av激情不卡 | 丰满护士巨好爽好大乳 | 亚洲爆乳大丰满无码专区 | 55夜色66夜色国产精品视频 | 国内老熟妇对白xxxxhd | 免费中文字幕日韩欧美 | 久久国内精品自在自线 | 亚洲日韩中文字幕在线播放 | 亚洲狠狠婷婷综合久久 | 成人无码精品一区二区三区 | 无码免费一区二区三区 | 国产福利视频一区二区 | 国产乱人伦偷精品视频 | 国产精品人人爽人人做我的可爱 | 国产电影无码午夜在线播放 | 久久午夜无码鲁丝片午夜精品 | 日韩精品无码一区二区中文字幕 | 性开放的女人aaa片 | 色婷婷久久一区二区三区麻豆 | 夜先锋av资源网站 | 欧美丰满少妇xxxx性 | 99国产精品白浆在线观看免费 | 国产精品久免费的黄网站 | 成年美女黄网站色大免费视频 | 国内精品人妻无码久久久影院 | 国产特级毛片aaaaaa高潮流水 | 99精品视频在线观看免费 | 无码毛片视频一区二区本码 | 99久久人妻精品免费二区 | 丁香花在线影院观看在线播放 | 免费男性肉肉影院 | 国产成人久久精品流白浆 | 一个人看的视频www在线 | 又粗又大又硬毛片免费看 | 又大又黄又粗又爽的免费视频 | 大乳丰满人妻中文字幕日本 | 婷婷丁香六月激情综合啪 | 秋霞成人午夜鲁丝一区二区三区 | 熟妇女人妻丰满少妇中文字幕 | 免费无码午夜福利片69 | 无码免费一区二区三区 | 无码播放一区二区三区 | 欧美熟妇另类久久久久久不卡 | 国产成人亚洲综合无码 | 国产精品无码mv在线观看 | 亚洲国产精品久久人人爱 | 久久99精品久久久久婷婷 | 亚洲精品综合五月久久小说 | 装睡被陌生人摸出水好爽 | 人人妻人人澡人人爽人人精品浪潮 | 午夜无码人妻av大片色欲 | 老熟女重囗味hdxx69 | 任你躁在线精品免费 | 女人被爽到呻吟gif动态图视看 | 久久综合九色综合欧美狠狠 | 亚洲一区av无码专区在线观看 | 亚洲成av人片在线观看无码不卡 | 欧美性生交活xxxxxdddd | 欧美 日韩 人妻 高清 中文 | 久久精品国产99精品亚洲 | 天堂一区人妻无码 | 久久综合激激的五月天 | 一个人免费观看的www视频 | 宝宝好涨水快流出来免费视频 | 国产精品二区一区二区aⅴ污介绍 | 色综合久久久无码中文字幕 | 国产精品久久久久久亚洲毛片 | 精品日本一区二区三区在线观看 | 国产亚洲精品久久久久久久 | 久久午夜无码鲁丝片午夜精品 | 欧美精品无码一区二区三区 | 亚洲熟妇色xxxxx欧美老妇y | 精品偷自拍另类在线观看 | 国产黄在线观看免费观看不卡 | 成人欧美一区二区三区黑人 | 欧美xxxx黑人又粗又长 | 成 人 免费观看网站 | 精品国产精品久久一区免费式 | 野狼第一精品社区 | 荫蒂添的好舒服视频囗交 | 国产精品第一区揄拍无码 | 巨爆乳无码视频在线观看 | 国产亚洲欧美在线专区 | 性生交大片免费看女人按摩摩 | 人人妻人人澡人人爽精品欧美 | 亚洲一区二区三区在线观看网站 | 一本色道久久综合亚洲精品不卡 | 又大又紧又粉嫩18p少妇 | 国产偷国产偷精品高清尤物 | 丰满少妇人妻久久久久久 | 内射老妇bbwx0c0ck | 国产精品igao视频网 | 俺去俺来也www色官网 | 波多野结衣av在线观看 | 精品无人国产偷自产在线 | 人妻体内射精一区二区三四 | 成人av无码一区二区三区 | 久久久久久久久蜜桃 | 午夜理论片yy44880影院 | 国产艳妇av在线观看果冻传媒 | 日韩精品一区二区av在线 | aⅴ亚洲 日韩 色 图网站 播放 | 国产香蕉97碰碰久久人人 | 亚洲一区二区三区无码久久 | 精品夜夜澡人妻无码av蜜桃 | 久久精品国产一区二区三区肥胖 | 精品少妇爆乳无码av无码专区 | 2020久久超碰国产精品最新 | 亚洲の无码国产の无码影院 | 久久精品一区二区三区四区 | 天天摸天天透天天添 | 精品国产aⅴ无码一区二区 | 精品久久久无码人妻字幂 | 一区二区传媒有限公司 | 99久久精品无码一区二区毛片 | 少妇性l交大片欧洲热妇乱xxx | 久久综合给久久狠狠97色 | 亚洲国产精品久久人人爱 | 久久久久亚洲精品中文字幕 | 无码精品人妻一区二区三区av | 亚洲精品中文字幕久久久久 | 高潮喷水的毛片 | 久久综合久久自在自线精品自 | 国产激情精品一区二区三区 | 婷婷综合久久中文字幕蜜桃三电影 | 夜先锋av资源网站 | 国产女主播喷水视频在线观看 | 日日干夜夜干 | 国产福利视频一区二区 | 乌克兰少妇性做爰 | 内射老妇bbwx0c0ck | 中文精品久久久久人妻不卡 | 国模大胆一区二区三区 | 在线播放免费人成毛片乱码 | 性欧美牲交在线视频 | 丰满肥臀大屁股熟妇激情视频 | 国产精品第一国产精品 | 爆乳一区二区三区无码 | 国产午夜福利亚洲第一 | 99久久久国产精品无码免费 | 九九综合va免费看 | 国产熟妇高潮叫床视频播放 | 精品 日韩 国产 欧美 视频 | 国产精品内射视频免费 | 99久久人妻精品免费一区 | 日韩av无码一区二区三区 | 奇米影视7777久久精品 | 亚洲精品一区二区三区在线观看 | 99久久精品午夜一区二区 | 国产亚洲日韩欧美另类第八页 | 中文无码成人免费视频在线观看 | 亚洲第一网站男人都懂 | 黑人巨大精品欧美一区二区 | 国产97人人超碰caoprom | 欧美人与牲动交xxxx | 欧美人与禽zoz0性伦交 | 未满成年国产在线观看 | 98国产精品综合一区二区三区 | 99久久亚洲精品无码毛片 | 亚洲精品久久久久avwww潮水 | 精品人妻av区 | 国产真实乱对白精彩久久 | 亚洲欧洲中文日韩av乱码 | 亚洲国产一区二区三区在线观看 | 性啪啪chinese东北女人 | 欧美精品国产综合久久 | 国产精品美女久久久久av爽李琼 | 日韩av无码一区二区三区不卡 | 丁香啪啪综合成人亚洲 | 国产激情一区二区三区 | 纯爱无遮挡h肉动漫在线播放 | 狠狠色欧美亚洲狠狠色www | 国产麻豆精品一区二区三区v视界 | 少妇久久久久久人妻无码 | 国产激情艳情在线看视频 | 日韩少妇内射免费播放 | 波多野42部无码喷潮在线 | 亚洲欧美综合区丁香五月小说 | 熟妇激情内射com | 亚洲综合在线一区二区三区 | 色婷婷综合中文久久一本 | 国产无套内射久久久国产 | 98国产精品综合一区二区三区 | 成人免费视频一区二区 | 青青青手机频在线观看 | av无码电影一区二区三区 | 风流少妇按摩来高潮 | 久久精品国产亚洲精品 | 香蕉久久久久久av成人 | v一区无码内射国产 | 国产卡一卡二卡三 | 国产精品久久久久久久9999 | 国产精品高潮呻吟av久久4虎 | 欧美野外疯狂做受xxxx高潮 | 波多野结衣av一区二区全免费观看 | 亚洲国产欧美国产综合一区 | 98国产精品综合一区二区三区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产精品.xx视频.xxtv | 娇妻被黑人粗大高潮白浆 | av人摸人人人澡人人超碰下载 | 亚洲综合另类小说色区 | 狠狠色噜噜狠狠狠7777奇米 | 久青草影院在线观看国产 | 亚洲中文字幕无码中文字在线 | 欧美国产亚洲日韩在线二区 | 午夜无码区在线观看 | 亚洲热妇无码av在线播放 | 成人免费视频视频在线观看 免费 | 亚洲精品成人av在线 | 正在播放老肥熟妇露脸 | 久久久久亚洲精品男人的天堂 | 日日夜夜撸啊撸 | 丰满少妇女裸体bbw | 动漫av一区二区在线观看 | 无码国产色欲xxxxx视频 | 国内综合精品午夜久久资源 | 亚洲综合无码久久精品综合 | 天堂亚洲2017在线观看 | 欧美放荡的少妇 | yw尤物av无码国产在线观看 | 午夜精品久久久久久久久 | 99精品国产综合久久久久五月天 | 亚洲日韩精品欧美一区二区 | 美女极度色诱视频国产 | 丁香啪啪综合成人亚洲 | 久久人人97超碰a片精品 | 久久国产劲爆∧v内射 | √天堂中文官网8在线 | 99国产欧美久久久精品 | 亚洲va欧美va天堂v国产综合 | 青春草在线视频免费观看 | 欧洲欧美人成视频在线 | 久久综合色之久久综合 | 在线播放免费人成毛片乱码 | 国产一区二区三区日韩精品 | 日本免费一区二区三区最新 | 性欧美熟妇videofreesex | 国产午夜福利100集发布 | 国产高潮视频在线观看 | 麻豆精品国产精华精华液好用吗 | 亚洲日韩av片在线观看 | 激情人妻另类人妻伦 | 亚洲欧美日韩综合久久久 | 国产午夜视频在线观看 | 久久久久av无码免费网 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲熟熟妇xxxx | 中文字幕日韩精品一区二区三区 | av无码不卡在线观看免费 | 人妻无码久久精品人妻 | 高清国产亚洲精品自在久久 | 日韩亚洲欧美中文高清在线 | 久久久久久av无码免费看大片 | 日本精品高清一区二区 | 国产三级精品三级男人的天堂 | 国产高清av在线播放 | 一本大道伊人av久久综合 | 一本久久伊人热热精品中文字幕 | 日日鲁鲁鲁夜夜爽爽狠狠 | 国产精品久久久久影院嫩草 | 国产情侣作爱视频免费观看 | 最新版天堂资源中文官网 | 国产精品va在线观看无码 | 男女下面进入的视频免费午夜 | 中文无码成人免费视频在线观看 | 免费视频欧美无人区码 | 国产成人无码a区在线观看视频app | 国产明星裸体无码xxxx视频 | 亚洲码国产精品高潮在线 | 日本精品少妇一区二区三区 | 欧美日韩精品 | 人妻与老人中文字幕 | 亚洲成av人片在线观看无码不卡 | 在线视频网站www色 | 国产综合色产在线精品 | 成人免费视频在线观看 | 日日躁夜夜躁狠狠躁 | 亚洲日本va中文字幕 | 人人妻人人澡人人爽人人精品浪潮 | 少妇久久久久久人妻无码 | 久久人人97超碰a片精品 | 欧美日本精品一区二区三区 | 亚洲午夜无码久久 | 国产精品亚洲五月天高清 | 人妻中文无码久热丝袜 | 极品嫩模高潮叫床 | 国产人妻精品一区二区三区不卡 | 两性色午夜视频免费播放 | 欧美精品无码一区二区三区 | 欧美日本精品一区二区三区 | 精品无码一区二区三区的天堂 | 又湿又紧又大又爽a视频国产 | 精品一区二区不卡无码av | 狠狠色欧美亚洲狠狠色www | 对白脏话肉麻粗话av | 国产乱人伦偷精品视频 | 亚洲欧美国产精品专区久久 |