国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

JMH 和 Arthas 定位問題的案例分享 !

共 6323字,需瀏覽 13分鐘

 ·

2022-02-26 16:16

點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)??

https://bryantchang.github.io/2019/12/08/java-profile-tools/

最近的工作日并不算太平,各種大大小小的case和解case,發(fā)現(xiàn)已經(jīng)有好久好久沒有靜下心來專心寫點(diǎn)東西了。不過倒還是堅(jiān)持利用業(yè)余時(shí)間學(xué)習(xí)了不少微課上的東西,發(fā)現(xiàn)大佬們總結(jié)的東西還是不一樣,相比于大學(xué)時(shí)的那些枯燥的課本,大佬們總結(jié)出來的內(nèi)容更活,更加容易理解。自己后面也會(huì)把大佬們的東西好好消化吸收,變成自己的東西用文字性的東西表達(dá)出來。

今天想總結(jié)的東西是最近工作中使用到的測(cè)試工具JMH以及Java運(yùn)行時(shí)監(jiān)控工具Arthas。他們?cè)谖业膶?shí)際工作中也算是幫了大忙。所以在這里拋磚引玉一下這些工具的使用方法。同時(shí)也加深一下自己對(duì)這些工具的熟悉程度。對(duì)這兩個(gè)工具,我都會(huì)首先簡(jiǎn)單介紹一下這些工具的大致使用場(chǎng)景,然后會(huì)使用一個(gè)在工作中真正遇到的性能問題排查為例詳細(xì)講解這兩個(gè)工具的實(shí)際用法。話不多說,直奔主題。

問題描述

為了能夠讓我后面的實(shí)例能夠貫穿這兩個(gè)工具的使用,我首先簡(jiǎn)單描述下我們?cè)陂_發(fā)中遇到的實(shí)際的性能問題。然后再引出這兩個(gè)性能工具的實(shí)際使用,看我們?nèi)绾问褂眠@兩個(gè)工具成功定位到性能瓶頸的。

問題如下:為了能夠支持丟失率,我們將原先log4j2 的Async+自定義Appender的方式進(jìn)行了修正,把異步的邏輯放到了自己改版后的Appender中。但我們發(fā)現(xiàn)修改后日志性能要比之前Async+自定義Appender的方式下降不少。這里由于隱私原因我并沒有用實(shí)際公司中的實(shí)例,這里我用了一種其他同樣能夠體現(xiàn)問題的方式。我們暫時(shí)先不給出具體的配置文件,先給出性能測(cè)試代碼和結(jié)果

代碼

package com.bryantchang.appendertest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AppenderTest {

private static final String LOGGER_NAME_DEFAULT = "defaultLogger";
private static final String LOGGER_NAME_INCLUDE = "includeLocationLogger";
private static final Logger LOGGER = LoggerFactory.getLogger(LOGGER_NAME_INCLUDE);
public static final long BATCH = 10000;

public static void main(String[] args) throws InterruptedException {
while(true) {
long start, end;
start = System.currentTimeMillis();
for (int i = 0; i < BATCH; i++) {
LOGGER.info("msg is {}", i);
}
end = System.currentTimeMillis();
System.out.println("duration of " + LOGGER_NAME_INCLUDE + " is " + (end - start) + "ms");
Thread.sleep(1000);
}
}
}

代碼邏輯及其簡(jiǎn)單,就是調(diào)用logger.info每次打印10000條日志,然后記錄耗時(shí)。兩者的對(duì)比如下

對(duì)比結(jié)果

從這兩張圖片中我們能夠看到同樣的邏輯,兩個(gè)程序的耗時(shí)差距相差了數(shù)十倍,但看圖片,貌似僅僅是logger的名稱不一樣。對(duì)上面的實(shí)驗(yàn)結(jié)果進(jìn)行分析,我們可能會(huì)有兩個(gè)疑問

  • 上面的代碼測(cè)試是否標(biāo)準(zhǔn),規(guī)范

  • 如果真的是性能問題,那么這兩個(gè)代碼到底在哪個(gè)方法上有了這么大的差距導(dǎo)致了最終的性能差異

下面這兩個(gè)工具就分別來回答這兩個(gè)問題

JMH簡(jiǎn)介

第一個(gè)問題就是,測(cè)試的方法是否標(biāo)準(zhǔn)。我們?cè)诰帉懘a時(shí)用的是死循環(huán)+前后“掐秒表”的方式。假如我們要再加個(gè)多線程的測(cè)試,我們還需要搞一個(gè)線程池,除了代碼本身的邏輯還要關(guān)心測(cè)試的邏輯。我們會(huì)想,有沒有一款工具能夠?qū)⑽覀儚臏y(cè)試邏輯中徹底解放出來,只需要關(guān)心我們需要測(cè)試的代碼邏輯。JMH就是這樣一款Java的測(cè)試框架。下面是JMH的官方定義

JMH 是一個(gè)面向 Java 語言或者其他 Java 虛擬機(jī)語言的性能基準(zhǔn)測(cè)試框架

這里面我們需要注意的是,JMH所測(cè)試的方法約簡(jiǎn)單越好,依賴越少越好,最適合的場(chǎng)景就是,測(cè)試兩個(gè)集合put,get性能,例如ArrayList與LinkedList的對(duì)比等,這里我們需要測(cè)試的是批量打一批日志所需要的時(shí)間,也基本符合使用JMH的測(cè)試場(chǎng)景。下面是測(cè)試代碼,bench框架代碼以及主函數(shù)。

  • 待測(cè)試方法

public class LogBenchMarkWorker {

private LogBenchMarkWorker() {}

private static class LogBenchMarkWorkerInstance {
private static final LogBenchMarkWorker instance = new LogBenchMarkWorker();
}

public static LogBenchMarkWorker getInstance() {
return LogBenchMarkWorkerInstance.instance;
}

private static final String LOGGER_DEFAULT_NAME = "defaultLogger";
private static final String LOGGER_INCLUDE_LOCATION = "includeLocationLogger";
private static final Logger LOGGER = LoggerFactory.getLogger(LOGGER_DEFAULT_NAME);
private static long BATCH_SIZE = 10000;

public void logBatch() {
for (int i = 0; i < BATCH_SIZE; i++) {
LOGGER.info("msg is {}", i);
}
}
}

