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

服務端I/O性能:Node、PHP、Java、Go的對比

開發
在本文中,我們將對 Node、Java、Go 和 PHP + Apache 進行對比,討論不同語言如何構造其 I/O ,每個模型的優缺點,并總結一些基本的規律。如果你擔心你的下一個 Web 應用程序的 I/O 性能,本文將給你最優的解答。

[[208153]]

了解應用程序的輸入/輸出(I/O)模型意味著理解應用程序處理其數據的載入差異,并揭示其在真實環境中表現?;蛟S你的應用程序很小,在不承受很大的負載時,這并不是個嚴重的問題;但隨著應用程序的流量負載增加,可能因為使用了低效的 I/O 模型導致承受不了而崩潰。

和大多數情況一樣,處理這種問題的方法有多種方式,這不僅僅是一個擇優的問題,而是對權衡的理解問題。 接下來我們來看看 I/O 到底是什么。

在本文中,我們將對 Node、Java、Go 和 PHP + Apache 進行對比,討論不同語言如何構造其 I/O ,每個模型的優缺點,并總結一些基本的規律。如果你擔心你的下一個 Web 應用程序的 I/O 性能,本文將給你***的解答。

I/O 基礎知識: 快速復習

要了解 I/O 所涉及的因素,我們首先深入到操作系統層面復習這些概念。雖然看起來并不與這些概念直接打交道,但你會一直通過應用程序的運行時環境與它們間接接觸。了解細節很重要。

系統調用

首先是系統調用,其被描述如下:

  • 程序(所謂“用戶端user land”)必須請求操作系統內核代表它執行 I/O 操作。
  • “系統調用syscall”是你的程序要求內核執行某些操作的方法。這些實現的細節在操作系統之間有所不同,但基本概念是相同的。有一些具體的指令會將控制權從你的程序轉移到內核(類似函數調用,但是使用專門用于處理這種情況的專用方式)。一般來說,系統調用會被阻塞,這意味著你的程序會等待內核返回(控制權到)你的代碼。
  • 內核在所需的物理設備( 磁盤、網卡等 )上執行底層 I/O 操作,并回應系統調用。在實際情況中,內核可能需要做許多事情來滿足你的要求,包括等待設備準備就緒、更新其內部狀態等,但作為應用程序開發人員,你不需要關心這些。這是內核的工作。

 

Syscalls Diagram

阻塞與非阻塞

上面我們提到過,系統調用是阻塞的,一般來說是這樣的。然而,一些調用被歸類為“非阻塞”,這意味著內核會接收你的請求,將其放在隊列或緩沖區之類的地方,然后立即返回而不等待實際的 I/O 發生。所以它只是在很短的時間內“阻塞”,只需要排隊你的請求即可。

舉一些 Linux 系統調用的例子可能有助于理解:

  • read() 是一個阻塞調用 - 你傳遞一個句柄,指出哪個文件和緩沖區在哪里傳送它所讀取的數據,當數據就緒時,該調用返回。這種方式的優點是簡單友好。
  • 分別調用 epoll_create()、epoll_ctl() 和 epoll_wait() ,你可以創建一組句柄來偵聽、添加/刪除該組中的處理程序、然后阻塞直到有任何事件發生。這允許你通過單個線程有效地控制大量的 I/O 操作,但是現在談這個還太早。如果你需要這個功能當然好,但須知道它使用起來是比較復雜的。

了解這里的時間差異的數量級是很重要的。假設 CPU 內核運行在 3GHz,在沒有進行 CPU 優化的情況下,那么它每秒執行 30 億次周期cycle(即每納秒 3 個周期)。非阻塞系統調用可能需要幾十個周期來完成,或者說 “相對少的納秒” 時間完成。而一個被跨網絡接收信息所阻塞的系統調用可能需要更長的時間 - 例如 200 毫秒(1/5 秒)。這就是說,如果非阻塞調用需要 20 納秒,阻塞調用需要 2 億納秒。你的進程因阻塞調用而等待了 1000 萬倍的時長!

 

Blocking vs. Non-blocking Syscalls

內核既提供了阻塞 I/O (“從網絡連接讀取并給出數據”),也提供了非阻塞 I/O (“告知我何時這些網絡連接具有新數據”)的方法。使用的是哪種機制對調用進程的阻塞時長有截然不同的影響。

調度

關鍵的第三件事是當你有很多線程或進程開始阻塞時會發生什么。

