成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

并發模擬工具詳解

開發 開發工具
嚴格來說postMan并不是并發請求,而是串行執行的,現在用postMan更多的是用來測試Http連接的一個工具,但是也是一個很實用的工具,也有一些比較強大的功能和優點

[[380130]]

 簡介:

  • 一、Psotman
  • 二、Apache Bench(AB)
  • 三、JMeter
  • 四、代碼

一、Psotman:Http請求模擬工具

嚴格來說postMan并不是并發請求,而是串行執行的,現在用postMan更多的是用來測試Http連接的一個工具,但是也是一個很實用的工具,也有一些比較強大的功能和優點

1.1 下載地址

  1. 1) Postman for MAC:https://app.getpostman.com/app/download/osx64?utm_source=site&utm_medium=apps&utm_campaign=macapp&_ga=2.21151352.2119858274.1527039878-1088353859.1527039878 
  2. 2) Postman for windows X64:https://app.getpostman.com/app/download/win64?_ga=2.201562513.1250696341.1530543681-1582181135.1530543681 
  3. 3) Postman for windows X86:https://app.getpostman.com/app/download/win32?_ga=2.21151352.2119858274.1527039878-1088353859.1527039878 
  4. 4) Postman for linux X64:https://app.getpostman.com/app/download/linux64?_ga=2.96050783.2119858274.1527039878-1088353859.1527039878 
  5. 5) Postman for Linux X86:https://app.getpostman.com/app/download/linux32?_ga=2.96050783.2119858274.1527039878-1088353859.1527039878 
  6. 6) 官網地址:https://www.getpostman.com/ 

1.2 操作說明(以win64為例)

1、打開Postman,輸入我們需要測試的網址,點擊左邊的"+",保存請求


2、點擊"+"后,彈出下面提示,保存鏈接地址生成測試文件夾名稱

3、保存成功后,選擇"collections"后選擇文件夾名為"gbfTest"的,點擊小三角——點擊Run

 

4、這里我們可以設置請求次數和間隔時間,一般間隔時間會設置為0,設置好之后,我們點擊Run gbfTest運行

5、查看結果,從圖中我們可以看到百度的響應速度還是很快的


6、點擊 Run Summary 可以看到運行結果概述


7、測試全部通過


8、測試結果可以通過點擊Export Results按鈕進行導出,方便分析每次的請求時間

 

 

二、Apace Bench(AB):Apache附帶的工具,測試網站性能

2.1 簡介

Apache Bench 是 Apache 服務器自帶的一個web壓力測試工具,簡稱ab。ab又是一個命令行工具,對發起負載的本機要求很低,根據ab命令可以創建很多的并發訪問線程,模擬多個訪問者同時對某一URL地址進行訪問,因此可以用來測試目標服務器的負載壓力。總的來說ab工具小巧簡單,它不僅可以對apache服務器進行網站訪問壓力測試,也可以對或其它類型的服務器進行壓力測試。比如nginx、tomcat、IIS等,上手學習較快,可以提供需要的基本性能指標,但是沒有圖形化結果,不能監控

2.2 原理

ab命令會創建多個并發訪問線程,模擬多個訪問者同時對某一URL地址進行訪問。它的測試目標是基于URL的,因此,它既可以用來測試apache的負載壓力,也可以測試nginx、lighthttp、tomcat、IIS等其它Web服務器的壓力

2.3 Apache Bench安裝

Apache服務器,下載地址:https://www.apachelounge.com/download/

選擇:httpd-2.4.41-win64-VS16 下載目錄結構:

2.4 Apache Bench 使用

運行環境:Windows7 Apache Bench版本:httpd-2.4.41-win64-VS16

1、進入cmd目錄下,進入我們解壓好的Apache Bench目錄下


3 使用命令

  1. ab -c 10 -n 10 http://www.baidu.com/ 或者 ab.exe -n 1000 -c 500 http://www.baidu.com 

ab -c 10 -n 10 http://www.baidu.com/ 或者 ab.exe -n 1000 -c 500 http://www.baidu.com

對百度首頁進行一個請求總數為1000,本次請求并發數為500的測試