可以看到待測(cè)試方法非常簡(jiǎn)單,就是單批次一次性打印10000條日志的操作,所以并沒有需要額外說明的部分。下面我們?cè)賮砜碽enchmark部分。

public class LogBenchMarkMain {

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(value = 1)
@Threads(1)
public void testLog1() {
LogBenchMarkWorker.getInstance().logBatch();
}

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(value = 1)
@Threads(4)
public void testLog4() {
LogBenchMarkWorker.getInstance().logBatch();
}

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(value = 1)
@Threads(8)
public void testLog8() {
LogBenchMarkWorker.getInstance().logBatch();
}

@Benchmark
@BenchmarkMode(Mode.AverageTime)
@Fork(value = 1)
@Threads(16)
public void testLog16() {
LogBenchMarkWorker.getInstance().logBatch();
}

在這段代碼中,我們就會(huì)發(fā)現(xiàn)有了一些JMH中特有的東西,我下面進(jìn)行簡(jiǎn)要介紹。

Benchmark注解:標(biāo)識(shí)在某個(gè)具體方法上,表示這個(gè)方法將是一個(gè)被測(cè)試的最小方法,在JMH中成為一個(gè)OPS
BenmarkMode:測(cè)試類型,JMH提供了幾種不同的Mode
Throughput:整體吞吐量
AverageTime:調(diào)用的平均時(shí)間,每次OPS執(zhí)行的時(shí)間
SampleTime:取樣,給出不同比例的ops時(shí)間,例如99%的ops時(shí)間,99.99%的ops時(shí)間
fork:fork的次數(shù),如果設(shè)置為2,JMH會(huì)fork出兩個(gè)進(jìn)程來測(cè)試
Threads:很容易理解,這個(gè)參數(shù)表示這個(gè)方法同時(shí)被多少個(gè)線程執(zhí)行

在上面的代碼中,我定義了4個(gè)待測(cè)試的方法,方法的Fork,BenchmarkMode均為測(cè)試單次OPS的平均時(shí)間,但4個(gè)方法的線程數(shù)不同。
除了這幾個(gè)參數(shù),還有幾個(gè)參數(shù),我會(huì)在main函數(shù)里面來講,main代碼如下所示

public class Main {
public static void main(String[] args) throws RunnerException {
Options options = new OptionsBuilder()
.include(LogBenchMarkMain.class.getSimpleName())
.warmupIterations(5)
.measurementIterations(5)
.output("logs/BenchmarkCommon.log")
.build();
new Runner(options).run();
}
}

我們可以看到,在main函數(shù)中,我們就是要設(shè)置JMH的基礎(chǔ)配置,這里面的幾個(gè)配置參數(shù)含義如下:

include:benchmark所在類的名字,可以使用正則表達(dá)
warmupIteration:預(yù)熱的迭代次數(shù),這里為什么要預(yù)熱的原因是由于JIT的存在,隨著代碼的運(yùn)行,會(huì)動(dòng)態(tài)對(duì)代碼的運(yùn)行進(jìn)行優(yōu)化。因此在測(cè)試過程中需要先預(yù)熱幾輪,讓代碼運(yùn)行穩(wěn)定后再實(shí)際進(jìn)行測(cè)試
measurementIterations:實(shí)際測(cè)試輪次
output:測(cè)試報(bào)告輸出位置

我分別用兩種logger運(yùn)行一下測(cè)試,查看性能測(cè)試報(bào)告對(duì)比

使用普通logger

LogBenchMarkMain.testLog1   avgt    5  0.006 ± 0.001   s/op
LogBenchMarkMain.testLog16 avgt 5 0.062 ± 0.026 s/op
LogBenchMarkMain.testLog4 avgt 5 0.006 ± 0.002 s/op
LogBenchMarkMain.testLog8 avgt 5 0.040 ± 0.004 s/op

使用了INCLUDE_LOCATION的logger

LogBenchMarkMain.testLog1   avgt    5  0.379 ± 0.007   s/op
LogBenchMarkMain.testLog16 avgt 5 1.784 ± 0.670 s/op
LogBenchMarkMain.testLog4 avgt 5 0.378 ± 0.003 s/op
LogBenchMarkMain.testLog8 avgt 5 0.776 ± 0.070 s/op

這里我們看到,性能差距立現(xiàn)。使用INCLUDE_LOCATION的性能要明顯低于使用普通logger的性能。這是我們一定很好奇,并且問一句“到底慢在哪”??!

Arthas 我的代碼在運(yùn)行時(shí)到底做了什么

Arthas是阿里開源的一款java調(diào)試神器,與greys類似,不過有著比greys更加強(qiáng)大的功能,例如,可以直接繪制java方法調(diào)用的火焰圖等。這兩個(gè)工具的原理都是使用了Java強(qiáng)大的字節(jié)碼技術(shù)。畢竟我也不是JVM大佬,所以具體的實(shí)現(xiàn)細(xì)節(jié)沒法展開,我們要做的就是站在巨人的肩膀上,接受并用熟練的使用好這些好用的性能監(jiān)控工具。

實(shí)際操作

talk is cheap, show me your code,既然是工具,我們直接進(jìn)行實(shí)際操作。我們?cè)诒緳C(jī)運(yùn)行我們一開始的程序,然后講解arthas的使用方法。

我們首先通過jps找到程序的進(jìn)程號(hào),然后直接通過arthas給到的as.sh對(duì)我們運(yùn)行的程序進(jìn)行字節(jié)碼增強(qiáng),然后啟動(dòng)arthas,命令如下

./as.sh pid

這個(gè)就是arthas的啟動(dòng)界面了,我們使用help命令查看工具所支持的功能

