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

預測讀寫鎖的死鎖問題,居然有人做到了?

系統 Linux
死鎖是毀滅性的,一旦發生,系統很難或者幾乎不可能恢復;死鎖是隨機的,只有滿足特定條件才會發生,而如果條件復雜,雖然發生概率很低,但是一旦發生就非常難重現和調試。

死鎖是多線程和分布式程序中常見的一種嚴重問題。死鎖是毀滅性的,一旦發生,系統很難或者幾乎不可能恢復;死鎖是隨機的,只有滿足特定條件才會發生,而如果條件復雜,雖然發生概率很低,但是一旦發生就非常難重現和調試。

使用鎖而產生的死鎖是死鎖中的一種常見情況。Linux 內核使用 Lockdep 工具來檢測和特別是預測鎖的死鎖場景。然而,目前 Lockdep 只支持處理互斥鎖,不支持更為復雜的讀寫鎖,尤其是遞歸讀鎖(Recursive-read lock)。因此,Lockdep 既會出現由讀寫鎖引起的假陽性預測錯誤,也會出現假陰性預測錯誤。

本工作首先解密 Lockdep工具,然后提出一種通用的鎖的死鎖預測算法設計和實現(互斥鎖可以看做只使用讀寫鎖中的寫鎖),同時證明該算法是正確和全面的解決方案。

今年初,我們相繼解決了對滴滴基礎平臺大規模服務器集群影響嚴重的三個內核故障,在我們解決這些問題的時候,很多時間和精力都花在去尋找是誰在哪里構成了死鎖,延誤了故障排除時間,因此當時就想有沒有什么通用的方法能夠幫助我們對付死鎖問題。

但是因為時間緊迫,只能針對性地探索和處理這幾個具體問題。在最終成功修復了這幾個內核故障后,終于有一些時間靜下來去深入思考死鎖發生的原因和如何去檢測和預測死鎖。

隨著對這個問題的深入研究,我相繼做出了一些內核死鎖預測方面的算法優化和算法設計工作,其中部分已經被 Linux 內核接收,其他還在評審階段。

在這里我和大家分享其中的一個比較重要的工作:一個通用的讀寫鎖的死鎖預測算法。這個工作提出了一個通用的鎖的死鎖預測算法,支持所有 Linux 內核讀寫鎖,同時證明該算法是正確和全面的解決方案。這個算法所解決的核心問題已經存在超過10年以上(目前還在社區評審階段)。在介紹這個工作的之前我首先對死鎖問題和 Linux 內核死鎖工具 Lockdep 做簡要的介紹。

一、死鎖(Deadlock)

死鎖在日常生活中并不鮮見。生活在大城市的人都或多或少經歷過下圖所示的場景。在環島或者十字路口出現的這種情況就是死鎖。也許其中有車壞了,但是絕大多數車子是可以運行的。可是因為每輛車都得等著前車走動它才能走動,所有車都走不動,或者更一般地講它們不能取得進展(Make Forward Progress)。

[[358317]]

圖1:環島道路的交通堵塞(圖片來源于網絡)

這種情況發生的原因是車輛的等待構成了循環,在這個循環中每輛車的狀態都是等待前車,因此所有車都等不到到它所要等待的。這種車輛死鎖狀態會持續惡化并產生嚴重的后果:首先造成路口交通堵塞,而堵塞如果進一步擴大會導致大面積交通癱瘓。車輛死鎖很難自愈,通過自身走出死鎖狀態非常困難或者需要很長時間,一般都只能通過人工(如交通警察)干預才能解決。

在多線程或者分布式系統程序中,死鎖也會發生。其本質和上述的路口車輛堵塞是一樣的,都是因為參與者構成了循環等待,使得所有參與者都等不到想要的結果,從而永遠等在那里不能取得進展。Linux 內核當然也會發生死鎖,如果核心部分(Core),如調度器和內存管理,或者子系統,如文件系統,發生死鎖,都會導致整個系統不可用。