根據我們的理解,線程和進程之間沒有很大的區別。在現實生活中,最顯著的性能相關的差異在于,由于線程共享相同的內存,而進程每個都有自己的內存空間,使得單獨的進程往往占用更多的內存。但是當我們談論調度Scheduling時,它真正歸結為一類事情(線程和進程類同),每個都需要在可用的 CPU 內核上獲得一段執行時間。如果你有 300 個線程運行在 8 個內核上,則必須將時間分成幾份,以便每個線程和進程都能分享它,每個運行一段時間,然后交給下一個。這是通過 “上下文切換context switch” 完成的,可以使 CPU 從運行到一個線程/進程到切換下一個。

這些上下文切換也有相關的成本 - 它們需要一些時間。在某些快速的情況下,它可能小于 100 納秒,但根據實際情況、處理器速度/體系結構、CPU 緩存等,偶見花費 1000 納秒或更長時間。

而線程(或進程)越多,上下文切換就越多。當我們涉及數以千計的線程時,每個線程花費數百納秒,就會變得很慢。

然而,非阻塞調用實質上是告訴內核“僅在這些連接之一有新的數據或事件時再叫我”。這些非阻塞調用旨在有效地處理大量 I/O 負載并減少上下文交換。

這些你明白了么?現在來到了真正有趣的部分:我們來看看一些流行的語言對那些工具的使用,并得出關于易用性和性能之間權衡的結論,以及一些其他有趣小東西。

聲明,本文中顯示的示例是零碎的(片面的,只能體現相關的信息); 數據庫訪問、外部緩存系統( memcache 等等)以及任何需要 I/O 的東西都將執行某種類型的 I/O 調用,其實質與上面所示的簡單示例效果相同。此外,對于將 I/O 描述為“阻塞”( PHP、Java )的情況,HTTP 請求和響應讀取和寫入本身就是阻塞調用:系統中隱藏著更多 I/O 及其伴生的性能問題需要考慮。

為一個項目選擇編程語言要考慮很多因素。甚至當你只考慮效率時,也有很多因素。但是,如果你擔心你的程序將主要受到 I/O 的限制,如果 I/O 性能影響到項目的成敗,那么這些是你需要了解的。

“保持簡單”方法:PHP

早在 90 年代,很多人都穿著 Converse 鞋,用 Perl 寫著 CGI 腳本。然后 PHP 來了,就像一些人喜歡咒罵的一樣,它使得動態網頁更容易。

PHP 使用的模型相當簡單。雖有一些出入,但你的 PHP 服務器基本上是這樣:

HTTP 請求來自用戶的瀏覽器,并訪問你的 Apache Web 服務器。Apache 為每個請求創建一個單獨的進程,有一些優化方式可以重新使用它們,以***限度地減少創建次數( 相對而言,創建進程較慢 )。Apache 調用 PHP 并告訴它運行磁盤上合適的 .php 文件。PHP 代碼執行并阻塞 I/O 調用。你在 PHP 中調用 file_get_contents() ,其底層會調用 read() 系統調用并等待結果。

當然,實際的代碼是直接嵌入到你的頁面,并且該操作被阻塞:

  1. <?php 
  2. // blocking file I/O 
  3. $file_data = file_get_contents(‘/path/to/file.dat’); 
  4. // blocking network I/O 
  5. $curl = curl_init('http://example.com/example-microservice'); 
  6. $result = curl_exec($curl); 
  7. // some more blocking network I/O 
  8. $result = $db->query('SELECT id, data FROM examples ORDER BY id DESC limit 100'); 
  9. ?> 

關于如何與系統集成,就像這樣:

 

I/O Model PHP

很簡單:每個請求一個進程。 I/O 調用就阻塞。優點是簡單可工作,缺點是,同時與 20,000 個客戶端連接,你的服務器將會崩潰。這種方法不能很好地擴展,因為內核提供的用于處理大容量 I/O (epoll 等) 的工具沒有被使用。 雪上加霜的是,為每個請求運行一個單獨的進程往往會使用大量的系統資源,特別是內存,這通常是你在這樣的場景中遇到的***個問題。

注意:Ruby 使用的方法與 PHP 非常相似,在大致的方面上,它們可以被認為是相同的。

多線程方法: Java