可以看到,arthas支持查看當(dāng)前jvm的狀態(tài),查看當(dāng)前的線程狀態(tài),監(jiān)控某些方法的調(diào)用時(shí)間,trace,profile生成火焰圖等,功能一應(yīng)俱全
我們這里也只將幾個(gè)比較常用的命令,其他的命令如果大家感興趣可以詳見官網(wǎng)arthas官網(wǎng)。這篇文章主要介紹下面幾個(gè)功能

  • 反編譯代碼

  • 監(jiān)控某個(gè)方法的調(diào)用

  • 查看某個(gè)方法的調(diào)用和返回值

  • trace某個(gè)方法

監(jiān)控方法調(diào)用

這個(gè)主要的命令為monitor,根據(jù)官網(wǎng)的介紹,常用的使用方法為

monitor -c duration className methodName

其中duration代表每隔幾秒展示一次統(tǒng)計(jì)結(jié)果,即單次的統(tǒng)計(jì)周期,className就是類的全限定名,methodname就是方法的名字,這里面我們查看的方法是Logger類的info方法,我們分別對(duì)使用兩種不同logger的info方法。這里面的類是org.slf4j.Logger,方法時(shí)info,我們的監(jiān)控語句為

monitor -c 5 org.slf4j.Logger info

監(jiān)控結(jié)果如下

  • 使用普通appender


  • 使用include appender


我們可以看到,使用include appeder的打印日志方法要比普通的appender高出了3倍,這就不禁讓我們有了疑問,究竟這兩個(gè)方法各個(gè)步驟耗時(shí)如何呢。下面我們就介紹第二條命令,trace方法。

trace命令 & jad命令

這兩個(gè)程序的log4j2配置文件如下



<configuration status="warn" monitorInterval="30">

<appenders>

<Console name="console" target="SYSTEM_OUT">

<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>

<PatternLayout pattern="[%d{HH:mm:ss.SSS}] [%-5p] %l - %m%n"/>
Console>


<Async name="AsyncDefault" blocking="false" includeLocation="false">
<AppenderRef ref="fileAppender"/>
Async>

<Async name="AsyncIncludeLocation" blocking="false" includeLocation="true">
<AppenderRef ref="fileAppender"/>
Async>



<File name="fileAppender" fileName="log/test.log" append="false">
<PatternLayout pattern="[%d{HH:mm:ss.SSS}] [%-5p] %l - %m%n"/>
File>


<File name="ERROR" fileName="logs/error.log">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="[%d{yyyy.MM.dd 'at' HH:mm:ss z}] [%-5p] %l - %m%n"/>
File>


<RollingFile name="rollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/web-%d{yyyy-MM-dd}.log.gz">

<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss}] [%-5p] %l - %m%n"/>
<Policies>
<TimeBasedTriggeringPolicy modulate="true" interval="1"/>
Policies>
<DefaultRolloverStrategy>
<Delete basePath="logs" maxDepth="2">
<IfFileName glob="*/*.log.gz" />
<IfLastModified age="7d" />
Delete>
DefaultRolloverStrategy>
RollingFile>
appenders>


<loggers>

<logger name="defaultLogger" additivity="false">
<appender-ref ref="AsyncDefault">appender-ref>
logger>

<logger name="includeLocationLogger" additivity="false">
<appender-ref ref="AsyncIncludeLocation">appender-ref>
logger>


<root level="INFO">

root>
loggers>

configuration>

我們都是用了一個(gè)AsyncAppender套用了一個(gè)FileAppender。查看fileAppender,發(fā)現(xiàn)二者相同完全沒區(qū)別,只有asyncAppender中的一個(gè)選項(xiàng)有區(qū)別,這就是includeLocation,一個(gè)是false,另一個(gè)是true。至于這個(gè)參數(shù)的含義,我們暫時(shí)不討論,我們現(xiàn)在知道問題可能出在AsyncAppender里面,但是我們?cè)撊绾悟?yàn)證呢。trace命令就有了大用場(chǎng)。

trace命令的基本用法與monitor類似,其中主要的一個(gè)參數(shù)是-n則是代表trace多少次的意思

trace -n trace_times className methodName

我在之前Log4j2的相關(guān)博客里面講到過,任何一個(gè)appender,最核心的方法就是他的append方法。所以我們分別trace兩個(gè)程序的append方法。

trace -n 5 org.apache.logging.log4j.core.appender.AsyncAppender append

trace結(jié)果如下

  • 使用普通appender


  • 使用include appender



我們立刻可以發(fā)現(xiàn),兩個(gè)trace的熱點(diǎn)方法不一樣,在使用include的appender中,耗時(shí)最長(zhǎng)的方法時(shí)org.apache.logging.log4j.core.impl.Log4jLogEvent類中的createMemento方法,那么怎么才能知道這個(gè)方法到底做了啥呢,那就請(qǐng)出我們下一個(gè)常用命令jad,這個(gè)命令能夠反編譯出對(duì)應(yīng)方法的代碼。這里我們jad一下上面說的那個(gè)createMemento方法,命令很簡(jiǎn)單

jad org.apache.logging.log4j.core.impl.Log4jLogEvent createMemento

結(jié)果如下


我們發(fā)現(xiàn),這個(gè)方法中有個(gè)includeLocation參數(shù),這個(gè)和我們的看到的兩個(gè)appender的唯一不同的配置相吻合,我們此時(shí)應(yīng)該有這個(gè)猜想,會(huì)不會(huì)就是這個(gè)參數(shù)導(dǎo)致的呢?為了驗(yàn)證這個(gè)猜想,我們引出下一個(gè)命令,watch

watch命令

watch命令能夠觀察到某個(gè)特定方法的入?yún)?,返回值等信息,我們使用這個(gè)命令查看一下這個(gè)createMemento方法的入?yún)?,如果兩個(gè)程序的入?yún)⒉煌腔究梢詳喽ㄊ沁@個(gè)原因引起命令如下

watch org.apache.logging.log4j.core.impl.Log4jLogEvent createMemento "params" -x 2 -n 5 -b -f

這里面的參數(shù)含義如下

-x 參數(shù)展開層次
-n 執(zhí)行次數(shù)
-b 查看方法調(diào)用前狀態(tài)
-f 方法調(diào)用后