死鎖是隨機發生的。就像上圖中環島的情況一樣,環島就在那里而死鎖并不是總在發生。但是環島本身就是死鎖隱患,尤其在交通壓力比較大的路口,環島會比較容易產生死鎖。而如果這種路口設計成交通信號燈就會好很多,如果設計成立交橋則又會好很多。在程序中,我們把可能產生死鎖的場景稱作潛在死鎖(Potential Deadlock Scenario),而把即將發生或正在發生的死鎖稱為死鎖實例(Concrete Deadlock)。

如何對付死鎖一直是學術界和應用領域積極研究和解決的問題。我們可以將對死鎖的解決方案粗略地分為:死鎖發現(Detection)、死鎖避免(Prevention)和死鎖預測(Prediction)。死鎖發現是指在在程序運行中發現死鎖實例;死鎖避免則是在發現死鎖實例即將生成時進一步防止這個實例;而死鎖預測則是通過靜態或者動態方法找出程序中的潛在死鎖,從而從根本上預先消除死鎖隱患。

二、鎖的死鎖和 Lockdep

在死鎖中,因為用鎖(Lock)不當而導致的死鎖是一個重要死鎖來源。鎖是同步的一種主要手段,用鎖是不可避免的。對于復雜的同步關系,鎖的使用會比較復雜。如果使用不當很容易造成鎖的死鎖。從等待的角度來說,鎖的死鎖是由于參與線程等待鎖的釋放,而這種等待構成了等待循環,如 ABBA 死鎖:

圖2:兩線程ABBA死鎖

其中,線程中的黑色箭頭代表線程當前執行語句,紅色箭頭表示線程語句之間的等待關系。可以看到,紅色箭頭構成了一個圓圈(或者循環)。再一次回顧潛在死鎖和死鎖實例,如果這兩個線程執行的時間稍有改變,那么很有可能不會發生死鎖實例,比如如果讓 Thread1 執行完這一段代碼 Thread2 才開始執行。但是這樣的用鎖行為(Locking Behavior)毫無疑問是一個潛在死鎖。

進一步可以看出,如果我們能夠追蹤并分析程序的用鎖行為就有可能預測死鎖或者找出潛在死鎖,而不是等死鎖發生時才能檢測出死鎖實例。Linux 內核的 Lockdep 工具就是去刻畫內核的用鎖行為進而預測潛在死鎖并報告出來。

Lockdep 能夠刻畫出一類鎖(Lock Class)的行為,主要是通過記錄一類鎖中所有鎖實例的加鎖順序(Locking Order),即如果一個線程拿著鎖A,在沒有釋放前又去拿鎖B,那么鎖A和鎖B就有一個 A->B 的加鎖順序,在 Lockdep 中這個加鎖順序被稱為:鎖依賴 (Lock Dependency)。同樣的,對于 ABBA 類型的死鎖,我們并不需要 Thread1 和 Thread2 恰好產生一個死鎖實例,只要有線程產生了 A->B 加鎖順序行為,又有線程產生了一個 B->A 的加鎖順序行為,那么這就構成了一個潛在死鎖,如下圖所示:

圖3:線程ABBA加鎖順序

由此推廣開來,我們可以把所有的加鎖順序(即鎖依賴)記錄和保存下來,構成一個加鎖順序圖(Graph)。其中,如果有鎖依賴 A->B ,又有鎖依賴 B->C ,那么由于鎖依賴的關系(Relation)是傳遞的(Transitive),因此我們還可以得到鎖依賴 A->C 。A->B 和 B->C 稱為直接依賴(Direct Dependency),而 A->C 稱為間接依賴(Indirect Dependency)。對于每一個新的直接鎖依賴,我們去檢查這個依賴是否和圖中已經存在的鎖依賴構成一個循環,如果是的話,那么我們就可以預測產生了一個潛在死鎖。

三、讀寫鎖(Read-write Lock)

剛才我們所指的鎖都是互斥鎖(Exclusive Lock)。讀寫鎖是一種更復雜的鎖,或者說一種通用的鎖(General Lock),我們可以認為互斥鎖是只用寫鎖的讀寫鎖。只要沒有寫鎖或者寫鎖的爭搶,讀鎖允許讀者(Reader)同時持有。