就在你購買你的***個域名,在某個句子后很酷地隨機說出 “dot com” 的那個時候,Java 來了。而 Java 具有內置于該語言中的多線程功能,它非常棒(特別是在創建時)。

大多數 Java Web 服務器通過為每個請求啟動一個新的執行線程,然后在該線程中最終調用你(作為應用程序開發人員)編寫的函數。

在 Java Servlet 中執行 I/O 往往看起來像:

  1. public void doGet(HttpServletRequest request, 
  2.     HttpServletResponse response) throws ServletException, IOException 
  3.     // blocking file I/O 
  4.     InputStream fileIs = new FileInputStream("/path/to/file"); 
  5.     // blocking network I/O 
  6.     URLConnection urlConnection = (new URL("http://example.com/example-microservice")).openConnection(); 
  7.     InputStream netIs = urlConnection.getInputStream(); 
  8.     // some more blocking network I/O 
  9. out.println("..."); 

由于我們上面的 doGet 方法對應于一個請求,并且在其自己的線程中運行,而不是每個請求一個單獨的進程,申請自己的內存。這樣有一些好處,比如在線程之間共享狀態、緩存數據等,因為它們可以訪問彼此的內存,但是它與調度的交互影響與之前的 PHP 的例子幾乎相同。每個請求獲得一個新線程,該線程內的各種 I/O 操作阻塞在線程內,直到請求被完全處理為止。線程被池化以最小化創建和銷毀它們的成本,但是數千個連接仍然意味著數千個線程,這對調度程序是不利的。

重要的里程碑出現在 Java 1.4 版本(以及 1.7 的重要升級)中,它獲得了執行非阻塞 I/O 調用的能力。大多數應用程序、web 應用和其它用途不會使用它,但至少它是可用的。一些 Java Web 服務器嘗試以各種方式利用這一點;然而,絕大多數部署的 Java 應用程序仍然如上所述工作。

 

I/O Model Java

肯定有一些很好的開箱即用的 I/O 功能,Java 讓我們更接近,但它仍然沒有真正解決當你有一個大量的 I/O 綁定的應用程序被數千個阻塞線程所壓垮的問題。

無阻塞 I/O 作為一等公民: Node

當更好的 I/O 模式來到 Node.js,阻塞才真正被解決。任何一個曾聽過 Node 簡單介紹的人都被告知這是“非阻塞”,可以有效地處理 I/O。這在一般意義上是正確的。但在細節中則不盡然,而且當在進行性能工程時,這種巫術遇到了問題。

Node 實現的范例基本上不是說 “在這里寫代碼來處理請求”,而是說 “在這里寫代碼來開始處理請求”。每次你需要做一些涉及到 I/O 的操作,你會創建一個請求并給出一個回調函數,Node 將在完成之后調用該函數。

在請求中執行 I/O 操作的典型 Node 代碼如下所示:

  1. http.createServer(function(request, response) { 
  2.     fs.readFile('/path/to/file''utf8'function(err, data) { 
  3.         response.end(data); 
  4.     }); 
  5. }); 

你可以看到,這里有兩個回調函數。當請求開始時,***個被調用,當文件數據可用時,第二個被調用。

這樣做的基本原理是讓 Node 有機會有效地處理這些回調之間的 I/O 。一個更加密切相關的場景是在 Node 中進行數據庫調用,但是我不會在這個例子中啰嗦,因為它遵循完全相同的原則:啟動數據庫調用,并給 Node 一個回調函數,它使用非阻塞調用單獨執行 I/O 操作,然后在你要求的數據可用時調用回調函數。排隊 I/O 調用和讓 Node 處理它然后獲取回調的機制稱為“事件循環”。它工作的很好。 

 

I/O Model Node.js

然而,這個模型有一個陷阱,究其原因,很多是與 V8 JavaScript 引擎(Node 用的是 Chrome 瀏覽器的 JS 引擎)如何實現的有關注1 。你編寫的所有 JS 代碼都運行在單個線程中。你可以想想,這意味著當使用高效的非阻塞技術執行 I/O 時,你的 JS 可以在單個線程中運行計算密集型的操作,每個代碼塊都會阻塞下一個。可能出現這種情況的一個常見例子是以某種方式遍歷數據庫記錄,然后再將其輸出到客戶端。這是一個示例,展示了其是如何工作:

  1. var handler = function(request, response) { 
  2.     connection.query('SELECT ...'function (err, rows) { 
  3.         if (err) { throw err }; 
  4.         for (var i = 0; i < rows.length; i++) { 
  5.             // do processing on each row 
  6.         } 
  7.         response.end(...); // write out the results 
  8.     }) 
  9. }; 