參數分析:

  1. C:\Users\Lenovo\Downloads\httpd-2.4.41-win64-VS16\Apache24\bin>ab.exe -n 1000 -c 
  2.  500 http://www.baidu.com/path 
  3. This is ApacheBench, Version 2.3 <$Revision: 1843412 $> 
  4. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ 
  5. Licensed to The Apache Software Foundation, http://www.apache.org/ 
  6.  
  7. Benchmarking www.baidu.com (be patient) 
  8. Completed 100 requests 
  9. Completed 200 requests 
  10. Completed 300 requests 
  11. Completed 400 requests 
  12. Completed 500 requests 
  13. Completed 600 requests 
  14. Completed 700 requests 
  15. Completed 800 requests 
  16. Completed 900 requests 
  17. Completed 1000 requests 
  18. Finished 1000 requests 
  19.  
  20.  
  21. Server Software:        Apache      #測試服務器的名字 
  22. Server Hostname:        www.baidu.com  #請求的URL主機名 
  23. Server Port:            80        #請求端口 
  24.  
  25. Document Path:          /path      #請求路徑   
  26. Document Length:        222 bytes    #頁面大小 
  27.  
  28. Concurrency Level:      500        #并發量,設置的參數之一 
  29. Time taken for tests:   45.805 seconds  #整個測試所用的時間/秒 
  30. Complete requests:      1000      #完成的請求數 
  31. Failed requests:        0        #失敗的請求數 
  32. Non-2xx responses:      1000      #接收到的HTTP響應數據的頭信息中含有2XX以外的狀態碼,則會在測試結果中顯示另一個名為“Non-2xx responses”的統計項,用于統計這部分請求數(1000) 
  33. Total transferred:      484000 bytes  #表示所有請求的響應數據長度總和 
  34. HTML transferred:       222000 bytes  #表示所有請求的響應數據中正文數據的總和 
  35. Requests per second:    21.83 [#/sec] (mean)    #吞吐率,吞吐率是與并發數相關的,使請求總數相同,但如果并發數不一樣,吞吐率還是很可能有很大差異的 
  36. Time per request:       22902.310 [ms] (mean)    #用戶平均請求等待時間。也就是一次并發總的時間 
  37. Time per request:       45.805 [ms] (mean, across all concurrent requests)    #服務器平均請求等待時間。也就是一次請求(在本例中也就是500中的平均每一次)所需時間 
  38. Transfer rate:          10.32 [Kbytes/sec] received    #這些請求在單位時間內從服務器獲取的數據長度 
  39.  
  40. Connection Times (ms) 
  41.               min  mean[+/-sd] median   max 
  42. Connect:        9   46 460.5     11    9060 
  43. Processing:    25 20066 13796.4  14798   36549 
  44. Waiting:       14 16163 15029.9   8460   36484 
  45. Total:         37 20111 13785.1  22804   36562 
  46.  
  47. Percentage of the requests served within a certain time (ms) 
  48.   50%  22804     #50%用戶請求在22804ms內返回 
  49.   66%  33043    #66%用戶請求在33043ms內返回 
  50.   75%  34181 
  51.   80%  34791 
  52.   90%  35877 
  53.   95%  36416 
  54.   98%  36502    #98%用戶請求在36502ms內返回 
  55.   99%  36512 
  56.  100%  36562 (longest request) 

命令參數參考:

  1. -n requests Number of requests to perform //本次測試發起的總請求數 
  2. -c concurrency Number of multiple requests to make   //一次產生的請求數(或并發數) 
  3. -t timelimit Seconds to max. wait for responses    //測試所進行的最大秒數,默認沒有時間限制。 
  4. -r Don't exit on socket receive errors.    // 拋出異常繼續執行測試任務 
  5. -p postfile File containing data to POST  //包含了需要POST的數據的文件,文件格式如“p1=1&p2=2”.使用方法是 -p 111.txt 
  6. -T content-type Content-type header for POSTing 
  7. //POST數據所使用的Content-type頭信息,如 -T “application/x-www-form-urlencoded” 。 (配合-p) 
  8. -v verbosity How much troubleshooting info to print 
  9. //設置顯示信息的詳細程度 – 4或更大值會顯示頭信息, 3或更大值可以顯示響應代碼(404, 200等), 2或更大值可以顯示警告和其他信息。 -V 顯示版本號并退出。 
  10. -C attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3” (repeatable
  11. //-C cookie-name=value 對請求附加一個Cookie:行。 其典型形式是name=value的一個參數對。此參數可以重復,用逗號分割。 
  12. 提示:可以借助session實現原理傳遞 JSESSIONID參數, 實現保持會話的功能,如-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。 
  13. -w Print out results in HTML tables  //以HTML表的格式輸出結果。默認時,它是白色背景的兩列寬度的一張表。 

2.5 使用注意

1、MAC中自帶了Apache。

2、在使用ab命令時,并發了過高會出現錯誤:Too many open files,由于系統打開文件數量限制了具有輕量化特點的bench還是很適合中小企業使用,尤其在于模擬訪問頁面的多機測試

三、JMeter:Apache組織開發的壓力測試工具(使用比較多的工具)

3.1 簡介

Apache JMeter是一款純java編寫負載功能測試和性能測試開源工具軟件。相比Loadrunner而言,JMeter小巧輕便且免費,逐漸成為了主流的性能測試工具,是每個測試人員都必須要掌握的工具之一

JDK版本:1.8 運行環境:Windows 7 64 JMeter版本:3.3

注意:安裝JMeter需要 Java8和8以上的JDK版本

3.2 JDK安裝(如果已經安裝JDK 1.8 忽略這一步)

1、jdk官網下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

2、選擇 Java SE 8u231,點擊JDK下載


安裝下載的JDK

配置系統環境變量 具體可以自行查找資料,這里就不做過多描述

3.2 JMeter安裝

1、官網下載地址:JMeter地址:http://jmeter.apache.org/download_jmeter.cgi

2、下載最新JMeter 5.1.1 版本:Apache JMeter 5.1.1 (Requires Java 8+)

3、下載完成后解壓zip包,雙擊bin目錄下jmeter.bat文件


3.3 JMeter 使用

1、雙擊bin目錄下jmeter.bat文件后,打開Apache JMeter工具


2、案例測試(Test Plan - > Add - > Thread(User) - > Thread Group)

3、設置名稱和線程數


線程參數解讀:Number of Threads (users):虛擬用戶數(也就是線程數),一個虛擬用戶占用一個進程或線程Ramp-Up Period(in seconds):準備時長,設置的虛擬用戶數需要多長時間全部啟動。

Loop Count:循環次數每個線程發送請求的次數

如果線程數為20,循環次數為100,那么每個線程發送100次請求。總請求數為20*100=2000 。

如果勾選了“Forever”,那么所有線程會一直發送請求,一到選擇停止運行腳本。

Delay Thread creation until needed:直到需要時延遲線程的創建

Scheduler:調度器,設置線程組啟動的開始時間和結束時間(配置調度器時,需要勾選循環次數為永遠)

Duration(Seconds):持續時間(秒),測試持續時間,會覆蓋結束時間

Startup delay(Seconds):啟動延遲(秒),測試延遲啟動時間,會覆蓋啟動時間

4、添加Http請求

右鍵點擊,Htto請求 > Add > Sampler > Http Request

接下來我們對接口 https://www.baidu.com/s?ie=UTF-8&wd=edg進行性能測試,如下圖所示:


請求參數詳解:

  • Web Server(Http服務): 1、Protocol[http]:協議,向目標服務器發送HTTP請求協議,可以是HTTP或HTTPS,默認為HTTP 2、服務器名稱或IP:HTTP請求發送的目標服務器名稱(域名)或IP 3、Port Number:端口號
  • Http Reuqeset(Http請求體): 1、Method:請求方法類型,有GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等 2、path:目標URL路徑,除去服務器地址、端口和請求參數后所得到的數據 3、Content encoding:編碼方式,設置為 UTF-8
  • 請求參數: 設置請求參數,都在下面的列表中進行設置,
  • 列表參數解讀:Name:請求參數名 Value:請求值 URL Encode:是否Url編碼 Conten-Type:內容類型,有需要自行調整(一般選擇默認即可) include Equals:是否包含等于

注意:參數傳入中文時需要勾選“URL Encode”

這里的按鈕都是針對列表中的數據進行操作的

  1. Detail 
  2. :查看參數詳情 
  3.  
  4. Add 
  5. :添加一行列表請求參數 
  6.  
  7. Delte 
  8. :刪除一行數據 
  9.  
  10. Up 
  11. :設置列表參數上移 
  12.  
  13. Down 
  14. :設置列表參數下移 
  15.  
  16. add from  
  17. Clipdoard 
  18. :從我們復制的內容中進行添加 

5、添加察看結果樹

1、右鍵點擊 Http請求 > Add > Listener > View Results Tree

2、這里我們設置響應數據格式:HTMLSourceFormatted,點擊運行我們就可以看到請求結果


3、本次搜索返回結果頁面標題為 edg_百度搜索

6、添加用戶自定義變量

1、添加用戶自定義變量用以Http請求參數化:Http請求 > Add > Config Element > User Defined Variables


2、新增請求參數,存放搜索關鍵字


3、在 Http測試請求 中使用該參數,格式為:${wd} ,如下圖所示


7、添加響應斷言

右鍵點擊 Http測試請求(注意是Http測試請求) > Add > Assertions > Response Assertion

 

校驗返回的文本中是否包含搜索詞,添加參數${wd}到要測試的模式中

  1. Contains 
  2. :包括 
  3.  
  4. Matches 
  5. :匹配 
  6.  
  7. Equals 
  8. :相等 
  9.  
  10. SubString 
  11. :原諒博主才疏學淺,這個就不做解釋了 
  12.  
  13. Not 
  14. :否 
  15.  
  16. or 
  17. :或者 

 

7、添加響應斷言結果

右鍵點擊 Http測試請求 > Add > Listener > Assertion Results


點擊運行,查詢運行結果

8、添加聚合報告

右鍵點擊 Http請求 > Add > Listener > Aggregate Report


到這里我們就完成了一個完整的Http接口的性能測試編寫,接下來我們會對它的性能進行測試

3.4 JMeter 性能測試

1、配置Http請求(線程組)信息

點擊Http請求(線程組),配置相關的性能測試相關參數線程數:50 循環次數:永遠持續時間:60秒


2、執行測試信息

選擇聚合報告,查詢結構,點擊 箭頭 按鈕啟動測試,如果要清楚具體內容,點擊小掃把,清除調試結果


3、測試結果分析解讀

1、打開聚合報告

參數詳解:

  1. Label:每個 JMeter 的 element都有一個 Name 屬性,這里顯示的是 Name 屬性的值
  2. #Samples:請求數——表示這次測試中一共發出了多少個請求 如果模擬10個用戶,每個用戶迭代10次,那么這里顯示100
  3. Average:平均響應時間——默認情況下是單個 Request 的平均響應時間 當使用了 Transaction Controller 時,以Transaction 為單位顯示平均響應時間
  4. Median:中位數,也就是 50% 用戶的響應時間
  5. 90% Line:90% 用戶的響應時間
  6. 99% Line:99% 用戶的響應時間
  7. Min:最小響應時間
  8. Max:最大響應時間
  9. Error%:錯誤率——錯誤請求數/請求總數
  10. Throughput:吞吐量——默認情況下表示每秒完成的請求數(Request per Second) 當使用了TransactionController時,也可以表示類似LoadRunner的TransactionperSecond數
  11. KB/Sec:每秒從服務器端接收到的數據量

在實際中我們需要關注的點只有—— #Samples 請求數,Average 平均響應時間,Min 最小響應時間,Max 最大響應時間,Error% 錯誤率和Throughput 吞吐量

四、代碼模擬

1、Semaphore

Semaphore是計數信號量。Semaphore管理一系列許可證。每個acquire方法阻塞,直到有一個許可證可以獲得然后拿走一個許可證;每個release方法增加一個許可證,這可能會釋放一個阻塞的acquire方法。然而,其實并沒有實際的許可證這個對象,Semaphore只是維持了一個可獲得許可證的數量。

[[380133]]

1.1 代碼演示:獲取一個許可證

  1. import lombok.extern.slf4j.Slf4j; 
  2.  
  3. import java.util.concurrent.CountDownLatch; 
  4. import java.util.concurrent.ExecutorService; 
  5. import java.util.concurrent.Executors; 
  6. import java.util.concurrent.Semaphore; 
  7.  
  8. @Slf4j 
  9. public class SemaphoreExample1 { 
  10.  
  11.     private final static int threadCount = 20; 
  12.  
  13.     public static void main(String[] args) throws Exception { 
  14.  
  15.         ExecutorService exec = Executors.newCachedThreadPool(); 
  16.  
  17.         final Semaphore semaphore = new Semaphore(3); 
  18.  
  19.         for (int i = 0; i < threadCount; i++) { 
  20.             final int threadNum = i; 
  21.             exec.execute(() -> { 
  22.                 try { 
  23.                     semaphore.acquire(); // 獲取一個許可 
  24.                     test(threadNum); 
  25.                     semaphore.release(); // 釋放一個許可 
  26.                 } catch (Exception e) { 
  27.                     log.error("exception", e); 
  28.                 } 
  29.             }); 
  30.         } 
  31.         exec.shutdown(); 
  32.     } 
  33.  
  34.     private static void test(int threadNum) throws Exception { 
  35.         log.info("{}", threadNum); 
  36.         Thread.sleep(1000); 
  37.     } 

執行結果:如下圖所示,我們看到雖然結果是無序的,但是請求的線程數量是正確的,這里展示的是獲取一個許可,同時也釋放一個許可,我們可不可以獲取多個許可,釋放多個許可呢,答案是可以的


1.2 代碼演示:獲取多個許可證

  1. package com.mmall.concurrency.example.aqs; 
  2.  
  3. import lombok.extern.slf4j.Slf4j; 
  4.  
  5. import java.util.concurrent.ExecutorService; 
  6. import java.util.concurrent.Executors; 
  7. import java.util.concurrent.Semaphore; 
  8.  
  9. @Slf4j 
  10. public class SemaphoreExample { 
  11.  
  12.     private final static int threadCount = 20; 
  13.  
  14.     public static void main(String[] args) throws Exception { 
  15.  
  16.         ExecutorService exec = Executors.newCachedThreadPool(); 
  17.  
  18.         final Semaphore semaphore = new Semaphore(3); 
  19.  
  20.         for (int i = 0; i < threadCount; i++) { 
  21.             final int threadNum = i; 
  22.             exec.execute(() -> { 
  23.                 try { 
  24.                     semaphore.acquire(3); // 獲取多個許可 
  25.                     test(threadNum); 
  26.                     semaphore.release(3); // 釋放多個許可 
  27.                 } catch (Exception e) { 
  28.                     log.error("exception", e); 
  29.                 } 
  30.             }); 
  31.         } 
  32.         exec.shutdown(); 
  33.     } 
  34.  
  35.     private static void test(int threadNum) throws Exception { 
  36.         log.info("{}", threadNum); 
  37.         Thread.sleep(1000); 
  38.     } 

執行結果:這里我們看到我們設置了獲取多個許可同時也釋放多個許可,放回的線程數是正確的,同時執行結果也是有序的


2、CountDownLatch

CountDownLatch是一個同步工具類,用來協調多個線程之間的同步,或者說起到線程之間的通信(而不是用作互斥的作用)。CountDownLatch能夠使一個線程在等待另外一些線程完成各自工作之后,再繼續執行。使用一個計數器進行實現。計數器初始值為線程的數量。當每一個線程完成自己任務后,計數器的值就會減一。當計數器的值為0時,表示所有的線程都已經完成了任務,然后在CountDownLatch上等待的線程就可以恢復執行任務

 

2.1 代碼演示:

  1. import lombok.extern.slf4j.Slf4j; 
  2.  
  3. import java.util.concurrent.CountDownLatch; 
  4. import java.util.concurrent.ExecutorService; 
  5. import java.util.concurrent.Executors; 
  6.  
  7. @Slf4j 
  8. public class CountDownLatchExample1 { 
  9.  
  10.     private final static int threadCount = 200; 
  11.     public static void main(String[] args) throws Exception { 
  12.         int num = 0; 
  13.  
  14.         ExecutorService exec = Executors.newCachedThreadPool(); 
  15.         final CountDownLatch countDownLatch = new CountDownLatch(threadCount); 
  16.  
  17.         for (int i = 0; i < threadCount; i++) { 
  18.             final int threadNum = i; 
  19.             num++; 
  20.             exec.execute(() -> { 
  21.                 try { 
  22.                     test(threadNum); 
  23.                 } catch (Exception e) { 
  24.                     log.error("exception", e); 
  25.                 } finally { 
  26.                     countDownLatch.countDown(); 
  27.                 } 
  28.             }); 
  29.         } 
  30.         countDownLatch.await(); 
  31.         log.info("finish——"+num); 
  32.         exec.shutdown(); 
  33.     } 
  34.  
  35.     private static void test(int threadNum) throws Exception { 
  36.         Thread.sleep(100); 
  37.         log.info("{}", threadNum); 
  38.         Thread.sleep(100); 
  39.     } 

 

通過返回結果我們可以看到,設置的線程數量返回結果數量和我們設置的線程數量200一致

五、總結

postMan:非專業的并發測試,嚴格來說postMan并不是并發請求,而是串行執行的,postMan更多的是用來測試Http連接的一個工具,是一個很實用的工具

Apache Bench:Apache Bench是 Apache 服務器自帶的一個web壓力測試工具,簡稱ab,ab工具小巧簡單,上手學習較快,可以提供需要的基本性能指標,但是沒有圖形化結果,不能監控

JMeter:Apache JMeter 是Apache 組織開發的基于java的壓力測試工具。用于對軟件做壓力測試的工具,它可以用于測試靜態和動態資源例如靜態文件、Java 小服務程序、CGI 腳本、Java 對象、 數據庫, FTP 服務器等等

總的來說,并發測試中,JMeter和Apache Bench是比較好的選擇,由于Apache Bench是基于命令行的,ab處理速度更快,而Jmeter更準確,由于Jmeter本身支持斷言、可變參數和CSV數據集的輸入,能設定更加靈活多變的的測試場景,至于postMan這款工具,用來最多的是用來模擬Http請求的一個,并不是一個專業的并發請求工具。

 

責任編輯:姜華 來源: 牧小碼農
相關推薦

2017-01-09 16:06:19

2023-12-14 07:36:16

Java并發原子類

2017-02-14 10:00:19

Java開發Lock

2024-11-13 15:09:57

Java線程開發

2023-02-10 09:40:36

Go語言并發

2012-03-06 11:01:44

Java

2024-04-22 09:30:24

2024-01-31 08:50:41

Guava并發工具

2020-02-18 14:05:47

模擬并發Java

2019-07-25 12:46:32

Java高并發編程語言

2010-06-08 18:53:43

UML建模工具

2014-07-02 09:37:02

模擬并發并發

2023-10-18 15:19:56

2024-09-06 10:48:13

2019-11-19 09:00:38

JavaAND信號量

2012-07-06 15:08:14

跨平臺工具Netbiscuits

2012-07-06 15:00:03

跨平臺工具MoSync

2011-08-15 11:13:06

IOS開發并發Dispatch Qu

2025-06-13 08:00:00

Java并發編程volatile

2010-01-28 17:18:08

Android模擬器s
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲乱码一区二区三区在线观看 | 精品成人在线视频 | 一级毛片成人免费看a | 欧美一区二区三区四区五区无卡码 | 91在线精品视频 | 国产高清视频在线观看 | 成人1区2区 | 999热精品视频 | 日本视频中文字幕 | 91手机精品视频 | 国产乱一区二区三区视频 | 久久er精品 | 精品欧美一区二区在线观看视频 | 四虎成人av | 欧美一区二区三区国产精品 | 亚洲视频在线观看一区二区三区 | 91夜色在线观看 | 欧美精品一区二区三区在线 | 黄色一级免费 | 久久精品99| 91精品国产91久久久久久不卞 | 365夜爽爽欧美性午夜免费视频 | 国产人久久人人人人爽 | 91精品国产91久久久久久丝袜 | 91精品国产一区二区三区 | 日韩专区中文字幕 | 国产乱码久久久久久 | www网站在线观看 | 亚洲一区二区三区四区在线观看 | 欧美精品欧美精品系列 | 精品亚洲一区二区三区 | 亚洲精品影院 | 国产激情在线 | 国产一区精品在线 | 国产综合第一页 | 国产精品免费一区二区三区 | 成人在线一区二区三区 | 精品久久久久久一区二区 | 午夜成人免费视频 | 午夜精品一区二区三区在线视频 | 性高朝久久久久久久3小时 av一区二区三区四区 |