Linux 內核中有多種讀寫鎖,主要包括:rwsem 、 rwlock 和 qrwlock 等。問題是,讀寫鎖會讓死鎖預測變得異常復雜, Lockdep 就不能支持這幾種讀寫鎖,因此 Lockdep 在使用過程中會產生一些相關的錯誤假陽性(False Positive)死鎖預測和錯誤假陰性(False Negative)死鎖預測。這個問題已經存在超過10年以上,我們提出一個通用的鎖的死鎖預測算法,并證明這個算法解決了讀寫鎖的死鎖預測問題。

四、通用鎖的死鎖預測算法(General Deadlock Prediction For Locks)

在描述這個算法的過程中,我們通過提出幾個引理(Lemma)來解釋或者證明我們所提出的死鎖預測的有效性。

▍引理1:在引入了讀寫鎖后,鎖的加鎖順序循環是潛在死鎖的必要條件,但不是充分條件。并且,一個潛在死鎖能且只能最早在最后一個加鎖順序(或鎖依賴)即將生成死鎖循環的時候被預測出來。

基于引理1,解決死鎖預測問題就是在最后一個拿鎖順序(即鎖依賴)形成等待圓環(循環)時,通過某種方法計算出這個等待圓環是否構成潛在死鎖,而我們的任務就是找到這個方法(算法)。

▍引理2:兩個虛擬線程 T1 和 T2 可以用來表示所有的死鎖場景。

對于任何一個死鎖實例來說,假定有 n 個線程參與到這個死鎖實例中,這 n 個線程表示為: 

  1. 1       T1,T2,…,Tn 

考慮 n 的情況:

  •  如果 n=1:這種死鎖即線程自己等待自己,在 Lockdep 中被稱為遞歸死鎖(Recursion Deadlock)。由于檢查這種死鎖較為簡單,因此在下面的算法中忽略這種特殊情況。
  •  如果 n>1:這種死鎖在 Lockdep 中被稱為翻轉死鎖(Inversion Deadlock)。對于這種情況,我們將這 n 個線程分成兩組,即 T1,T2,…,Tn-1 和 Tn ,然后把前一組中的所有鎖依賴合并在一起并假想所有這些依賴存在于一個虛擬的線程中,于是得到兩個虛擬線程 T1 和 T2 。

這就是引理2中所述的兩個虛擬線程。基于引理2,我們提出一個死鎖檢查雙線程模型(Two-Thread Model)來表示內核的加鎖行為:

  •  T1 :當前檢查鎖依賴之前的所有鎖依賴,這些依賴形成了一個鎖依賴圖。
  •  T2 :當前的待檢查的直接鎖依賴。

基于引理2和死鎖檢查雙線程模型,我們可以得到如下引理:

▍引理3:任何死鎖都可以轉化成 ABBA 類型。

基于上述3個引理,我們可以進一步將死鎖預測問題描述為,當我們得到一個新的直接鎖依賴 B->A 時,我們將這個新依賴設想為 T2 ,而之前的所有鎖依賴都存在于一個設想的 T1 產生的一個鎖依賴圖中,于是死鎖預測就是檢查 T1 中是否存在 A->B 的鎖依賴,如果存在即存在死鎖,否則就沒有死鎖并將 T2 合并到 T1 中。如下圖所示:

圖4:T1的鎖依賴圖和T2的直接鎖依賴

在引入了讀寫鎖之后,鎖依賴還取決于其中鎖的類型,即讀或者寫類型。我們根據 Linux 內核中互斥鎖和讀寫鎖的設計特性,引入一個鎖互斥表來表示鎖之間的互斥關系:

表1:讀寫鎖互斥關系表

其中,遞歸讀鎖(Recursive-read Lock)是一種特殊的讀鎖,它能夠被同一個線程遞歸地拿。下面我們首先提出一個簡單算法(Simple Algorithm)。基于雙線程模型,給定 T1 和 T2 ,和 ABBA 鎖:

圖5:基于雙線程模型的簡單算法  

