青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

陳碩的Blog

muduo 與 libevent2 吞吐量對比

libevent 是一款非常好用的 C 語言網絡庫,它也采用 Reactor 模型,正好可以與 muduo 做一對比。

本文用 ping pong 測試來對比 muduo 和 libevent2 的吞吐量,測試結果表明 muduo 吞吐量平均比 libevent2 高 18% 以上,個別情況達到 70%。

測試對象

測試環境與測試方法

測試環境與前文《muduo 與 boost asio 吞吐量對比》相同。

我自己編寫了 libevent2 的 ping pong 測試代碼,地址在 http://github.com/chenshuo/recipes/tree/master/pingpong/libevent/ 。由于這個測試代碼沒有使用多線程,所以本次測試只對比單線程下的性能。

測試內容為:客戶端與服務器運行在同一臺機器,均為單線程,測試并發連接數為 1/10/100/1000/10000 時的吞吐量。

在同一臺機器測試吞吐量的原因:

  • 現在的 CPU 很快,即便是單線程單 TCP 連接也能把 Gigabit 以太網的帶寬跑滿。如果用兩臺機器,所有的吞吐量測試結果都將是 100 MiB/s,失去了對比的意義。(或許可以對比哪個庫占的 CPU 少。)
  • 在同一臺機器上測試,可以在 CPU 資源相同的情況下,單純對比網絡庫的效率。也就是說單線程下,服務端和客戶端各占滿 1 個 CPU,比較哪個庫的吞吐量高。

測試結果

單線程吞吐量測試,數字越大越好:

muduo_libevent_16k

以上結果讓人大跌眼鏡,muduo 居然比 libevent 快 70%!跟蹤 libevent2 的源代碼發現,它每次最多從 socket 讀取 4096 字節的數據 (證據在 buffer.c 的 evbuffer_read() 函數),怪不得吞吐量比 muduo 小很多。因為在這一測試中,muduo 每次讀取 16384 字節,系統調用的性價比較高。

buffer.c:#define EVBUFFER_MAX_READ      4096

為了公平起見,我再測了一次,這回兩個庫都發送 4096 字節的消息。

muduo_libevent_4k

測試結果表明 muduo 吞吐量平均比 libevent2 高 18% 以上。

討論

由于 libevent2 每次最多從網絡讀取 4096 字節,大大限制了它的吞吐量。

posted @ 2010-09-05 19:14 陳碩 閱讀(3516) | 評論 (3)編輯 收藏

muduo 與 boost asio 吞吐量對比