其中的param代表查看方法的調(diào)用參數(shù)列表,還有其他的監(jiān)控項(xiàng)詳見官網(wǎng)官網(wǎng)

最終watch結(jié)果如下

  • 使用普通logger



  • 使用include



果不其然,這兩個(gè)參數(shù)果然是一個(gè)true一個(gè)false,我們簡(jiǎn)單看下這個(gè)參數(shù)是如何傳進(jìn)來的,我們jad一下AsyncAppender的append方法



我們發(fā)現(xiàn)這個(gè)includeLocation正是appender的一個(gè)屬性,也就是我們xml中配置的那個(gè)屬性。查看官網(wǎng)的相關(guān)分析,我們看到這個(gè)參數(shù)會(huì)使log的性能下降5–10倍


不過為了一探究竟,我還是靜態(tài)跟了一下這段代碼

這個(gè)includeLocation會(huì)在event的createMemento中被用到,在序列化生成對(duì)象時(shí)會(huì)創(chuàng)建一個(gè)LogEventProxy,代碼如下

public LogEventProxy(final LogEvent event, final boolean includeLocation) {
this.loggerFQCN = event.getLoggerFqcn();
this.marker = event.getMarker();
this.level = event.getLevel();
this.loggerName = event.getLoggerName();

final Message msg = event.getMessage();
this.message = msg instanceof ReusableMessage
? memento((ReusableMessage) msg)
: msg;
this.timeMillis = event.getTimeMillis();
this.thrown = event.getThrown();
this.thrownProxy = event.getThrownProxy();
this.contextData = memento(event.getContextData());
this.contextStack = event.getContextStack();
this.source = includeLocation ? event.getSource() : null;
this.threadId = event.getThreadId();
this.threadName = event.getThreadName();
this.threadPriority = event.getThreadPriority();
this.isLocationRequired = includeLocation;
this.isEndOfBatch = event.isEndOfBatch();
this.nanoTime = event.getNanoTime();
}

如果includeLocation為true,那么就會(huì)調(diào)用getSource函數(shù),跟進(jìn)去查看,代碼如下

    public StackTraceElement getSource() {
if (source != null) {
return source;
}
if (loggerFqcn == null || !includeLocation) {
return null;
}
source = Log4jLogEvent.calcLocation(loggerFqcn);
return source;
}
public static StackTraceElement calcLocation(final String fqcnOfLogger) {
if (fqcnOfLogger == null) {
return null;
}
// LOG4J2-1029 new Throwable().getStackTrace is faster than Thread.currentThread().getStackTrace().
final StackTraceElement[] stackTrace = new Throwable().getStackTrace();
StackTraceElement last = null;
for (int i = stackTrace.length - 1; i > 0; i--) {
final String className = stackTrace[i].getClassName();
if (fqcnOfLogger.equals(className)) {
return last;
}
last = stackTrace[i];
}
return null;
}

我們看到他會(huì)從整個(gè)的調(diào)用棧中去尋找調(diào)用這個(gè)方法的代碼行,其性能可想而知。我們用arthas監(jiān)控一下,驗(yàn)證一下。

首先我們trace crateMemento方法

trace -n 5 org.apache.logging.log4j.core.impl.Log4jLogEvent createMemento



發(fā)現(xiàn)熱點(diǎn)方法時(shí)org.apache.logging.log4j.core.impl.Log4jLogEvent的serialize(),繼續(xù)trace下去

trace -n 5 org.apache.logging.log4j.core.impl.Log4jLogEvent serialize



看到熱點(diǎn)是org.apache.logging.log4j.core.impl.Log4jLogEvent:LogEventProxy的構(gòu)造方法,繼續(xù)trace

trace -n 5 org.apache.logging.log4j.core.impl.Log4jLogEvent$LogEventProxy 



發(fā)現(xiàn)是getSource方法,繼續(xù)

trace -n 5 trace -n 5 org.apache.logging.log4j.core.LogEvent getSource

熱點(diǎn)終于定位到了,是org.apache.logging.log4j.core.impl.Log4jLogEvent的calcLocation函數(shù),和我們靜態(tài)跟蹤的代碼一樣。

至此我們通過結(jié)合JMH和arthas共同定位出了一個(gè)線上的性能問題。不過我介紹的只是冰山一角,更多常用的命令還希望大家通過官網(wǎng)自己了解和實(shí)踐,有了幾次親身實(shí)踐之后,這個(gè)工具也就玩熟了。

1.?增加了一行代碼,讓我們提高了 3000% 的性能

2.?private修飾的方法可以通過反射訪問,那么private的意義是什么?

3.?面試官:為什么要盡量避免使用 IN 和 NOT IN 呢?

4.?被 P8 大佬面試的 2 小時(shí)

最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊(cè),覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù)?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

PS:因公眾號(hào)平臺(tái)更改了推送規(guī)則,如果不想錯(cuò)過內(nèi)容,記得讀完點(diǎn)一下在看,加個(gè)星標(biāo),這樣每次新文章推送才會(huì)第一時(shí)間出現(xiàn)在你的訂閱列表里。

點(diǎn)“在看”支持小哈呀,謝謝啦??