簡單算法的步驟如下:

  • 如果 X1.A 和 X1.B 是互斥的且 X2.A 和 X2.B 是互斥的,那么 T1 和 T2 構成潛在死鎖。
  •  否則, T1 和 T2 不構成潛在死鎖。

從簡單算法中可以看出,鎖類型決定了鎖之間的互斥關系,而互斥關系是檢查死鎖的關鍵信息。對于讀寫鎖來說,鎖類型可能在程序執行過程中變化,那么如何記錄所有的鎖類型呢?我們基于鎖類型的互斥性,即鎖類型的互斥性由低到高:遞歸讀鎖 < 讀鎖 < 寫鎖(互斥鎖),提出了鎖類型的升級(Lock Type Promotion)。在程序執行過程中,如果碰到了高互斥性的鎖類型,那么我們將鎖依賴中的鎖類型升級到高互斥性的鎖依賴。鎖類型升級如圖所示:

圖6:鎖類型的升級

其中 RRn 表示遞歸讀鎖n(Recursive-read Lock n) ,Rn表示讀鎖n(Read Lock n),Wn代表寫鎖或者互斥鎖n(Write Lock n)。下面 Xn 則表示任意鎖n (即遞歸讀、讀或者寫鎖)。

但是,如上簡單算法并不能處理所有的死鎖預測情況,比如下面這個案例就會躲過簡單算法,但事實上它是一個潛在死鎖:

圖7:簡單算法失敗案例

在這個案例中, X1 和 X3 是互斥的從而這個案例構成了潛在死鎖。但是簡單算法在檢查 RR2->X1 時(即 T2 為 RR2->X1 ),根據簡單算法能夠找到 T1 中有 X1->RR2 ,但是由于 RR 和 RR 不具有互斥性,因而錯誤認定這個案例不是死鎖。分析這個案例為什么得出錯誤結論,是因為真正的死鎖 X1X3X3X1 中的 X3->X1 是間接鎖依賴,而間接依賴被簡單算法漏掉了。

這個問題的更深層次原因是因為互斥鎖之間只有互斥性,因此只要有 ABBA 就是潛在死鎖,并不需要檢查 T2 的間接鎖依賴。而在有讀鎖的情況下,這一條件不復存在,因此就要去考慮 T2 中的間接鎖依賴。

▍引理4:對于直接鎖依賴引入的間接鎖依賴,如果間接鎖依賴構成死鎖,那么直接鎖依賴仍然是關鍵的。

引理4是引理1的引申,根據引理1,這個直接鎖依賴一定是形成鎖循環的那個最后鎖依賴,而引理4說明通過這個鎖依賴一定可以通過某種方法判斷出鎖循環是否是潛在死鎖。換句話說,通過修改和加強之前提出的簡單算法,新的算法一定能夠解決這個問題。但是問題是,原先 T2 中直接鎖依賴可能進一步生成了很多間接鎖依賴,我們如何才能找到那個最終產生潛在死鎖的間接鎖依賴呢?更進一步,我們首先需要重新定義 T2 ,再在這個 T2 中找出所有的間接鎖依賴,那么 T2 的邊界是什么?如果把 T2 擴展到整個鎖依賴圖,那么算法復雜度會提高非常多,甚至可能超出 Lockdep 的處理能力,讓 Lockdep 變得實際上不可用。

▍引理5:T2 只需要擴展到當前線程的拿鎖棧(Lock Stack)。

根據引理5,我們首先修改之前提出的雙線程模型為:

  •  T1:當前檢查直接鎖依賴之前的所有鎖依賴,這些依賴形成了一個圖。
  •  T2:當前的待檢查的線程的鎖棧。

根據引理5和新的雙線程模型,我們在簡單算法的基礎上提出如下最終算法(Final Algorithm):

  •  繼續搜索鎖依賴圖即 T1 尋找一個新的鎖依賴循環。
  •  在這個新的循環中,如果有 T2 中的其他鎖存在,那么這個鎖和 T2 中的直接鎖依賴構成一個間接鎖依賴,檢查這個間接鎖依賴是否構成潛在死鎖。
  •  如果找到潛在死鎖,那么算法結束,如果沒有到算法轉到1直到搜索完整個鎖依賴圖為止。