雖然 Node 確實有效地處理了 I/O ,但是上面的例子中 for 循環是在你的唯一的一個主線程中占用 CPU 周期。這意味著如果你有 10,000 個連接,則該循環可能會使你的整個應用程序像爬行般緩慢,具體取決于其會持續多久。每個請求必須在主線程中分享一段時間,一次一段。

這整個概念的前提是 I/O 操作是最慢的部分,因此最重要的是要有效地處理這些操作,即使這意味著要連續進行其他處理。這在某些情況下是正確的,但不是全部。

另一點是,雖然這只是一個觀點,但是寫一堆嵌套的回調可能是相當令人討厭的,有些則認為它使代碼更難以追蹤。在 Node 代碼中看到回調嵌套 4 層、5 層甚至更多層并不罕見。

我們再次來權衡一下。如果你的主要性能問題是 I/O,則 Node 模型工作正常。然而,它的關鍵是,你可以在一個處理 HTTP 請求的函數里面放置 CPU 密集型的代碼,而且不小心的話會導致每個連接都很慢。

最自然的非阻塞:Go

在我進入 Go 部分之前,我應該披露我是一個 Go 的粉絲。我已經在許多項目中使用過它,我是一個其生產力優勢的公開支持者,我在我的工作中使用它。

那么,讓我們來看看它是如何處理 I/O 的。Go 語言的一個關鍵特征是它包含自己的調度程序。在 Go 中,不是每個執行線程對應于一個單一的 OS 線程,其通過一種叫做 “協程goroutine” 的概念來工作。而 Go 的運行時可以將一個協程分配給一個 OS 線程,使其執行或暫停它,并且它不與一個 OS 線程相關聯——這要基于那個協程正在做什么。來自 Go 的 HTTP 服務器的每個請求都在單獨的協程中處理。

調度程序的工作原理如圖所示:

 

I/O Model Go

在底層,這是通過 Go 運行時中的各個部分實現的,它通過對請求的寫入/讀取/連接等操作來實現 I/O 調用,將當前協程休眠,并當采取進一步動作時喚醒該協程。