瀏覽 51
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 亚洲欧美成人在线视频| 男人天堂2024| 影音先锋亚洲AV| 蜜桃无码一区| 无套影院| 日韩动态图| 99久久婷婷国产精品2020| 亚洲人成人无码.www粉色| 按摩性高湖婬AAA片A片中国 | 一区二区A片| 欧美老妇XX| 亚洲二区后入极品| 伊人久操| 丝袜美腿亚洲综合| 色五月在线观看| 亚洲群交视频| 四虎午夜福利| 欧美96| 97中文字幕| 伊人导航| 亚洲欧美激情小说| 国产一級A片免费看| av手机天堂网| 久久久久久成人无码| 中文字幕无码在线| 蜜桃传媒一区| 欧美色操| 国产理论片在线观看| 黑人毛片91久久久久久| 欧美成人免费精品| 黄色免费在线观看网站| 插菊花综合| 一区二区三区四区无码视频| 男人亚洲天堂| 操逼操逼视频| 五月天婷婷黄色| 无码一区二区三区免费看| 无码免费中文字幕| 亚洲二区后入极品| 一级A片免费看| 国产在线黄片| 日韩成人A片| 亚洲中文欧美| 91成人网站| 久久久91人妻无码精品蜜桃ID| 羞羞AV| 久久肏屄视频| 亚洲AAA| 欧美黄色性爱视频| 亚洲男人天堂av| AV黄色网址| 久久6精品| 久久午夜无码人妻精品蜜桃冫| 亚洲午夜影院在线| 啪啪A片| 国产在线欧美在线白浆| 精品久久国产| 欧美在线a| 日韩欧美爱爱| 中文字幕2018第一页| 亚洲午夜精品久久久| 国产视频入口| 成人三级片网| 日韩精品无码人妻| 五月天激情啪啪| 青娱乐亚洲精品视频| 日本三级网址| 婷婷色777777| 天天看天天干| 欧美日韩在线免费观看| 77777色婷婷| 欧美草逼视频| av无码网站| 成人毛片| 亚洲天堂2025| 欧美一区不卡| 亚洲区成人777777精品| 人人香蕉| 欧洲第一无人区观看| 国产黄色小视频在线观看| 天天舔天天射| 人人操狠狠操| 日韩1234区| 免费无码婬片AAAAA片| 一本免费视频| 91在线免费看| AV无码不卡| 日韩一欧美| 性感成人在线| 91麻豆大奶巨乳一区白虎| 97中文字幕| 亚洲天堂免费视频| 欧美日韩中文字幕在线观看| 四川w搡BBB搡wBBB搡| 人人妻人人澡人人爽人人DVD| 大鸡吧在线视频| 无码毛片一区二区三区人口| 波多野结衣在线网站| 毛片在线观看视频| 人成视频在线| 一本色道久久综合狠狠躁的推荐 | 先锋影音av资源网| 91做爱视频| 尻屄视频在线观看| 色色欧美| 偷拍一区二区| www.插插插| 大鸡巴久久| 日本精品码喷水在线看| 人人操人人摸人人| 日本亚洲欧美| 蜜桃久久99精品久久久酒店| 久久99深爱久久99精品| 无码人妻一区二区三区| 欧美成人视频网站| 国产精品无码一区二区在线欢| 玉米地一级婬片A片| 欧美日韩精品在线观看| 亚洲第一福利视频| 伊人成人在线观看| 91精东传媒果冻传媒| 国产操| 国产又粗又大又爽91嫩草| 人人操在线| 毛片A级成人片| 亚洲天堂AB| 最新福利视频| 操逼逼AV| 91精品人妻人人爽| 亚洲伦理一区二区| 亚洲日日夜夜| 五月天婷婷在线视频| 无码av高清| 国产三级性爱视频| 老熟女伦一区二区三区| 91精品国产一区二区| 久久精品黄色| 特级艺体西西444WWw| 大陆一级片| AV一区二区三区四区| 自拍偷拍一区| 天天做天天爱天天爽| 日韩高清无码中文字幕| www.黄| 777AV| 国产成人宗合| 麻豆精品在线播放| 精品玖玖| 蜜臀AV在线观看| 日韩精品成人av| 久久精品一区二区三区不卡牛牛 | 黄色视频免费在线观看网站| 亚洲一区二区三区在线视频| 天天色色色| 加勒比精品在线| 波多野结衣视频在线| 蜜臀久久99精品久久久电影 | 91.xxxxx| 亚洲精品久久久久中文字幕二区| 三洞齐开Av在线免费观看| 91亚洲国产成人| 中国人妻HDbute熟睡| 草比网站| 北条麻妃91人妻互换| 91AV电影网| 亚洲一级免费视频| 在线观看无码高清| 欧美老女人操逼| 国产欧美日韩| 欧美爱| 亚洲一区无码在线观看| 秋霞丝鲁片一区二区三区手机在绒免| 特级西西人体444www高清大胆 | 在线观看免费一区| 免费A在线观看| 日韩A∨视频| 亚洲成人av在线观看| www在线| 国产一卡二卡| 无码精品人妻一区二区| 欧美99视频| 五月丁香婷婷基地| 特级艺体西西444WWw| 欧美熟妇性爱| 成人免费无码婬片在线| 国产无码AV大片| 久久国产精| 操屄视频免费观看| 亚洲社区在线观看| 国产无遮挡| 婷婷丁香激情| 成人网在线观看| 欧美老女人操逼群| 黑人在线播放| 91精品国产一区二区三区| 国产色视频一区二区三区QQ号| 中文字幕一区二区三区四区在线视频| 亚洲婷婷在线| 伊人久久大综合中文无码| 亚洲成人黄色在线| 欧美日韩亚洲一区二区| 无码AV高清| gogogo免费高清在线偷拍| 日日骚影院| 成人无码日韩精品| 免费高潮视频| 97色色网| 国产a一级a毛一级视频| AV黄色网| 亚洲美女在线观看| 婷婷丁香激情| 亚洲男人天堂| 国产成人电影一区二区| 5D肉蒲团| 国产黄色性爱视频| 99自拍视频| 亚洲秘AV无码一区二区qq群| 久久综合伊人7777777| 日本国产视频| 中文字幕日韩电影| 91视频一区二区| 国产操穴视频| 久久av一区二区三区观看 | 一本大道DVD中文字幕| 午夜av无码| 日本久久高清| 人妻丰满精品一区二区| 日韩无码性爱视频| 狠狠狠狠狠狠| 国产熟女一区二区三区五月婷 | 青青精品视频| 国产九九九视频| 婷婷五月天网| 小骚逼操死你| 亚洲成人在线视频观看| 亚洲最大网站| 中文字幕在线观看不卡| 特级西西444www高清视频| 婷婷欧美色图| 永久免费AV| 无码AV一区| 婷婷色图| 国产免费国产| 91人妻人人澡人人爽精品| 岛国AV免费看| 有码在线播放| 97资源在线视频| AV天天看| 亚洲美女视频| 草av| 日韩AV成人电影| www.五月婷婷| 成人AV免费观看| 69色色| 亚洲图片小说区| 日韩人妻无码专区| 影音先锋女人资源| 欧美日韩人妻| 91.xxxxx| 99成人电影| 中文字幕av免费在线观看| 日韩精品视频一区二区| 色婷婷在线视频| 青娱乐一级无码| 色综合天天综合成人网| 四川少妇搡BBBB搡BBB视频网| 精品乱子伦一区二区三区毛| 超碰97在线精品国产| 日日干天天射| 欧美三级长视频| 9I成人免费版视频| 国产成人精品123区免费视频 | 日韩激情一区| 久久一道本| 又大又长又粗91| www污| 亚洲视频天堂| 中文无码日本高潮喷水| 久久学生妹| 亚洲精品蜜桃| 爱爱免费视频| 337P人体美鮑高清| 黑人无码视频| 国产A毛片| 国产精品视频无码| 超碰乱伦| 高清免费在线中文Av| 性生活黄色视频| 欧美精产国品一二三区| 96精品| 久久久久久久久国产精品| 性爱免费视频| 操屄在线视频| 亚洲AV成人精品一区二区三区| 美日韩视频欧美一区二区视频 | 国产一区二区三区在线观看免费视频免费视频免费视频 | 大地资源中文第二页导读内容| 五月婷婷综合在线| 日韩欧美高清| 成人777777免费视频色 | 久热中文| 秋霞午夜福利影院| 中文字幕高清在线| 国色天香一区二区| 91人妻无码精品一区二区三区| 四虎成人网站| 中文无码高清在线| 天天日天天搞| 成人黄色在线观看| 亚洲精品在线视频观看| 久久午夜无码鲁丝片午夜精| 一级片黑人| 美女操B| 鸡巴网站| 久久久永久免费视频| 蜜桃视频网站18| 国产免费观看av| 国产高清无码在线观看视频| 大香蕉操逼| 国产免费啪啪视频| 黄色视频一级| 成人黄色网址| 囯产精品久久久久久久久免费无码 | 日韩1页| 在线免费小黄片| 激情小视频在线| 999国产精品视频| 狠狠撸天天操| 亚洲欧美日韩综合| 四川搡BBBBB搡BBB| 久久99久久99| 蜜挑视频一区二区三区| 筱田步美| 成人无码专区| 骚逼日本| 日逼免费网站| 国产SUV精品一区二区| 亚洲色小说| 久久伊人春色| 久激情内射婷内射蜜桃欧美一级 | 长腿女神打扫偷懒被主人猛操惩罚| 国外成人性视频免费| 日韩一级黄色视频| 亚洲成人精品AV| 欧美精品在线视频| 中文字幕成人免费视频| 日韩成人精品视频| 5252a我爱haose01我愿| 久久免费视频播放| 天天日天天干麻豆| 国产亚洲久一区二区三区| 日本免费黄色视频| 久久久久久久久久国产精品| 大香蕉尹人网| 日韩高清欧美| 神马午夜福利视频| sm国产在线调教视频| 亚洲AV成人片无码网站网蜜柚| 人妻丰满熟妇av无码| 无码人妻精品一区二区三| 久久露脸国语精品国产91| 久久免费视频播放| 亚洲综合免费| 成人精品水蜜桃| 996热久久| 青娱乐最新官网| 国产主播精品| 美女福利在线| www99国产| 日韩欧美操逼视频| 新超碰在线观看| 色激情五月天| 高清无码不卡AV| 九色自拍视频| 五月婷婷性爱| 欧美黄色免费观看| 蜜臀av一区| 日韩一级电影在线观看| 成人操b视频| 日韩欧美操逼| 午夜久久福利| 日韩A片无码ⅩXXXX| 十八无码成人免费网站| 蜜臀一区二区三区| 欧美级黑寡妇毛片app| 欧美一级操逼| 亚洲在线观看中文字幕| 最近中文字幕免费mv第一季歌词強上| 在线观看免费一区| 国产精品123| 做爰视频毛片下载蜜桃视频| 成人福利影视| 国产久久精品| 欧美一级AAA大片免费观看| 久久99久久99精品免视看婷婷| 日本www视频| 北条麻妃网址| 能看毛片的网站| 天天操网站| 欧美操逼在线观看| 日韩成人无码毛片| 国产乱伦内射| 最新av资源| 无码a片| 五月天福利网| 亚洲午夜视频在线观看| 日本中文字幕网| 人人色人人| 强开小嫩苞一区二区三区网站| 天天都色| 在线毛片网站| 成人电影A片| 中文字幕网址在线| 国产aaaa| 亚洲AV无码乱码| 六月丁香婷| 亚洲精品无码人妻| v在线| 国产亚洲精品久久久波多野结衣| 免费无码在线观看| www狠狠| 免费无码视频一区二区| 成全在线观看高清的| 亚洲色男人天堂| 五月婷婷六月激情| 波多野结衣国产区42部| 大鸡巴网站| 日韩欧美国产成人| 黄色一级片免费在线观看| 日韩精品不卡| 欧美激情精品| 成人性生活A级毛片网站| av网站免费看| 夜夜天天人人| 91久久99久久91熟女精品| 日韩无码免费电影| 欧美亚洲成人精品| 蜜桃av在线| 亚洲国产成人久久| 人妻人人爽| 特级西西444www精品视频| 激情网婷婷| 精品自拍视频| 91伊人在线| 国产高清毛片| 俺来也网| 51妺嘿嘿午夜福利视频| 4虎亚洲人成人网www| 国产一级操逼视频| 亚洲中文无码AV在线| 婷婷五月丁香六月| 欧美激情片| 山东乱子伦视频国产| 在线观看91| 熟女人妻在线观看| 摸BBB槡BBBB搡BBB,,,,,| 在线黄片视频| 婷婷欧美日韩| 丁香婷婷久久久综合精品国产| 国产AⅤ爽aV久久久久成人| 一区二区三区无码专区| 亚洲福利视频97| 亚洲无码一级片| 91二区三区| 国产精品三级片| 91人妻人人澡人人爽人人精品乱 | 久久精品视频9| 91麻豆精品在线| 国产人成一区二区三区影院| 中文字幕在线视频第一页| 色天堂色男人| 在线观看国产黄色| 69式荫蒂被添全过程| 亚洲午夜福利一区二区三区| 91精品人妻一区二区三区蜜桃欧美| 性爱一级片| 国产免费av在线观看| 欧美在线一区二区三区| 99九九热| 成人国产片| 成人做爰A片一区二区| 中文字幕15页| 十八无码成人免费网站| 天堂无码| 九色PORNY9l原创自拍| AⅤ在线观看| 在线观看免费欧美操逼视频 | 精品成人在线观看| 乌克兰xxxx| 午夜无码AV| 黄色免费一级片| 精品久久久999| 欧美黄片在线| 久操视频在线观看免费| 天天干天天干天天操| 日韩欧美一区二区三区不卡| 一本色道久久综合无码人妻 | 东京热三区| 女生自慰网站免费| 天天谢天天干| 乱子伦国产精品| 黄色国产免费| 久久久久久少妇| 三级片青青草| 婷婷精品国产a久久综合| 7799综合| 波多野结衣视频在线观看| 91人妻人人操| 成人无码区免费| 亚洲五区| 无套内射免费视频| 91亚洲国产| 精品国产一区二区三区久久久蜜月 | 国产经典午夜福利视频合集| 天天天做夜夜夜爽无码| 人人妻人人澡人人爽久久con| 永久免费视频| 求欧美精品网址| 亚洲黑人av| 免费一级婬片AA片观看| www.偷拍| 国产毛片在线视频| 人人艹在线| 青青草手机视频在线| 91精品人妻一区二区三区蜜桃| 五月在线视频| 中文字幕在线观看有码| 97超碰色| 亚洲无码视频在线播放| 大鸡巴久久久| 日韩中文字幕免费在线观看| 日韩精品无码人妻| 久久99精品国产麻豆婷婷洗澡| 五月丁香中文字幕| 日韩精品三级| 久久大香蕉网| 黄色免费毛片| 日韩精品一区二区三区免费观看高清| 91婷婷五月天| 俺也去大香蕉| 欧美综合自拍| 国产成人综合亚洲| 国产一区二区三区18| 亚洲无码视频一区| 天天操天天操天天操天天操| 男人手机天堂| 成人视频高清无码| 日韩黄色视频| 在线免费看毛片| 黄色理论片| 中文字幕亚洲天堂| 欧美成人乱码一区二区三区| 欧美高清在线综合| 豆花成人视频| 色天使亚洲| 欧美日韩在线看| 亚洲Av秘无码一区二区| 日韩一级电影在线| 国产三级毛片| 午夜无码人妻AV| 97精品视频在线观看| jizz免费在线观看| 成人一区二区三区四区五区| 国产性交网站| 日本草逼视频| 欧美色999| 蜜桃毛片| 国产剧情一区二区三区| 超碰av电影| 欧美h| 青草福利视频| 伊人导航| 亚洲成人AV在线观看| 久久色婷婷| 91精品国产一区三一| 日韩A级视频| 综合站欧美精品| 果冻传媒A片一二三区| 中文不卡视频| 午夜AAA| 喷水视频在线观看| 中文观看| 2018天天操天天干| 中文字幕乱码视频32| 午夜黄色视频| 99在线视频免费观看| 丁香五月影院| 丁香欧美| 亚洲无吗在线观看| 久久视频免费在线观看| 三级理论网站| 人人操人人透| 中文字幕永久在线5| 国产第二页| 免费无码一区二区三区| 第一福利成人AV导航| 精品孕妇一区二区三区| 又黄又爽视频| 无码在线专区| 欧美午夜精品久久久久免费视| 日韩激情无码视频精选| 亚洲黄色av| 免费看操逼视频| 黄色片A片| 91在线一区二区| 欧美性性生交XXXXX无码| 久久大鸡巴| 嗯嗯啊啊网站| 天天日日日干| 国产又粗又长又硬又大毛苴茸图片 | 操少妇逼| 亚洲国产成人91精品| 色图15p| 五月天婷婷综合网| 97精品人妻一区二区三区香蕉农| 摸BBB槡BBBB搡BBB,,,,,| 欧美性爱永久| 国产高清视频| 天天综合久久| 99视频内射三四| 69人妻人人澡人人爽人人精品| 桃色一区| 亚洲乱码在线观看| 亚洲午夜精品久久久| 国产精品无码中文在线| www.豆花福利视频| 国产香蕉视频在线播放| 91嫖妓站街埯店老熟女| 欧美日韩在线观看一区二区三区| 黄色视频在线| 青青草做爱视频| 国产无码在线影院| 亚洲欧美美国产| 久草资源| 一区二区三区成人| 日韩一二区| 国产少妇| 人人操操| 大香蕉网视频| 人妻骚逼| 18一20女一片毛片| 人人妻人人爽人人澡人人精品| 亚洲成人AV在线观看| 欧美黄色录像| 91丨九色丨老农村| 熟妇在线| 亚洲在线高清| 午夜福利91| 黄色片视频| 囯产精品久久久久久久久免费无码 | 91免费观看网站| 国产福利在线导航| 中文字幕成人免费视频| 国产精品色哟哟| 国产欧美一区二区三区特黄手机版| 狼人综合影院| 欧美无遮挡| 调教人妻视频| 亚洲无码午夜| 国产欧美一| 亚洲高潮| 大香蕉美女视频| 国产美女做爱| 欧美日韩一区二区三区四区五区六区 | 久久成人导航| 色色爱爱| 夜夜夜影院| 国产午夜在线视频| www.17c嫩嫩草色蜜桃网站| 丁香五月色情| 韩日精品视频| 九色在线观看| 欧美黄片免费观看| 日韩欧美成人电影| 国产成人无码一区二区在线| 伊人久久大香| 牛牛在线视频| 99免费视频在线观看| 色网在线观看| 日韩大香蕉| 色AV高清| 国产精品HongKong麻豆| 国产一级婬片A片免费妖精视频| 中文字幕午夜福利| 国产精品久久久一区二区三区| 最新日韩在线| AV无码国产| 天堂无吗| 男人操女人视频网站| 久久久老熟女一区二区三区91| 国产思思99re99在线观看| 国产v亚洲| 风间由美大荫蒂无码AV| 天天色粽合合合合合合合| 亚洲人成电影网| 久久这里只有精品9| AV先锋资源| 婷婷中文网| 99国产精品99久久久久久粉嫩 | www.四虎成人网站| 免费观看黄色视频| 激情av天堂| 四虎在线观看视频| 欧美A片在线免费观看| 国产一级A片免费播放| 欧美老熟妇BBBBB搡BBB| 中文字幕36页| 黄色电影大香蕉| 女同久久另类99精品国产91 | 久久国产热视频| 五月天婷婷色色| 五月婷婷激情综合| 久久黄色网址| 日韩A片无码ⅩXXXX| 久久久999| 另类老妇性BBwBBw| 日本少妇高清视频| 成人黄色导航| 9无码| 欧美国产操逼| 大香蕉国产在线视频| 国产探花| 亚洲日本高清| 中文字幕一区二区6页| 日逼图| 日韩做爱视频| 日本三级片在线动| 伊人蕉| 亚洲欧美日韩在线| 国产乱子伦精品久久| 亚洲日韩三级| 91抽插| 久草香蕉视频| 国产在线黄片| 操逼黄色视频| 午夜精品久久久久久不卡8050 | 久久久成人免费电影| 欧美人妻视频| 天天看天天操| 日韩女人性爱| 激情小视频在线| 18禁在线看| 日韩一区二| 色综合久久久无码中文字幕999 | 国产高清A片| 国产一级黄色录像| 在线观看亚洲天堂| 玖玖在线| 一区二区三区操逼| 国产午夜福利视频在线观看| 天天A片| 性爱视频久久| 国产成人性爱| 91天天射| www.91爱爱,com| 色我影院| 亚洲欧洲在线播放| 国产婬片lA片www777| 亚洲无码AV在线观看| 青草国产视频| 国产美女自拍视频| 国产中文字幕在线| 51XX嘿嘿午夜| 亚洲免费视频在线看| 一级黄色生活片| 精品一区二区三区在线观看| 在线免费观看黄色片| 国产三级无码| 日本乱伦电影中文字幕| 最新激情网站| 在线视频A| 日韩爱爱爱| 日逼黄色| 波多野结衣无码高清| 99大香蕉视频| 国产视频精品一区二区三区| 中文字幕乱码中文乱码91| 女人18片毛片60分钟黃菲菲| 黄色免费大片| 91九色丨国产丨爆乳| 久久青草影院| 久久一二三| 久久久久成人精品无码| 26∪u∪成人网站| 超碰av在线| 日韩一a| 九七在线视频| 国产美女一级真毛片酒店| 免费v片在线观看| 嫩草视频在线观看| 波多野结衣成人网站| 91精品午夜少妇| 日韩欧美成人在线观看| 亚洲天堂2025| 欧美浮力| 黄色录像一级带| 天堂a在线8| 五月丁香六月婷婷综合| 韩国精品无码一区二区三区18| 人人摸人人看| 日韩资源站| 伊人天天日| 呦小BBBB小小BBBB| 日韩高清无码一区| 亚洲AV无码国产精品二区| 日韩無码专区| 国产精品成人一区二区| 国产AV中文字幕| AV日逼网| 三级影片在线观看性| 中文字幕黄色片| 三级片麻豆| 青春草视频| 一级a黄色片| 成人免费黄色片| 久久综合热| 日本东京热视频| 精品国产999久久久免费| 日本操B视频| 91在线无码精品秘| 日韩操逼| 青青操色| 亚洲精品一二三| 久久久久久亚洲AV无码专区 | 亚洲人成色777777无码| 国产又爽又黄免费网站在线观看| 国产嫩草久久久一二三久久免费观看 | 久久久69| 中文无码一区| 亚洲成人一区二区| 国产成人精品国内自产拍免费看| 日韩无码AV一区二区三区| 亚洲国产激情| 青娱乐av| 三级黄,色| 精品无码久久久| 国产中文字幕视频| 日本女人高潮视频| 日中国老太太B| 欧美成人三级在线观看| 中文字幕免费观看| 欧美XX888做受| 人人爽久久涩噜噜噜网站| 日本色色| 日韩免费Av| 蜜桃亚洲AV无码一区二区三区| 91成人电影在线| A亚洲天堂| 中国a一片一级一片| 五月丁香999| 婷婷色图| 亚洲国产免费视频| 波多野结衣一区二区三区在线观看| 亚洲骚货| 91久久久久久久91| 牛牛AV在线| 色婷婷大香蕉| 败火老熟女ThePorn视频| 成人做爰黄片视频免费| 亚洲综合视频在线| 国产曰韩欧美综合另类在线| 午夜福利无码电影| www一级片| 日韩视频一区| 日韩在线视频第一页| 日韩欧美精品一区二区| 中文字幕A片无码免费看| 精品久久三级片| 天堂网AV在线| 伊人久操| 天堂av中文字幕| 无码中文字幕在线视频| 亚洲综合色婷婷| 黄色激情av| 天天摸天天看| 亚洲视频一区二区三区| 无码毛片在线观看| 九九九精品在线| 一级黄色片免费看| 国产嫩草影院| www.俺去了| 五月丁香六月| 99精品网站| 免费91视频| 成人在线网站| 无码人妻久久一区二区三区蜜桃 | 亚洲成人性爱| 亚洲经典一| 91视频在线免费看| 91视频一区| 天堂国产一区二区三区| 激情国产| 亚洲精品乱码久久久久久按摩观 | 成人精品水蜜桃| 精品三级片| 在线久操| 91豆花成人网站| 激情亚洲五月天| 成人免费黄色片| 成人在线黄色视频|