這個最終算法能解決之前出現漏洞的案例嗎?答案是可以的,具體檢查過程如圖所示:

圖8:簡單算法的失敗案例解決過程

然而,對于所有其他情況,引理5是正確的嗎?為什么最終算法能夠工作呢?我們通過如下兩個引理來證明最終算法中的間接鎖依賴是必要且充分的。

▍引理6:檢查 T2 當中的間接鎖依賴是必要的,否則簡單算法已經解決了所有問題。

引理6說明由于讀寫鎖的存在,不能只檢查直接鎖依賴。

▍引理7:T2 的邊界就是當前線程的鎖棧,這是充分的。

根據引理2和引理3,任何死鎖都可以轉化成雙線程 ABBA 死鎖,并且 T1 只能貢獻 AB,T2 必須貢獻 BA 。在這里,T2 不僅僅是一個虛擬線程,也是一個實際存在的物理線程,因此 T2 需要且只需要檢查當前線程。

到這里,一個通用的讀寫鎖死鎖預測算法就描述并非正式證明完畢。這個算法已經實現在 Lockdep 中并提交給 Linux 內存社區去審閱(當前最新版本見https://lkml.org/lkml/2019/8/29/167)。鑒于相關性和篇幅所限,算法當中的一些關鍵細節并沒有全部展現在這里,有興趣的讀者可以去上面的鏈接查找,同時歡迎提出評審意見和建議。

回顧從最初處理滴滴基礎平臺大集群集中爆發的幾個嚴重系統故障,到學習研究內核死鎖預測工具,再到設計和實現新的通用的讀寫鎖死鎖預測算法。其中充滿了不確定性甚至戲劇性,但整個過程以及最后的結果都讓我收獲滿滿。

我想,這個經歷正像電影《阿甘正傳》里的阿甘跑步一樣:跑到了一個目的地,就想再多跑一點,到了下一個目的地,又去設定一個新的更遠的目標。我也想,普通的工作和世界級的工作的區別并不在于起點,而在于終點,在于是否多跑了幾個更遠的目標吧。 

 

責任編輯:龐桂玉 來源: DBAplus社群
相關推薦

2025-02-28 09:30:00

?DeepSeekDeepGEMMAI

2022-01-04 09:24:32

Python Excel 表格

2015-07-30 09:20:26

微軟Android Lau

2021-01-25 18:19:02

自動駕駛數據人工智能

2023-04-10 07:26:28

UseStateUseReducer

2021-08-03 22:26:46

Go函數分頁

2019-02-12 11:07:49

2024-03-18 09:24:12

RocketMQ消息模型分布式

2021-03-26 10:40:16

MySQL鎖等待死鎖

2025-01-07 08:20:00

2019-08-09 15:07:33

TomcatJaegerSpringBoot

2023-05-25 10:03:40

2017-01-19 11:16:29

開放網絡交換機數據中心

2024-01-29 01:08:01

悲觀鎖遞歸鎖讀寫鎖

2023-03-10 15:45:03

Golang公平鎖

2012-06-26 11:36:56

SurfaceiPad

2024-05-15 09:41:22

樂觀鎖編程

2018-07-31 10:10:06

MySQLInnoDB死鎖

2021-08-28 09:04:54

死鎖順序鎖輪詢鎖

2025-03-03 04:00:00

線程安全CPU
點贊
收藏

51CTO技術棧公眾號

久久久久亚洲AV成人无码国产| 日本不卡二区| 日本一二三区不卡| 九九热线有精品视频99| 精品视频免费在线| 日本人妻伦在线中文字幕| 五月婷婷久久久| 麻豆久久久久久| 久久久在线免费观看| 谁有免费的黄色网址| 精品一区二区三区视频在线播放| 午夜免费久久看| 亚洲一区不卡在线| 色就是色亚洲色图| 国产精一品亚洲二区在线视频| 51久久精品夜色国产麻豆| 波多野结衣欲乱| 日韩精品欧美大片| 日韩欧美精品在线视频| 黄色三级视频片| av中文在线资源库| 国产精品不卡一区二区三区| 久久久影院一区二区三区| 国产精品乱码久久久| 久久一区二区三区四区五区| 久久精品久久久久久| 久久久久久亚洲中文字幕无码| 国产亚洲高清一区| 在线观看日韩高清av| 青青草精品视频在线| 在线观看a视频| 国产亚洲一区二区三区四区 | 日本五十路女优| 国产电影一区二区在线观看| 亚洲另类图片色| av漫画在线观看| 精品一区视频| 欧美妇女性影城| 久久99999| 成人私拍视频| 亚洲电影在线播放| 粉嫩av一区二区三区天美传媒 | 人人干人人视频| 成人永久免费视频| 成人午夜激情视频| 国产精品久久久久久久久| 精品处破女学生| 中文一区一区三区免费在线观看| 国产成人精品a视频一区| 日本一区二区电影| 一本色道久久综合亚洲aⅴ蜜桃| 天堂8在线天堂资源bt| 在线免费观看的av| 亚洲欧美日韩国产综合| 亚洲精品一区二区三区樱花| 国产午夜视频在线观看| 久久久久久久久久久久久久久99| 狠狠色综合色区| 人人妻人人澡人人爽久久av| 高清成人在线观看| 国产精品免费视频一区二区 | 最新国产乱人伦偷精品免费网站| 久久最新资源网| 黄色片在线观看网站| 亚洲国产不卡| 欧美人在线视频| 久久免费视频99| 日韩午夜免费| 国产a级全部精品| 在线免费观看高清视频| 加勒比av一区二区| 114国产精品久久免费观看| 国产成人精品白浆久久69| 国产成人精品一区二区三区四区 | 一区二区三区在线视频观看58| 欧洲金发美女大战黑人| 黄色污污视频在线观看| 欧美日韩国产一区在线| 99久久国产宗和精品1上映| jizzjizz少妇亚洲水多| 欧美福利视频导航| 折磨小男生性器羞耻的故事| 私拍精品福利视频在线一区| 伊人一区二区三区久久精品| 国产一区第一页| 欧美精选一区| 日本高清不卡在线| 一本色道久久综合无码人妻| 国产高清久久久久| 久久伊人资源站| 午夜精品一区| 亚洲成av人影院| 爱情岛论坛成人| 欧美9999| 日韩精品在线观看一区| 中国特黄一级片| 国产综合亚洲精品一区二| 青青草精品毛片| 国产熟女精品视频| 久久综合久久鬼色| 一级全黄肉体裸体全过程| 国产粉嫩在线观看| 欧美肥妇毛茸茸| 一区二区视频观看| 亚洲欧洲美洲一区二区三区| 91地址最新发布| 国产女人高潮的av毛片| 91理论电影在线观看| 一本—道久久a久久精品蜜桃| brazzers在线观看| 在线播放欧美女士性生活| 中文文字幕文字幕高清| 综合天堂久久久久久久| 国产a∨精品一区二区三区不卡| 成人av手机在线| 中文字幕欧美区| 国产午夜大地久久| 国产精品白丝久久av网站| 亚洲人永久免费| 日本熟伦人妇xxxx| 韩国视频一区二区| 日韩视频在线观看国产| yellow字幕网在线| 精品国产一区a| www深夜成人a√在线| 日韩精品免费专区| 久久久com| av人人综合网| 欧美xxxx老人做受| 特级片在线观看| 久久99深爱久久99精品| 日韩av一区二区三区在线观看| freexxx性亚洲精品| 日韩免费性生活视频播放| 午夜激情福利电影| 蜜臀av一级做a爰片久久| 免费久久久一本精品久久区| ****av在线网毛片| 精品国产91洋老外米糕| 久久亚洲av午夜福利精品一区| 精品在线观看视频| 亚洲欧洲一区二区| 成人网ww555视频免费看| 亚洲天堂av女优| 无码人妻精品一区二区蜜桃色欲| 国产口爆吞精一区二区| 久久99青青| 亚洲 日韩 国产第一| 欧美 另类 交| 国产精品25p| 欧美一级高清片| 顶臀精品视频www| 久久99国产精品久久99| 亚洲韩国在线| 欧美日韩视频免费看| 在线观看91久久久久久| 波多野结衣日韩| 国产日韩欧美高清在线| www黄色在线| 欧美丝袜丝交足nylons172| 日韩av电影院| yourporn在线观看视频| 欧美日韩一区高清| 亚洲国产精品一区二区久久hs| 极品少妇一区二区| 蜜桃网站在线观看| 9l视频自拍蝌蚪9l视频成人| 久久久久久久影院| 神马久久高清| 日韩人体视频一二区| 欧洲美一区二区三区亚洲| 青娱乐精品视频| 五月天男人天堂| 成人香蕉社区| 日韩av三级在线观看| yourporn在线观看中文站| 欧美电影一区二区| 久久久美女视频| 91视频观看免费| 色乱码一区二区三区在线| 综合激情在线| 久久国产日韩欧美| 欧美aaaaaaaa| 欧美黑人巨大xxx极品| 无码国产精品96久久久久| 欧洲精品在线观看| 农村妇女精品一区二区| 99久久久久久99| 亚洲这里只有精品| 狠狠88综合久久久久综合网| 九九九九精品| 日韩一区二区三区免费视频| 欧美日本在线视频中文字字幕| 亚洲av毛片成人精品| 欧美午夜精品一区二区三区| 久久久久久久9999| 久久久欧美精品sm网站| 亚洲一区二区中文字幕在线观看| 999在线观看精品免费不卡网站| 水蜜桃一区二区三区| 澳门久久精品| 国产在线高清精品| 亚洲免费福利| 色综合91久久精品中文字幕| 蜜桃视频在线观看视频| 日韩欧美中文字幕制服| 国产免费a视频| 亚洲一区二区三区美女| 潮喷失禁大喷水aⅴ无码| www.欧美日韩国产在线| 在线播放黄色av| 日韩av一区二区在线影视| www.av毛片| 一区二区三区在线| 视频三区二区一区| 网红女主播少妇精品视频| 亚洲va码欧洲m码| 小明成人免费视频一区| 8090成年在线看片午夜| 在线免费观看a视频| 日韩中文在线中文网在线观看| 亚洲精品久久久久久无码色欲四季 | 国外成人在线视频网站| 永久免费观看精品视频| 国产精品27p| 国产无遮挡裸体视频在线观看| 超碰97人人做人人爱少妇| 国产福利在线视频| 亚洲精品中文字幕女同| 人妻少妇精品无码专区| 日韩一卡二卡三卡| 国产喷水吹潮视频www| 欧美日韩视频在线第一区| 天堂网免费视频| 欧美日韩一区免费| 丰满少妇乱子伦精品看片| 亚洲香蕉伊在人在线观| 欧美日韩国产精品综合| 亚洲美女视频一区| 欧美激情图片小说| 最新日韩在线视频| 精品无码一区二区三区蜜臀| 国产精品素人一区二区| 天天摸日日摸狠狠添| 国产校园另类小说区| xxxx日本黄色| 国产午夜亚洲精品理论片色戒| 91网站免费入口| 国产三级欧美三级日产三级99| 30一40一50老女人毛片| 久久综合色之久久综合| 手机av免费看| 国产欧美日韩综合| 亚洲天堂精品一区| 亚洲欧美影音先锋| 青娱乐国产盛宴| 亚洲一区二区三区视频在线 | 91高清视频在线| 欧美性受xxx黑人xyx性爽| 欧美色综合影院| 国产剧情精品在线| 日韩精品一区二区三区蜜臀| 高h放荡受浪受bl| 日韩成人性视频| 你懂的在线观看视频网站| 国产一区二区日韩精品欧美精品| 成人免费高清在线播放| 精品国内自产拍在线观看| 国产精品实拍| 国产综合在线看| 最新日韩三级| 亚洲aaa激情| 麻豆一区二区| 手机成人在线| 欧美a级片网站| 久久久免费视频网站| 日本91福利区| 久久精品无码专区| 久久精品一区八戒影视| 国产精品视频一区二区在线观看| 亚洲欧美国产毛片在线| 国产精品一区二区6| 欧美视频三区在线播放| 成 人 黄 色 片 在线播放| 亚洲精选在线观看| 日本中文字幕在线看| 久久久久久com| 香蕉成人av| 97伦理在线四区| 亚洲人成精品久久久| av电影一区二区三区| 亚洲免费大片| 午夜啪啪小视频| 99久久国产免费看| 小泽玛利亚一区| 黑人精品xxx一区| 国产日韩在线观看一区| 国产视频久久网| 超碰超碰在线| 国产精品狠色婷| jazzjazz国产精品麻豆| 亚洲一区二区在线看| 一区二区日韩免费看| 亚洲人视频在线| 91片在线免费观看| 欧洲猛交xxxx乱大交3| 91福利视频久久久久| 人妻中文字幕一区| 久久伊人精品一区二区三区| 在线天堂新版最新版在线8| 91在线精品视频| 欧美日一区二区| 日韩在线一级片| 国产精品一区三区| 91成人精品一区二区| 粉嫩老牛aⅴ一区二区三区| 国产视频在线观看视频| 色一情一乱一区二区| 国产精品迅雷| 国产综合第一页| 国产综合精品一区| 亚洲天堂一区二区在线观看| 欧美激情在线观看视频免费| 国产成人在线免费观看视频| 欧美xxx久久| 国产高清一区二区三区视频| 国产精品久久久久久久av电影| 欧美尿孔扩张虐视频| 欧妇女乱妇女乱视频| 国内精品视频666| 制服丨自拍丨欧美丨动漫丨| 在线亚洲一区二区| 国产肥白大熟妇bbbb视频| 国产精品久久久久久久久晋中| 欧美一区二区三区四| 精品国产欧美一区二区| a级影片在线| 成人乱人伦精品视频在线观看| 免费成人结看片| 18禁男女爽爽爽午夜网站免费| 成人免费高清在线| 国产午夜久久久| 欧美成人精品1314www| 性欧美猛交videos| 亚洲在线www| 欧美日本二区| 国产免费a级片| 亚洲国产精品久久久久婷婷884| 亚洲第一第二区| 久久久久久久久综合| 精品久久对白| 国产免费黄视频| 国产亚洲精品资源在线26u| 亚洲国产成人精品女人久久| 亚洲石原莉奈一区二区在线观看| 欧美黑人疯狂性受xxxxx野外| 欧洲精品码一区二区三区免费看| 另类亚洲自拍| 粉嫩精品久久99综合一区| 欧美日韩精品系列| dy888亚洲精品一区二区三区| 91精品久久香蕉国产线看观看| 国精品一区二区| 亚洲色图14p| 欧美亚洲国产一区在线观看网站| 91成人高清| 96国产粉嫩美女| 一区二区三区国产在线| 一级特黄曰皮片视频| 制服丝袜国产精品| 91免费视频黄| 九九九久久久精品| 欧美日韩一级大片| 日韩精品高清视频| 97欧美成人| 99国产精品白浆在线观看免费| 99精品1区2区| 中文字幕一区二区久久人妻| 久热在线中文字幕色999舞| 成人午夜网址| 99热手机在线| 亚洲免费伊人电影| 天堂av在线资源| 成人黄色短视频在线观看| 亚洲手机视频| 三年中国中文观看免费播放| 欧美一区二区网站| 一个人看的www视频在线免费观看| 97碰碰视频| 日本人妖一区二区| 国产精彩视频在线观看| 一区三区二区视频| a看欧美黄色女同性恋| 88av.com| 亚洲国产中文字幕在线视频综合 | 国产亚洲人成a在线v网站 | 国产免费内射又粗又爽密桃视频| av不卡免费电影| 国产视频在线观看免费 | 日韩视频在线直播|