從效果上看,Go 運行時做的一些事情與 Node 做的沒有太大不同,除了回調機制是內置到 I/O 調用的實現中,并自動與調度程序交互。它也不會受到必須讓所有處理程序代碼在同一個線程中運行的限制,Go 將根據其調度程序中的邏輯自動將協程映射到其認為適當的 OS 線程。結果是這樣的代碼:

  1. func ServeHTTP(w http.ResponseWriter, r *http.Request) { 
  2.     // the underlying network call here is non-blocking 
  3.     rows, err := db.Query("SELECT ..."
  4.     for _, row := range rows { 
  5.         // do something with the rows
  6. // each request in its own goroutine 
  7.     } 
  8.     w.Write(...) // write the response, also non-blocking 

如上所述,我們重構基本的代碼結構為更簡化的方式,并在底層仍然實現了非阻塞 I/O。

在大多數情況下,最終是“兩全其美”的。非阻塞 I/O 用于所有重要的事情,但是你的代碼看起來像是阻塞,因此更容易理解和維護。Go 調度程序和 OS 調度程序之間的交互處理其余部分。這不是完整的魔法,如果你建立一個大型系統,那么值得我們來看看有關它的工作原理的更多細節;但與此同時,你獲得的“開箱即用”的環境可以很好地工作和擴展。

Go 可能有其缺點,但一般來說,它處理 I/O 的方式不在其中。

謊言,可惡的謊言和基準

對這些各種模式的上下文切換進行準確的定時是很困難的。我也可以認為這對你來說不太有用。相反,我會給出一些比較這些服務器環境的整個 HTTP 服務器性能的基本基準。請記住,影響整個端到端 HTTP 請求/響應路徑的性能有很多因素,這里提供的數字只是我將一些樣本放在一起進行基本比較的結果。

對于這些環境中的每一個,我寫了適當的代碼在一個 64k 文件中讀取隨機字節,在其上運行了一個 SHA-256 哈希 N 次( N 在 URL 的查詢字符串中指定,例如 .../test.php?n=100),并打印出結果十六進制散列。我選擇這樣做,是因為使用一些一致的 I/O 和受控的方式來運行相同的基準測試是一個增加 CPU 使用率的非常簡單的方法。

有關使用的環境的更多細節,請參閱 基準說明 。

首先,我們來看一些低并發的例子。運行 2000 次迭代,300 個并發請求,每個請求只有一個散列(N = 1),結果如下:

 

時間是在所有并發請求中完成請求的平均毫秒數。越低越好。

僅從一張圖很難得出結論,但是對我來說,似乎在大量的連接和計算量上,我們看到時間更多地與語言本身的一般執行有關,對于 I/O 更是如此。請注意,那些被視為“腳本語言”的語言(松散類型,動態解釋)執行速度最慢。

但是,如果我們將 N 增加到 1000,仍然有 300 個并發請求,相同的任務,但是哈希迭代是 1000 倍(顯著增加了 CPU 負載): 

 

時間是在所有并發請求中完成請求的平均毫秒數。越低越好。

突然間, Node 性能顯著下降,因為每個請求中的 CPU 密集型操作都相互阻塞。有趣的是,在這個測試中,PHP 的性能要好得多(相對于其他的),并且打敗了 Java。(值得注意的是,在 PHP 中,SHA-256 實現是用 C 編寫的,在那個循環中執行路徑花費了更多的時間,因為現在我們正在進行 1000 個哈希迭代)。

現在讓我們嘗試 5000 個并發連接(N = 1) - 或者是我可以發起的***連接。不幸的是,對于大多數這些環境,故障率并不顯著。對于這個圖表,我們來看每秒的請求總數。 越高越好 :

 

每秒請求數。越高越好。

這個圖看起來有很大的不同。我猜測,但是看起來像在高連接量時,產生新進程所涉及的每連接開銷以及與 PHP + Apache 相關聯的附加內存似乎成為主要因素,并阻止了 PHP 的性能。顯然,Go 是這里的贏家,其次是 Java,Node,***是 PHP。

雖然與你的整體吞吐量相關的因素很多,并且在應用程序之間也有很大的差異,但是你對底層發生什么的事情以及所涉及的權衡了解更多,你將會得到更好的結果。

總結

以上所有這一切,很顯然,隨著語言的發展,處理大量 I/O 的大型應用程序的解決方案也隨之發展。

為了公平起見,PHP 和 Java,盡管這篇文章中的描述,確實 實現了 在 web 應用程序 中 可使用的 非阻塞 I/O 。但是這些方法并不像上述方法那么常見,并且需要考慮使用這種方法來維護服務器的隨之而來的操作開銷。更不用說你的代碼必須以與這些環境相適應的方式進行結構化;你的 “正常” PHP 或 Java Web 應用程序通常不會在這樣的環境中進行重大修改。

作為比較,如果我們考慮影響性能和易用性的幾個重要因素,我們得出以下結論: 

 

< 如顯示不全,請左右滑動 >
語言 線程與進程 非阻塞 I/O 使用便捷性
PHP 進程  
Java 線程 可用 需要回調
Node.js 線程 需要回調
Go 線程 (協程) 不需要回調

 

線程通常要比進程有更高的內存效率,因為它們共享相同的內存空間,而進程則沒有。結合與非阻塞 I/O 相關的因素,我們可以看到,至少考慮到上述因素,當我們從列表往下看時,與 I/O 相關的一般設置得到改善。所以如果我不得不在上面的比賽中選擇一個贏家,那肯定會是 Go。

即使如此,在實踐中,選擇構建應用程序的環境與你的團隊對所述環境的熟悉程度以及你可以實現的總體生產力密切相關。因此,每個團隊都深入并開始在 Node 或 Go 中開發 Web 應用程序和服務可能就沒有意義。事實上,尋找開發人員或你內部團隊的熟悉度通常被認為是不使用不同語言和/或環境的主要原因。也就是說,過去十五年來,時代已經發生了變化。

希望以上內容可以幫助你更清楚地了解底層發生的情況,并為你提供如何處理應用程序的現實可擴展性的一些想法。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2021-07-11 06:43:29

服務端Node路由

2020-06-10 08:28:51

Kata容器I

2021-05-07 17:46:53

存儲IO

2009-12-04 13:50:00

PHP服務端返回Jso

2023-07-12 08:24:19

Java NIO通道

2022-04-23 16:30:22

Linux磁盤性能

2010-03-19 18:17:17

Java Server

2024-02-01 12:12:01

2024-11-01 11:46:59

2013-05-14 09:31:06

IBM閃存服務器

2025-07-04 03:00:00

2024-05-27 00:00:00

PHP阿里云OSS

2011-08-05 13:41:46

Go

2025-07-01 08:24:10

2016-03-18 09:04:42

swift服務端

2024-03-05 18:24:52

I/O聚合優化存儲

2024-11-29 09:47:44

AprEndpoin組件

2023-05-08 00:06:45

Go語言機制

2013-05-28 10:08:41

IO輸出

2022-05-22 13:55:30

Go 語言
點贊
收藏

51CTO技術棧公眾號

亚洲视频精品在线| 色悠悠亚洲一区二区| 成人综合电影| 亚洲影院在线播放| 久久中文字幕二区| 日韩欧美国产一区二区三区 | 亚洲h色精品| 精品国产免费久久| 成人3d动漫一区二区三区| 黄色av电影在线观看| 99精品视频一区二区三区| 国产精品视频精品视频| 国产成人精品亚洲男人的天堂| 在线日本制服中文欧美| 91精品久久久久久久99蜜桃 | 青青青免费在线视频| 国产精品久久久久天堂| 黄色91av| 精品国产18久久久久久| 丝袜美腿成人在线| 欧美激情一区二区三区在线视频观看 | 国产真实的和子乱拍在线观看| 色综合综合网| 亚洲大胆人体在线| 爽爽爽在线观看| 日韩精品专区| 亚洲成av人影院| 超碰免费在线公开| 国产在线你懂得| 成人夜色视频网站在线观看| 国产精品自产拍高潮在线观看| 日本在线视频免费| 中文字幕免费一区二区三区| 一本色道久久88精品综合| 亚洲无人区码一码二码三码| vam成人资源在线观看| 91福利精品第一导航| 妞干网在线观看视频| 国产写真视频在线观看| 亚洲国产精品t66y| 视频二区一区| 国产在线中文字幕| 久久久青草青青国产亚洲免观| 成人欧美视频在线| 国内精品偷拍视频| 国产曰批免费观看久久久| 国产美女精品视频免费观看| 无码人妻黑人中文字幕| 99亚洲视频| 高清视频欧美一级| 国产大片aaa| 伊人久久成人| 欧美精品18videos性欧| 免费又黄又爽又色的视频| 亚洲国产精品91| 精品国产一区二区三区久久久狼| 精品日韩在线视频| 青青草国产免费一区二区下载| 亚洲欧美日韩第一区| 亚洲中文字幕无码av| 天堂俺去俺来也www久久婷婷 | 国产亚洲色婷婷久久99精品91| 看亚洲a级一级毛片| 91精品国产欧美一区二区成人| 国产探花在线看| 国产精品一区二区精品视频观看| 欧美一区二区三区四区在线观看| 日本黄色www| 日韩精品成人| 亚洲成avwww人| 国产不卡一二三| 在线看成人短视频| 中文字幕在线国产精品| 日韩激情小视频| 欧美精品麻豆| 欧美一级在线播放| 特级西西444www高清大视频| 久久精品国产77777蜜臀| 国产在线播放不卡| 亚洲国产一二三区| 26uuu亚洲综合色欧美| 日本一区高清在线视频| 九色porny丨首页在线| 一区二区三区在线免费| 男人日女人逼逼| 不卡亚洲精品| 日韩你懂的在线观看| 少妇一级淫免费观看| 国产一区二区三区站长工具| 久久视频在线直播| 日本中文字幕免费观看| 日本欧美韩国一区三区| 亚洲综合社区网| 色视频免费在线观看| 亚洲国产高清在线| 免费不卡av在线| yy6080久久伦理一区二区| 欧美tickling网站挠脚心| 国产精品伦子伦| 91中文字幕精品永久在线| 久久久久久久香蕉网| 日韩欧美国产另类| 福利视频网站一区二区三区| 日本一区二区三区www| 中文字幕伦理免费在线视频 | 国产3p在线播放| 99a精品视频在线观看| 国产亚洲欧洲高清一区| 久久久久久国产精品视频| 日本中文字幕一区二区视频 | 国产99精品| 九九综合九九综合| 一级一级黄色片| 成人av一区二区三区| 亚洲一区二区三区涩| 日本а中文在线天堂| 欧美丰满一区二区免费视频| 欧美丰满少妇人妻精品| 欧美aa国产视频| 国产精品羞羞答答| 秋霞av在线| 亚洲成人综合在线| 热久久久久久久久| 欧美日韩中文字幕一区二区三区| 午夜欧美大片免费观看| 99精品国产99久久久久久97| 国产网站一区二区三区| 国产69精品久久久久久久| 国产一精品一av一免费爽爽| 国产亚洲精品一区二555| 国产精品久久久久久久久久久久久久久久久 | 久久九九免费| 久久精品magnetxturnbtih| 婷婷丁香在线| 91精品综合久久久久久| 日本一二三不卡视频| 老司机精品导航| 久久久一本精品99久久精品66| 久久不射影院| 日韩一级免费观看| 久久中文免费视频| 久草中文综合在线| 在线观看国产一区| 成人黄页网站视频| 中文字幕九色91在线| 一区二区三区在线观看av| 91视频国产观看| 男人操女人逼免费视频| 国产精品男女| 57pao精品| 亚洲日本在线播放| 欧美日韩视频在线| 亚洲色成人网站www永久四虎| 国产欧美一区二区三区国产幕精品| 国产激情美女久久久久久吹潮| 在线看女人毛片| 精品国偷自产国产一区| 91精品国产高潮对白| eeuss影院一区二区三区| 成人午夜免费在线| 亚洲综合福利| 日韩免费视频在线观看| av在线女优影院| 7777女厕盗摄久久久| xxxx日本少妇| 成人晚上爱看视频| 内射国产内射夫妻免费频道| 亚洲传媒在线| 国产精品日韩精品| 黄av在线播放| 精品国产伦理网| 日韩在线视频免费播放| 久久久久88色偷偷免费| 国产精品久久久毛片| 91精品国产乱码久久久久久| 5g国产欧美日韩视频| wwwww亚洲| 亚洲第一网中文字幕| 伦av综合一区| 国产精品蜜臀av| 成人三级做爰av| 久久国产精品久久w女人spa| 午夜精品短视频| 亚州一区二区| 国产成人精品午夜| 91蜜桃在线视频| 亚洲摸下面视频| 国产又粗又长又黄| 精品久久久久久亚洲精品| 韩国女同性做爰三级| 国产一区二区三区不卡在线观看| 大陆av在线播放| 成人免费看片39| 国产99在线播放| 91p九色成人| 欧美丰满少妇xxxxx| 成a人v在线播放| 日韩精品一区二区三区视频播放| 国产精品suv一区| 亚洲视频小说图片| 中文字幕一区二区人妻在线不卡| 麻豆精品在线视频| 日本中文字幕网址| 亚洲精品va| 欧美性bbwbbwbbwhd| 色播一区二区| 国产精品十八以下禁看| 草草在线视频| 久久这里有精品视频| 激情福利在线| 亚洲第一天堂无码专区| 国产精品免费无遮挡| 色婷婷亚洲综合| 日本一区二区免费在线观看| 亚洲情趣在线观看| 亚洲欧美va天堂人熟伦| jlzzjlzz国产精品久久| 国内av免费观看| 久久成人av少妇免费| 日本熟妇人妻xxxxx| 激情一区二区| 天天想你在线观看完整版电影免费| 激情五月综合| 久久久久欧美| 欧美调教视频| 国产伦视频一区二区三区| 欧美成人一级| 成人国产精品av| 成人黄色毛片| 国产精品久久久久久久久免费看| 日本三级一区| 午夜精品理论片| 欧美家庭影院| 欧美激情国产高清| 伊人影院在线视频| 不用播放器成人网| 五月天婷婷在线视频| 在线观看国产成人av片| 国产最新视频在线| 亚洲性线免费观看视频成熟| 黄色毛片在线观看| 亚洲乱码一区av黑人高潮| 亚洲 欧美 激情 小说 另类| 精品国产髙清在线看国产毛片| a毛片在线免费观看| 欧美美女喷水视频| 中文字幕在线观看1| 欧美系列一区二区| 中文字幕欧美在线观看| 欧美性猛片aaaaaaa做受| 中文字幕天堂在线| 欧美日韩午夜在线视频| 亚洲天堂视频网| 欧美日韩国产综合一区二区三区| 中文字幕无码乱码人妻日韩精品| 欧美亚洲国产一卡| 一本到在线视频| 欧美一区二区三区系列电影| 亚洲奶汁xxxx哺乳期| 亚洲第一区第一页| 欧美少妇另类| 最近2019年好看中文字幕视频| 日本在线人成| 九色精品美女在线| jizz一区二区三区| 欧美壮男野外gaytube| 朝桐光一区二区| 成人在线国产精品| 97超碰成人| 蜜桃狠狠色伊人亚洲综合网站| 久久最新网址| 在线电影看在线一区二区三区| 午夜国产一区| 国产乱子伦农村叉叉叉| 日韩激情中文字幕| 一级做a免费视频| 成人一区二区三区| 国产黄色大片免费看| 亚洲欧美一区二区三区孕妇| 国产在线视频卡一卡二| 色婷婷一区二区| www.国产欧美| 亚洲天堂色网站| 国产欧美黑人| 欧美一区第一页| 曰本一区二区| 麻豆久久久av免费| 外国成人免费视频| 人妻熟妇乱又伦精品视频| 免费av网站大全久久| 无码国产精品一区二区免费式直播| xnxx国产精品| 色在线观看视频| 色狠狠桃花综合| 亚洲黄色小说网址| 国产一区二区三区毛片| 丁香花在线观看完整版电影| 国产极品jizzhd欧美| 51社区在线成人免费视频| 日韩午夜视频在线观看| 亚洲大片在线| 亚洲精品20p| 久久亚洲私人国产精品va媚药| 久草视频手机在线| 色偷偷一区二区三区| www精品国产| 日韩在线观看你懂的| 蜜桃av在线播放| 97av影视网在线观看| 国产精品一区二区av交换| 免费人成自慰网站| 狠狠色丁香久久婷婷综合_中| 醉酒壮男gay强迫野外xx| 亚洲精品国产无套在线观| 精品国产www| 日韩精品在线第一页| 国产丝袜精品丝袜| 成人国产精品日本在线| 精品国产精品久久一区免费式 | av电影在线地址| 成人欧美一区二区三区黑人| 精品大片一区二区| 日韩免费毛片视频| eeuss影院一区二区三区| 久久久久久久久精| 欧美一区二区在线观看| 香蕉视频在线播放| 国产精品99久久久久久久久| 日韩大胆成人| 黄色av网址在线播放| 国产成人午夜电影网| 亚洲熟女www一区二区三区| 欧美日韩一二三区| jizz在线观看中文| 国产精品久久久久久婷婷天堂| 美日韩中文字幕| 国模吧无码一区二区三区| va亚洲va日韩不卡在线观看| 日韩av无码中文字幕| 337p日本欧洲亚洲大胆色噜噜| 黄色小说在线播放| 成人动漫在线视频| 黄色在线成人| 97精品人人妻人人| 亚洲国产aⅴ天堂久久| 国产刺激高潮av| 国内精品久久久久久影视8| 91嫩草精品| 91成人在线观看喷潮教学| 成人国产精品免费观看| 国产91av视频| 精品亚洲一区二区| 久久r热视频| 色99中文字幕| 久久国产精品一区二区| 欧美一区免费观看| 欧美一区二区三区色| av免费在线观| 国产精品亚洲综合| 亚洲一区欧美激情| 伊人网在线视频观看| 欧美性大战久久久久久久| av大片在线看| 亚洲xxxxx性| 精品成人久久| 成年人网站免费看| 欧美三级中文字幕| 国产精品va在线观看视色| 99久久免费国| 久久视频一区| 国产成人在线网址| 日韩欧美不卡在线观看视频| 欧亚av在线| 一级日韩一区在线观看| 国产酒店精品激情| 五月天综合激情网| 色天天综合狠狠色| 在线综合色站| 欧美在线观看视频网站| 亚洲欧洲性图库| 日韩在线视频观看免费| 国产大片精品免费永久看nba| 久久性感美女视频| 91传媒理伦片在线观看| 色综合久久九月婷婷色综合| 蜜桃视频在线观看www社区| 岛国视频一区| 免费人成精品欧美精品| 精品爆乳一区二区三区无码av| 日韩电影大片中文字幕| 久久免费资源| 男女超爽视频免费播放| 中文字幕不卡三区| 日本波多野结衣在线| 国产精品亚洲欧美导航| 黄色成人在线网址| 99在线视频免费| 亚洲国产高清自拍| 综合欧美精品| 欧美日韩在线视频一区二区三区|