muduo (http://code.google.com/p/muduo) 是一個基于 Reactor 模式的 C++ 網絡庫,我在編寫它的時候并沒有以高并發高吞吐為主要目標,但出乎我的意料,ping pong 測試表明,muduo 吞吐量比 boost.asio 高 15% 以上。

測試對象

測試環境

硬件:DELL 490 工作站,雙路 Intel quad core Xeon E5320 CPU,16G 內存

操作系統:Ubuntu Linux Server 10.04.1 LTS x86_64

編譯器:g++ 4.4.3

測試方法

依據 asio 性能測試 http://think-async.com/Asio/LinuxPerformanceImprovements 的辦法,用 ping pong 協議來測試吞吐量。

簡單地說,ping pong 協議是客戶端和服務器都實現 echo 協議。當 TCP 連接建立時,客戶端向服務器發送一些數據,服務器會 echo 回這些數據,然后客戶端再 echo 回服務器。這些數據就會像乒乓球一樣在客戶端和服務器之間來回傳送,直到有一方斷開連接為止。這是用來測試吞吐量的常用辦法。

asio 的測試代碼取自 http://asio.cvs.sourceforge.net/viewvc/asio/asio/src/tests/performance/ ,未作更改。

muduo 的測試代碼在 0.1.1 軟件包內,路徑為 examples/pingpong/,代碼如 http://gist.github.com/564985 所示。

muduo 和 asio 的優化編譯參數均為 -O2 -finline-limit=1000

$ BUILD_TYPE=release ./build.sh  # 編譯 muduo 的優化版本

我主要做了兩項測試:

  • 單線程測試,測試并發連接數為 1/10/100/1000/10000 時的吞吐量。
  • 多線程測試,并發連接數為 100 或 1000,服務器和客戶端的線程數同時設為 1/2/3/4。(由于我家里只有一臺 8 核機器,而且服務器和客戶端運行在同一臺機器上,線程數大于 4 沒有意義。)

所有測試中,ping pong 消息的大小均為 16k bytes。測試用的 shell 腳本可從 http://gist.github.com/564985 下載。

測試結果

單線程測試的結果,數字越大越好:

single_thread

多線程測試的結果,數字越大越好:

multiple_thread_100conn

image007

測試結果表明 muduo 吞吐量平均比 asio 高 15% 以上。

討論

muduo 出乎意料地比 asio 性能優越,我想主要得益于其簡單的設計和簡潔的代碼。

asio 在多線程測試中表現不佳,我猜測其主要原因是測試代碼只使用了一個 io_service,如果改用“io_service per CPU”的話,性能應該有所提高。我對 asio 的了解程度僅限于能讀懂其代碼,希望能有 asio 高手編寫“io_service per CPU”的 ping pong 測試,以便與 muduo 做一個公平的比較。

ping pong 測試很容易實現,歡迎其他網絡庫(ACE、POCO、libevent 等)也能加入到對比中來,期待這些庫的高手出馬。

posted @ 2010-09-04 16:30 陳碩 閱讀(4872) | 評論 (5)編輯 收藏

發布一個基于 Reactor 模式的 C++ 網絡庫

發布一個基于 Reactor 模式的 C++ 網絡庫

陳碩 (giantchen_AT_gmail)

Blog.csdn.net/Solstice

2010 Aug 30

本文主要介紹 muduo 網絡庫的使用。其設計與實現將有另文講解。

目錄

由來 1

下載與編譯 2

例子 2

基本結構 3

公開接口 4

內部實現 4

線程模型 5

結語 5

由來

半年前我寫了一篇《學之者生,用之者死——ACE歷史與簡評》,其中提到“我心目中理想的網絡庫”的樣子:

  • 線程安全,支持多核多線程
  • 不考慮可移植性,不跨平臺,只支持 Linux,不支持 Windows。
  • 在不增加復雜度的前提下可以支持 FreeBSD/Darwin,方便將來用 Mac 作為開發用機,但不為它做性能優化。也就是說 IO multiplexing 使用 poll 和 epoll。
  • 主要支持 x86-64,兼顧 IA32
  • 不支持 UDP,只支持 TCP
  • 不支持 IPv6,只支持 IPv4
  • 不考慮廣域網應用,只考慮局域網
  • 只支持一種使用模式:non-blocking IO + one event loop per thread,不考慮阻塞 IO
  • API 簡單易用,只暴露具體類和標準庫里的類,不使用 non-trivial templates,也不使用虛函數
  • 只滿足常用需求的 90%,不面面俱到,必要的時候以 app 來適應 lib
  • 只做 library,不做成 framework
  • 爭取全部代碼在 5000 行以內(不含測試)
  • 以上條件都滿足時,可以考慮搭配 Google Protocol Buffers RPC

在想清楚這些目標之后,我開始第三次嘗試編寫自己的 C++ 網絡庫。與前兩次不同,這次我一開始就想好了庫的名字,叫 muduo (木鐸),并在 Google code 上創建了項目: http://code.google.com/p/muduo/ 。muduo 的主體內容在 5 月底已經基本完成,現在我把它開源。

本文主要介紹 muduo 網絡庫的使用,其設計與實現將有另文講解。

下載與編譯

下載地址: http://muduo.googlecode.com/files/muduo-0.1.0-alpha.tar.gz

SHA1 Checksum: 5d3642e311177ded89ed0d15c10921738f8c984c

Muduo 使用了 Linux 較新的系統調用,要求 Linux 的內核版本大于 2.6.28 (我自己用的是 2.6.32 )。在 Debian Squeeze / Ubuntu 10.04 LTS 上編譯測試通過,32 位和 64 位系統都能使用。

Muduo 采用 CMake 為 build system,安裝方法:

$ sudo apt-get install cmake

Muduo 依賴 Boost,很容易安裝:

$ sudo apt-get install libboost1.40-dev # 或 libboost1.42-dev

編譯方法很簡單:

$ tar zxf muduo-0.1.0-alpha.tar.gz

$ cd muduo/

$ ./build.sh

# 編譯生成的可執行文件和靜態庫文件分別位于 ../build/debug/{bin,lib}

如果要編譯 release 版,可執行

$ BUILD_TYPE=release ./build.sh

# 編譯生成的可執行文件和靜態庫文件分別位于 ../build/release/{bin,lib}

編譯完成之后請試運行其中的例子。比如 bin/inspector_test ,然后通過瀏覽器訪問 http://10.0.0.10:12345/ 或 http://10.0.0.10:12345/proc/status,其中 10.0.0.10 替換為你的 Linux box 的 IP。

例子

Muduo 附帶了幾十個小例子,位于 examples 目錄。其中包括從 Boost.Asio、JBoss Netty、Python Twisted 等處移植過來的例子。

examples

|-- simple # 簡單網絡協議的實現

|   |-- allinone  # 在一個程序里同時實現下面 5 個協議

|   |-- chargen   # RFC 864,可測試帶寬

|   |-- daytime # RFC 867

|   |-- discard # RFC 863

|   |-- echo # RFC 862

|   |-- time # RFC 868

|   `-- timeclient # time 協議的客戶端

|-- hub # 一個簡單的 pub/sub/hub 服務,演示應用級的廣播

|-- roundtrip # 測試兩臺機器的網絡延時與時間差

|-- asio # 從 Boost.Asio 移植的例子

|   |-- chat # 聊天服務

|   `-- tutorial # 一系列 timers

|-- netty # 從 JBoss Netty 移植的例子

|   |-- discard # 可用于測試帶寬,服務器可多線程運行

|   |-- echo # 可用于測試帶寬,服務器可多線程運行

|   `-- uptime # TCP 長連接

`-- twisted # 從 Python Twisted 移植的例子

    `-- finger # finger01 ~ 07

基本結構

Muduo 的目錄結構如下。

muduo

|-- base # 與網絡無關的基礎代碼,已提前發布

`-- net # 網絡庫

    |-- http # 一個簡單的可嵌入的 web 服務器

    |-- inspect # 基于以上 web 服務器的“窺探器”,用于報告進程的狀態

    `-- poller # poll(2) 和 epoll(4) 兩種 IO multiplexing 后端

Muduo 是基于 Reactor 模式的網絡庫,其核心是個事件循環 EventLoop,用于響應計時器和 IO 事件。Muduo 采用基于對象(object based)而非面向對象(object oriented)的設計風格,其接口多以 boost::function + boost::bind 表達

Muduo 的頭文件明確分為客戶可見和客戶不可見兩類。客戶可見的為白底,客戶不可見的為灰底。

inc

這里簡單介紹各個頭文件及 class 的作用,詳細的介紹留給以后的博客。

公開接口
  • Buffer 仿 Netty ChannelBuffer 的 buffer class,數據的讀寫透過 buffer 進行
  • InetAddress 封裝 IPv4 地址 (end point),注意,muduo 目前不能解析域名,只認 IP
  • EventLoop 反應器 Reactor,用戶可以注冊計時器回調
  • EventLoopThread 啟動一個線程,在其中運行 EventLoop::loop()
  • TcpConnection 整個網絡庫的核心,封裝一次 TCP 連接
  • TcpClient 用于編寫網絡客戶端,能發起連接,并且有重試功能
  • TcpServer 用于編寫網絡服務器,接受客戶的連接
  • 在這些類中,TcpConnection 的生命期依靠 shared_ptr 控制(即用戶和庫共同控制)。Buffer 的生命期由 TcpConnection 控制。其余類的生命期由用戶控制。
  • HttpServer 和 Inspector,暴露出一個 http 界面,用于監控進程的狀態,類似于 Java JMX。這么做的原因是,《程序員修煉之道》第 6 章第 34 條提到“對于更大、更復雜的服務器代碼,提供其操作的內部試圖的一種漂亮技術是使用內建的 Web 服務器”,Jeff Dean 也說“(每個 Google 的服務器進程)Export HTML-based status pages for easy diagnosis”。
內部實現
  • Channel 是 selectable IO channel,負責注冊與響應 IO 事件,它不擁有 file descriptor。它是 Acceptor、Connector、EventLoop、TimerQueue、TcpConnection 的成員,生命期由后者控制。
  • Socket 封裝一個 file descriptor,并在析構時關閉 fd。它是 Acceptor、TcpConnection 的成員,生命期由后者控制。EventLoop、TimerQueue 也擁有 fd,但是不封裝為 Socket。
  • SocketsOps 封裝各種 sockets 系統調用。
  • EventLoop 封裝事件循環,也是事件分派的中心。它用 eventfd(2) 來異步喚醒,這有別于傳統的用一對 pipe(2) 的辦法。它用 TimerQueue 作為計時器管理,用 Poller 作為 IO Multiplexing。
  • Poller 是 PollPoller 和 EPollPoller 的基類,采用“電平觸發”的語意。它是 EventLoop 的成員,生命期由后者控制。
  • PollPoller 和 EPollPoller 封裝 poll(2) 和 epoll(4) 兩種 IO Multiplexing 后端。Poll 的存在價值是便于調試,因為 poll(2) 調用是上下文無關的,用 strace 很容易知道庫的行為是否正確。
  • Connector 用于發起 TCP 連接,它是 TcpClient 的成員,生命期由后者控制。
  • Acceptor 用于接受 TCP 連接,它是 TcpServer 的成員,生命期由后者控制。
  • TimerQueue 用 timerfd 實現定時,這有別于傳統的設置 poll/epoll_wait 的等待時長的辦法。為了簡單起見,目前用鏈表來管理 Timer,如果有必要可改為優先隊列,這樣復雜度可從 O(n) 降為 O(ln n) (某些操作甚至是 O(1))。它是 EventLoop 的成員,生命期由后者控制。
  • EventLoopThreadPool 用于創建 IO 線程池,也就是說把 TcpConnection 分派到一組運行 EventLoop 的線程上。它是 TcpServer 的成員,生命期由后者控制。

線程模型

Muduo 的線程模型符合我主張的 one loop per thread + thread pool 模型。每個線程最多有一個 EventLoop。每個 TcpConnection 必須歸某個 EventLoop 管理,所有的 IO 會轉移到這個線程,換句話說一個 file descriptor 只能由一個線程讀寫。TcpConnection 所在的線程由其所屬的 EventLoop 決定,這樣我們可以很方便地把不同的 TCP 連接放到不同的線程去,也可以把一些 TCP 連接放到一個線程里。TcpConnection 和 EventLoop 是線程安全的,可以跨線程調用。TcpServer 直接支持多線程,它有兩種模式:

1. 單線程,accept 與 TcpConnection 用同一個線程做 IO。

2. 多線程,accept 與 EventLoop 在同一個線程,另外創建一個 EventLoopThreadPool,新到的連接會按 round-robin 方式分配到線程池中。

結語

Muduo 是我對常見網絡編程任務的總結,用它我能很容易地編寫多線程的 TCP 服務器和客戶端。Muduo 是我業余時間的作品,代碼估計還有很多 bug,功能也不完善(例如不支持 signal 處理),待日后慢慢改進吧。

posted @ 2010-08-29 23:42 陳碩 閱讀(12110) | 評論 (20)編輯 收藏

發布一個 Linux 下的 C++ 多線程庫

發布一個我自己業余時間編寫的 C++ 多線程庫 for Linux,這個庫只有不到 1000 行源代碼,封裝了 pthreads 的常用功能(互斥器、條件變量、線程),實現了簡單的線程池,并仿照 java concurrent 包編寫了 BlockingQueue 和 CountDownLatch。庫里的每個 class 都提供了使用樣例。

這個庫的內容:

  • 整數的原子操作, AtomicInt32 和 AtomicInt64
  • 線程,Thread
  • 線程池,ThreadPool
  • 互斥器與條件變量, MutexLock,MutexLockGuard 與 Condition
  • 帶調用棧信息 (stack trace) 的異常基類,Exception
  • 仿 Java concurrent 的 BlockingQueue 和 CountDownLatch
  • Singleton 與 ThreadLocal

注:我故意沒有提供信號量 Semaphore 的封裝。將來或許會增加讀寫鎖的封裝,如果我在博客中用到的話。

Thread 和 ThreadPool 的接口設計采用了《以 boost::function 和 boost:bind 取代虛函數》里提倡的風格,沒有使用繼承和基類。

注意,CurrentThread 有一個 thread local 變量 t_threadName,其作用是在調試和分析 core dump 時打印線程的名稱,例如:

(gdb) p 'muduo::CurrentThread::t_threadName'
$4 = 0x4057fe "ThreadPool2"

MutexLock,MutexLockGuard 與 Condition 的使用請參考《多線程服務器的常用編程模型》。

CountDownLatch 的使用樣例見 test/BlockingQueue_test.cc

git 下載地址: http://github.com/chenshuo/recipes

瀏覽源代碼: http://github.com/chenshuo/recipes/tree/master/thread/

這個庫在 Debian Squeeze 和 Ubuntu 10.04 LTS 下編譯測試通過,適用于 x86 和 x86-64 平臺。

posted @ 2010-08-21 23:47 陳碩 閱讀(9838) | 評論 (37)編輯 收藏

整合 Google 開源 C++ 代碼

     摘要: Google 開源了很多優秀的 C++ 程序庫,本文介紹如何將其中幾個整合到一起。
本文涉及的 Google 庫有:
gflags - 命令行參數解析。可以完全用命令行來配置應用程序,省去配置文件。
gtest - C++ 單元測試框架
gmock - C++ 單元測試中用到的 mock
glog - 日志庫
protobuf - 高效的網絡協議格式
還有第三方的 libunwind 和 zlib。  閱讀全文

posted @ 2010-04-17 21:43 陳碩 閱讀(15163) | 評論 (9)編輯 收藏

對 C++ 歷史的個人觀點

     摘要: C++ 語言設計的三大約束,歷史發展中的謊言與真相。  閱讀全文

posted @ 2010-04-06 21:34 陳碩 閱讀(8503) | 評論 (25)編輯 收藏

學之者生,用之者死——ACE歷史與簡評

     摘要: ACE 是現代面向對象網絡編程的鼻祖,確立了許多重要模式,如 Reactor、Acceptor 等,重要到我們甚至覺得網絡編程就應該是那樣的。但為什么 ACE 叫好不叫座?大名鼎鼎卻使用者寥寥?本文談談從其誕生背景、代碼質量等方面談談我的個人觀點。  閱讀全文

posted @ 2010-03-11 20:34 陳碩 閱讀(6759) | 評論 (4)編輯 收藏

多線程服務器的常用編程模型

本文主要講我個人在多線程開發方面的一些粗淺經驗。總結了一兩種常用的線程模型,歸納了進程間通訊與線程同步的最佳實踐,以期用簡單規范的方式開發多線程程序。萬字長文,慎入,有 PDF 版下載。

本文 PDF 版下載: http://files.cppblog.com/Solstice/multithreaded_server.pdf


posted @ 2010-02-12 16:51 陳碩 閱讀(4461) | 評論 (7)編輯 收藏

當析構函數遇到多線程 —— C++ 中線程安全的對象回調

     摘要: 編寫線程安全的類不是難事,用同步原語保護內部狀態即可。但是對象的生與死不能由對象自身擁有的互斥器來保護。如何保證即將析構對象 x 的時候,不會有另一個線程正在調用 x 的成員函數?或者說,如何保證在執行 x 的成員函數期間,對象 x 不會在另一個線程被析構?如何避免這種競態條件是 C++ 多線程編程面臨的基本問題,可以借助 boost 的 shared_ptr 和 weak_ptr 完美解決。這也是實現線程安全的 Observer 模式的必備技術。全文 1 萬 2 千余字,有 PDF 版下載。  閱讀全文

posted @ 2010-01-28 08:13 陳碩 閱讀(7146) | 評論 (5)編輯 收藏

僅列出標題
共6頁: 1 2 3 4 5 6 
<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

導航

統計

常用鏈接

隨筆分類

隨筆檔案

相冊

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久免费午夜影院| 免费看的黄色欧美网站| 国内成+人亚洲+欧美+综合在线| 欧美日韩hd| 欧美日韩亚洲三区| 国产精品亚洲综合久久| 国产日韩欧美一区二区三区四区| 国产日韩综合| 亚洲国产精品t66y| 亚洲最新色图| 午夜精品久久久久久久99樱桃| 久久精品72免费观看| 久久视频这里只有精品| 亚洲欧洲一区二区天堂久久 | 国色天香一区二区| 亚洲国内高清视频| 欧美亚洲日本网站| 欧美激情视频给我| 在线综合欧美| 麻豆精品传媒视频| 国产精品三级久久久久久电影| 一区二区在线不卡| 亚洲专区在线视频| 欧美国产视频在线| 欧美亚洲三区| 欧美日韩直播| 亚洲国产综合91精品麻豆| 午夜日韩在线观看| 亚洲欧洲综合另类| 久久成人免费电影| 欧美三级电影大全| 亚洲人成网站精品片在线观看| 小黄鸭精品aⅴ导航网站入口| 欧美激情aⅴ一区二区三区| 午夜精品美女自拍福到在线| 欧美久久久久免费| 亚洲高清在线观看| 久久手机免费观看| 亚洲一级片在线观看| 久久国产日本精品| a91a精品视频在线观看| 欧美有码视频| 亚洲精品乱码久久久久久蜜桃91| 欧美在线视频在线播放完整版免费观看| 欧美国产视频一区二区| 在线观看国产日韩| 久久久久久久网| 亚洲专区免费| 国产精品免费区二区三区观看| 999亚洲国产精| 亚洲国产精品久久久久秋霞蜜臀| 久久精品综合网| 激情欧美一区二区三区在线观看 | 欧美福利视频| 欧美在线观看视频一区二区| 国产精品亚洲美女av网站| 欧美高清视频免费观看| 1024亚洲| 欧美电影电视剧在线观看| 久久亚洲综合色| 有坂深雪在线一区| 蜜臀久久99精品久久久久久9| 久久爱91午夜羞羞| 伊人久久婷婷色综合98网| 久久在线精品| 久久―日本道色综合久久| 在线免费日韩片| 欧美国产日韩一区二区三区| 欧美成人国产一区二区| 亚洲美女色禁图| 日韩一级大片在线| 国产精品欧美日韩一区二区| 欧美一区二区三区四区在线观看地址 | 亚洲国产精品成人综合色在线婷婷| 久久中文久久字幕| 免费亚洲网站| 亚洲图片在区色| 午夜精品久久久久久久久久久久| 国产亚洲一本大道中文在线| 美日韩精品免费| 欧美精品一区二区蜜臀亚洲| 亚洲永久在线| 久久精品理论片| 99精品久久| 先锋影音一区二区三区| 亚洲国产精品激情在线观看 | 久久久久国产精品www| 最新国产乱人伦偷精品免费网站| 亚洲人成在线观看网站高清| 国产精品久久综合| 免播放器亚洲一区| 国产精品久久久久久模特 | 国产精品专区h在线观看| 久久精品91久久久久久再现| 美女网站在线免费欧美精品| 亚洲私人影院在线观看| 午夜日韩av| 日韩亚洲欧美一区| 久久精品国产v日韩v亚洲 | 亚洲午夜激情网页| 一区二区在线观看视频| 亚洲小说欧美另类社区| 亚洲国产天堂网精品网站| 亚洲专区在线视频| 夜夜嗨av一区二区三区 | 国产精品久久久久影院亚瑟| 久久综合色8888| 国产九色精品成人porny| 亚洲经典视频在线观看| 国产一区在线免费观看| 亚洲午夜极品| 洋洋av久久久久久久一区| 久久久国产亚洲精品| 香港久久久电影| 欧美日韩激情网| 亚洲第一精品夜夜躁人人躁| 韩国成人理伦片免费播放| 亚洲一区二区高清| 中文av一区特黄| 欧美福利网址| 欧美激情一区在线| 一区二区在线观看视频| 欧美一区二区精美| 先锋a资源在线看亚洲| 欧美午夜精品久久久久久超碰| 亚洲国产合集| 亚洲国产女人aaa毛片在线| 久久偷看各类wc女厕嘘嘘偷窃| 久久九九精品99国产精品| 国产精品美女一区二区| 一本色道久久综合狠狠躁篇的优点 | 亚洲成人在线视频网站| 久久9热精品视频| 久久精品人人| 国产一区二区三区在线观看免费视频| 亚洲视频网站在线观看| 亚洲视频在线观看三级| 欧美三级网址| 亚洲另类在线一区| 一区二区三区高清不卡| 欧美日韩亚洲高清一区二区| 亚洲毛片av| 亚洲午夜视频在线观看| 国产精品久久看| 欧美在线关看| 欧美.www| 99ri日韩精品视频| 欧美性jizz18性欧美| 午夜亚洲福利| 亚洲精品中文字幕女同| 欧美高清在线| 洋洋av久久久久久久一区| 亚洲欧美日韩专区| 国产在线观看精品一区二区三区| 午夜精品av| 欧美jizz19性欧美| 一区二区欧美视频| 国产精品日韩欧美一区| 久久久久久久久伊人| 亚洲人成网站色ww在线| 欧美一区二区三区视频免费播放 | 亚洲色在线视频| 国产精品日本欧美一区二区三区| 久久国产精品一区二区三区四区| 欧美福利视频在线| 亚洲私拍自拍| 黄色日韩网站视频| 欧美日韩ab| 久久精品99久久香蕉国产色戒 | 久久久精品日韩| 91久久久久久久久| 国产精品你懂的在线| 久色婷婷小香蕉久久| 这里是久久伊人| 噜噜噜躁狠狠躁狠狠精品视频| 一区二区三区高清视频在线观看| 国产午夜精品视频免费不卡69堂| 欧美成人官网二区| 午夜精品福利一区二区三区av| 亚洲国产成人久久| 久久九九热re6这里有精品| 亚洲最新色图| 亚洲电影毛片| 国产视频一区二区三区在线观看| 欧美国产综合一区二区| 欧美在线日韩在线| 一区二区三区国产在线观看| 免费欧美高清视频| 欧美在线首页| 亚洲免费视频观看| 亚洲最新在线视频| 亚洲国产成人午夜在线一区 | 欧美国产亚洲精品久久久8v| 欧美在线观看一区| 亚洲视频福利| 一区二区不卡在线视频 午夜欧美不卡在| 免费成人av| 免费观看一区| 免费日韩精品中文字幕视频在线| 久久久久久久久岛国免费|