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

一次Dubbo擁堵的分析

共 21102字,需瀏覽 43分鐘

 ·

2020-08-24 03:29

作者:nxlhero

https://blog.51cto.com/nxlhero/2515849

文章內(nèi)容結(jié)構(gòu)

第一部分介紹生產(chǎn)上出現(xiàn)Dubbo服務(wù)擁堵的情況,以及Dubbo官方對于單個長連接的使用建議。

第二部分介紹Dubbo在特定配置下的通信過程,輔以代碼。

第三部分介紹整個調(diào)用過程中與性能相關(guān)的一些參數(shù)。

第四部分通過調(diào)整連接數(shù)和TCP緩沖區(qū)觀察Dubbo的性能。

一、背景

生產(chǎn)擁堵回顧

近期在一次生產(chǎn)發(fā)布過程中,因為突發(fā)的流量,出現(xiàn)了擁堵。系統(tǒng)的部署圖如下,客戶端通過Http協(xié)議訪問到Dubbo的消費者,消費者通過Dubbo協(xié)議訪問服務(wù)提供者。這是單個機房,8個消費者3個提供者,共兩個機房對外服務(wù)。

在發(fā)布的過程中,摘掉一個機房,讓另一個機房對外服務(wù),然后摘掉的機房發(fā)布新版本,然后再互換,最終兩個機房都以新版本對外服務(wù)。問題就出現(xiàn)單機房對外服務(wù)的時候,這時候單機房還是老版本應(yīng)用。以前不知道晚上會有一個高峰,結(jié)果當(dāng)晚的高峰和早上的高峰差不多了,單機房扛不住這么大的流量,出現(xiàn)了擁堵。這些流量的特點是并發(fā)比較高,個別交易返回報文較大,因為是一個產(chǎn)品列表頁,點擊后會發(fā)送多個交易到后臺。

在問題發(fā)生時,因為不清楚狀態(tài),先切到另外一個機房,結(jié)果也擁堵了,最后整體回退,折騰了一段時間沒有問題了。當(dāng)時有一些現(xiàn)象:

(1)提供者的CPU內(nèi)存等都不高,第一個機房的最高CPU 66%(8核虛擬機),第二個機房的最高CPU 40%(16核虛擬機)。消費者的最高CPU只有30%多(兩個消費者結(jié)點位于同一臺虛擬機上)

(2)在擁堵的時候,服務(wù)提供者的Dubbo業(yè)務(wù)線程池(下面會詳細(xì)介紹這個線程池)并沒滿,最多到了300,最大值是500。但是把這個機房摘下后,也就是沒有外部的流量了,線程池反而滿了,而且好幾分鐘才把堆積的請求處理完。

(3)通過監(jiān)控工具統(tǒng)計的每秒進入Dubbo業(yè)務(wù)線程池的請求數(shù),在擁堵時,時而是0,時而特別大,在日間正常的時候,這個值不存在為0的時候。

事故原因猜測

當(dāng)時其他指標(biāo)沒有檢測到異常,也沒有打Dump,我們通過分析這些現(xiàn)象以及我們的Dubbo配置,猜測是在網(wǎng)絡(luò)上發(fā)生了擁堵,而影響擁堵的關(guān)鍵參數(shù)就是Dubbo協(xié)議的連接數(shù),我們默認(rèn)使用了單個連接,但是消費者數(shù)量較少,沒能充分把網(wǎng)絡(luò)資源利用起來。

默認(rèn)的情況下,每個Dubbo消費者與Dubbo提供者建立一個長連接,Dubbo官方對此的建議是:

Dubbo 缺省協(xié)議采用單一長連接和 NIO 異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費者機器數(shù)遠(yuǎn)大于服務(wù)提供者機器數(shù)的情況。

反之,Dubbo 缺省協(xié)議不適合傳送大數(shù)據(jù)量的服務(wù),比如傳文件,傳視頻等,除非請求量很低。

(http://dubbo.apache.org/zh-cn/docs/user/references/protocol/dubbo.html)

以下也是Dubbo官方提供的一些常見問題回答:

為什么要消費者比提供者個數(shù)多?

因 dubbo 協(xié)議采用單一長連接,假設(shè)網(wǎng)絡(luò)為千兆網(wǎng)卡,根據(jù)測試經(jīng)驗數(shù)據(jù)每條連接最多只能壓滿 7MByte(不同的環(huán)境可能不一樣,供參考),理論上 1 個服務(wù)提供者需要 20 個服務(wù)消費者才能壓滿網(wǎng)卡。

為什么不能傳大包?

因 dubbo 協(xié)議采用單一長連接,如果每次請求的數(shù)據(jù)包大小為 500KByte,假設(shè)網(wǎng)絡(luò)為千兆網(wǎng)卡,每條連接最大 7MByte(不同的環(huán)境可能不一樣,供參考),單個服務(wù)提供者的 TPS(每秒處理事務(wù)數(shù))最大為:128MByte / 500KByte = 262。單個消費者調(diào)用單個服務(wù)提供者的 TPS(每秒處理事務(wù)數(shù))最大為:7MByte / 500KByte = 14。如果能接受,可以考慮使用,否則網(wǎng)絡(luò)將成為瓶頸。

為什么采用異步單一長連接?

因為服務(wù)的現(xiàn)狀大都是服務(wù)提供者少,通常只有幾臺機器,而服務(wù)的消費者多,可能整個網(wǎng)站都在訪問該服務(wù),比如 Morgan 的提供者只有 6 臺提供者,卻有上百臺消費者,每天有 1.5 億次調(diào)用,如果采用常規(guī)的 hessian 服務(wù),服務(wù)提供者很容易就被壓跨,通過單一連接,保證單一消費者不會壓死提供者,長連接,減少連接握手驗證等,并使用異步 IO,復(fù)用線程池,防止 C10K 問題。

因為我們的消費者數(shù)量和提供者數(shù)量都不多,所以很可能是連接數(shù)不夠,導(dǎo)致網(wǎng)絡(luò)傳輸出現(xiàn)了瓶頸。以下我們通過詳細(xì)分析Dubbo協(xié)議和一些實驗來驗證我們的猜測。

二、Dubbo通信流程詳解

我們用的Dubbo版本比較老,是2.5.x的,它使用的netty版本是3.2.5,最新版的Dubbo在線程模型上有一些修改,我們以下的分析是以2.5.10為例。

以圖和部分代碼說明Dubbo協(xié)議的調(diào)用過程,代碼只寫了一些關(guān)鍵部分,使用的是netty3,dubbo線程池?zé)o隊列,同步調(diào)用,以下代碼包含了Dubbo和Netty的代碼。

整個Dubbo一次調(diào)用過程如下:

1.請求入隊

我們通過Dubbo調(diào)用一個rpc服務(wù),調(diào)用線程其實是把這個請求封裝后放入了一個隊列里。這個隊列是netty的一個隊列,這個隊列的定義如下,是一個Linked隊列,不限長度。

class NioWorker implements Runnable {
...
private final Queue writeTaskQueue = new LinkedTransferQueue();
...
}

主線程經(jīng)過一系列調(diào)用,最終通過NioClientSocketPipelineSink類里的方法把請求放入這個隊列,放入隊列的請求,包含了一個請求ID,這個ID很重要。

2.調(diào)用線程等待

入隊后,netty會返回給調(diào)用線程一個Future,然后調(diào)用線程等待在Future上。這個Future是Dubbo定義的,名字叫DefaultFuture,主調(diào)用線程調(diào)用DefaultFuture.get(timeout),等待通知,所以我們看與Dubbo相關(guān)的ThreadDump,經(jīng)常會看到線程停在這,這就是在等后臺返回。

public class DubboInvoker<T> extends AbstractInvoker<T> {
...
@Override
protected Result doInvoke(final Invocation invocation) throws Throwable {
...
return (Result) currentClient.request(inv, timeout).get(); //currentClient.request(inv, timeout)返回了一個DefaultFuture
}
...
}

我們可以看一下這個DefaultFuture的實現(xiàn),

public class DefaultFuture implements ResponseFuture {

private static final Map CHANNELS = new ConcurrentHashMap();
private static final Map FUTURES = new ConcurrentHashMap();

// invoke id.
private final long id; //Dubbo請求的id,每個消費者都是一個從0開始的long類型
private final Channel channel;
private final Request request;
private final int timeout;
private final Lock lock = new ReentrantLock();
private final Condition done = lock.newCondition();
private final long start = System.currentTimeMillis();
private volatile long sent;
private volatile Response response;
private volatile ResponseCallback callback;
public DefaultFuture(Channel channel, Request request, int timeout) {
this.channel = channel;
this.request = request;
this.id = request.getId();
this.timeout = timeout > 0 ? timeout : channel.getUrl().getPositiveParameter(Constants.TIMEOUT_KEY, Constants.DEFAULT_TIMEOUT);
// put into waiting map.
FUTURES.put(id, this); //等待時以id為key把Future放入全局的Future Map中,這樣回復(fù)數(shù)據(jù)回來了可以根據(jù)id找到對應(yīng)的Future通知主線程
CHANNELS.put(id, channel);
}

3.IO線程讀取隊列里的數(shù)據(jù)

這個工作是由netty的IO線程池完成的,也就是NioWorker,對應(yīng)的類叫NioWorker。它會死循環(huán)的執(zhí)行select,在select中,會一次性把隊列中的寫請求處理完,select的邏輯如下:

public void run() {
for (;;) {
....
SelectorUtil.select(selector);

proce***egisterTaskQueue();
processWriteTaskQueue(); //先處理隊列里的寫請求
processSelectedKeys(selector.selectedKeys()); //再處理select事件,讀寫都可能有
....
}
}
private void processWriteTaskQueue() throws IOException {
for (;;) {
final Runnable task = writeTaskQueue.poll();//這個隊列就是調(diào)用線程把請求放進去的隊列
if (task == null) {
break;
}
task.run(); //寫數(shù)據(jù)
cleanUpCancelledKeys();
}
}

4.IO線程把數(shù)據(jù)寫到Socket緩沖區(qū)

這一步很重要,跟我們遇到的性能問題相關(guān),還是NioWorker,也就是上一步的task.run(),它的實現(xiàn)如下:

    void writeFromTaskLoop(final NioSocketChannel ch) {
if (!ch.writeSuspended) { //這個地方很重要,如果writeSuspended了,那么就直接跳過這次寫
write0(ch);
}
}
private void write0(NioSocketChannel channel) {
......
final int writeSpinCount = channel.getConfig().getWriteSpinCount(); //netty可配置的一個參數(shù),默認(rèn)是16
synchronized (channel.writeLock) {
channel.inWriteNowLoop = true;
for (;;) {

for (int i = writeSpinCount; i > 0; i --) { //每次最多嘗試16次
localWrittenBytes = buf.transferTo(ch);
if (localWrittenBytes != 0) {
writtenBytes += localWrittenBytes;
break;
}
if (buf.finished()) {
break;
}
}

if (buf.finished()) {
// Successful write - proceed to the next message.
buf.release();
channel.currentWriteEvent = null;
channel.currentWriteBuffer = null;
evt = null;
buf = null;
future.setSuccess();
} else {
// Not written fully - perhaps the kernel buffer is full.
//重點在這,如果寫16次還沒寫完,可能是內(nèi)核緩沖區(qū)滿了,writeSuspended被設(shè)置為true
addOpWrite = true;
channel.writeSuspended = true;
......
}
......
if (open) {
if (addOpWrite) {
setOpWrite(channel);
} else if (removeOpWrite) {
clearOpWrite(channel);
}
}
......
}

fireWriteComplete(channel, writtenBytes);
}

正常情況下,隊列中的寫請求要通過processWriteTaskQueue處理掉,但是這些寫請求也同時注冊到了selector上,如果processWriteTaskQueue寫成功,就會刪掉selector上的寫請求。如果Socket的寫緩沖區(qū)滿了,對于NIO,會立刻返回,對于BIO,會一直等待。Netty使用的是NIO,它嘗試16次后,還是不能寫成功,它就把writeSuspended設(shè)置為true,這樣接下來的所有寫請求都會被跳過。那什么時候會再寫呢?這時候就得靠selector了,它如果發(fā)現(xiàn)socket可寫,就把這些數(shù)據(jù)寫進去。

下面是processSelectedKeys里寫的過程,因為它是發(fā)現(xiàn)socket可寫才會寫,所以直接把writeSuspended設(shè)為false。

void writeFromSelectorLoop(final SelectionKey k) {
NioSocketChannel ch = (NioSocketChannel) k.attachment();
ch.writeSuspended = false;
write0(ch);
}

5.數(shù)據(jù)從消費者的socket發(fā)送緩沖區(qū)傳輸?shù)教峁┱叩慕邮站彌_區(qū)

這個是操作系統(tǒng)和網(wǎng)卡實現(xiàn)的,應(yīng)用層的write寫成功了,并不代表對面能收到,當(dāng)然tcp會通過重傳能機制盡量保證對端收到。

6.服務(wù)端IO線程從緩沖區(qū)讀取請求數(shù)據(jù)

這個是服務(wù)端的NIO線程實現(xiàn)的,在processSelectedKeys中。

   public void run() {
for (;;) {
....
SelectorUtil.select(selector);

proce***egisterTaskQueue();
processWriteTaskQueue();
processSelectedKeys(selector.selectedKeys()); //再處理select事件,讀寫都可能有
....
}
}
private void processSelectedKeys(Set selectedKeys) throws IOException {
for (Iterator i = selectedKeys.iterator(); i.hasNext();) {
SelectionKey k = i.next();
i.remove();
try {
int readyOps = k.readyOps();
if ((readyOps & SelectionKey.OP_READ) != 0 || readyOps == 0) {
if (!read(k)) {
// Connection already closed - no need to handle write.
continue;
}
}
if ((readyOps & SelectionKey.OP_WRITE) != 0) {
writeFromSelectorLoop(k);
}
} catch (CancelledKeyException e) {
close(k);
}

if (cleanUpCancelledKeys()) {
break; // break the loop to avoid ConcurrentModificationException
}
}
}
private boolean read(SelectionKey k) {
......

// Fire the event.
fireMessageReceived(channel, buffer); //讀取完后,最終會調(diào)用這個函數(shù),發(fā)送一個收到信息的事件
......

}

7.IO線程把請求交給Dubbo線程池

按配置不同,走的Handler不同,配置dispatch為all,走的handler如下。下面IO線程直接交給一個ExecutorService來處理這個請求,出現(xiàn)了熟悉的報錯“Threadpool is exhausted",業(yè)務(wù)線程池滿時,如果沒有隊列,就會報這個錯。

public class AllChannelHandler extends WrappedChannelHandler {
......
public void received(Channel channel, Object message) throws RemotingException {
ExecutorService cexecutor = getExecutorService();
try {
cexecutor.execute(new ChannelEventRunnable(channel, handler, ChannelState.RECEIVED, message));
} catch (Throwable t) {
//TODO A temporary solution to the problem that the exception information can not be sent to the opposite end after the thread pool is full. Need a refactoring
//fix The thread pool is full, refuses to call, does not return, and causes the consumer to wait for time out
if(message instanceof Request && t instanceof RejectedExecutionException){
Request request = (Request)message;
if(request.isTwoWay()){
String msg = "Server side(" + url.getIp() + "," + url.getPort() + ") threadpool is exhausted ,detail msg:" + t.getMessage();
Response response = new Response(request.getId(), request.getVersion());
response.setStatus(Response.SERVER_THREADPOOL_EXHAUSTED_ERROR);
response.setErrorMessage(msg);
channel.send(response);
return;
}
}
throw new ExecutionException(message, channel, getClass() + " error when process received event .", t);
}
}
......
}

8.服務(wù)端Dubbo線程池處理完請求后,把返回報文放入隊列

線程池會調(diào)起下面的函數(shù)

public class HeaderExchangeHandler implements ChannelHandlerDelegate {
......
Response handleRequest(ExchangeChannel channel, Request req) throws RemotingException {
Response res = new Response(req.getId(), req.getVersion());
......
// find handler by message class.
Object msg = req.getData();
try {
// handle data.
Object result = handler.reply(channel, msg); //真正的業(yè)務(wù)邏輯類
res.setStatus(Response.OK);
res.setResult(result);
} catch (Throwable e) {
res.setStatus(Response.SERVICE_ERROR);
res.setErrorMessage(StringUtils.toString(e));
}
return res;
}

public void received(Channel channel, Object message) throws RemotingException {
......

if (message instanceof Request) {
// handle request.
Request request = (Request) message;

if (request.isTwoWay()) {
Response response = handleRequest(exchangeChannel, request); //處理業(yè)務(wù)邏輯,得到一個Response
channel.send(response); //回寫response
}
}
......

}

channel.send(response)最終調(diào)用了NioServerSocketPipelineSink里的方法把返回報文放入隊列。

9.服務(wù)端IO線程從隊列中取出數(shù)據(jù)

與流程3一樣

10.服務(wù)端IO線程把回復(fù)數(shù)據(jù)寫入Socket發(fā)送緩沖區(qū)

IO線程寫數(shù)據(jù)的時候,寫入到TCP緩沖區(qū)就算成功了。但是如果緩沖區(qū)滿了,會寫不進去。對于阻塞和非阻塞IO,返回結(jié)果不一樣,阻塞IO會一直等,而非阻塞IO會立刻失敗,讓調(diào)用者選擇策略。

Netty的策略是嘗試最多寫16次,如果不成功,則暫時停掉IO線程的寫操作,等待連接可寫時再寫,writeSpinCount默認(rèn)是16,可以通過參數(shù)調(diào)整。

for (int i = writeSpinCount; i > 0; i --) {
localWrittenBytes = buf.transferTo(ch);
if (localWrittenBytes != 0) {
writtenBytes += localWrittenBytes;
break;
}
if (buf.finished()) {
break;
}
}

if (buf.finished()) {
// Successful write - proceed to the next message.
buf.release();
channel.currentWriteEvent = null;
channel.currentWriteBuffer = null;
evt = null;
buf = null;
future.setSuccess();
} else {
// Not written fully - perhaps the kernel buffer is full.
addOpWrite = true;
channel.writeSuspended = true;

11.數(shù)據(jù)傳輸

數(shù)據(jù)在網(wǎng)絡(luò)上傳輸主要取決于帶寬和網(wǎng)絡(luò)環(huán)境。

12.客戶端IO線程把數(shù)據(jù)從緩沖區(qū)讀出

這個過程跟流程6是一樣的

13.IO線程把數(shù)據(jù)交給Dubbo業(yè)務(wù)線程池

這一步與流程7是一樣的,這個線程池名字為DubboClientHandler。

14.業(yè)務(wù)線程池根據(jù)消息ID通知主線程

先通過HeaderExchangeHandler的received函數(shù)得知是Response,然后調(diào)用handleResponse,

public class HeaderExchangeHandler implements ChannelHandlerDelegate {
static void handleResponse(Channel channel, Response response) throws RemotingException {
if (response != null && !response.isHeartbeat()) {
DefaultFuture.received(channel, response);
}
}
public void received(Channel channel, Object message) throws RemotingException {
......
if (message instanceof Response) {
handleResponse(channel, (Response) message);
}
......
}

DefaultFuture根據(jù)ID獲取Future,通知調(diào)用線程

 public static void received(Channel channel, Response response) {
......
DefaultFuture future = FUTURES.remove(response.getId());
if (future != null) {
future.doReceived(response);
}
......
}

至此,主線程獲取了返回數(shù)據(jù),調(diào)用結(jié)束。

三、影響上述流程的關(guān)鍵參數(shù)

協(xié)議參數(shù)

我們在使用Dubbo時,需要在服務(wù)端配置協(xié)議,例如

name="dubbo" port="20880" dispatcher="all" threadpool="fixed" threads="2000" />

下面是協(xié)議中與性能相關(guān)的一些參數(shù),在我們的使用場景中,線程池選用了fixed,大小是500,隊列為0,其他都是默認(rèn)值。

屬性對應(yīng)URL參數(shù)類型是否必填缺省值作用描述
namestring必填dubbo性能調(diào)優(yōu)協(xié)議名稱
threadpoolthreadpoolstring可選fixed性能調(diào)優(yōu)線程池類型,可選:fixed/cached。
threadsthreadsint可選200性能調(diào)優(yōu)服務(wù)線程池大小(固定大小)
queuesqueuesint可選0性能調(diào)優(yōu)線程池隊列大小,當(dāng)線程池滿時,排隊等待執(zhí)行的隊列大小,建議不要設(shè)置,當(dāng)線程池滿時應(yīng)立即失敗,重試其它服務(wù)提供機器,而不是排隊,除非有特殊需求。
iothreadsiothreadsint可選cpu個數(shù)+1性能調(diào)優(yōu)io線程池大小(固定大小)
acceptsacceptsint可選0性能調(diào)優(yōu)服務(wù)提供方最大可接受連接數(shù),這個是整個服務(wù)端可以建的最大連接數(shù),比如設(shè)置成2000,如果已經(jīng)建立了2000個連接,新來的會被拒絕,是為了保護服務(wù)提供方。
dispatcherdispatcherstring可選dubbo協(xié)議缺省為all性能調(diào)優(yōu)協(xié)議的消息派發(fā)方式,用于指定線程模型,比如:dubbo協(xié)議的all, direct, message, execution, connection等。這個主要牽涉到IO線程池和業(yè)務(wù)線程池的分工問題,一般情況下,讓業(yè)務(wù)線程池處理建立連接、心跳等,不會有太大影響。
payloadpayloadint可選8388608(=8M)性能調(diào)優(yōu)請求及響應(yīng)數(shù)據(jù)包大小限制,單位:字節(jié)。這個是單個報文允許的最大長度,Dubbo不適合報文很長的請求,所以加了限制。
bufferbufferint可選8192性能調(diào)優(yōu)網(wǎng)絡(luò)讀寫緩沖區(qū)大小。注意這個不是TCP緩沖區(qū),這個是在讀寫網(wǎng)絡(luò)報文時,應(yīng)用層的Buffer。
codeccodecstring可選dubbo性能調(diào)優(yōu)協(xié)議編碼方式
serializationserializationstring可選dubbo協(xié)議缺省為hessian2,rmi協(xié)議缺省為java,http協(xié)議缺省為json性能調(diào)優(yōu)協(xié)議序列化方式,當(dāng)協(xié)議支持多種序列化方式時使用,比如:dubbo協(xié)議的dubbo,hessian2,java,compactedjava,以及http協(xié)議的json等
transportertransporterstring可選dubbo協(xié)議缺省為netty性能調(diào)優(yōu)協(xié)議的服務(wù)端和客戶端實現(xiàn)類型,比如:dubbo協(xié)議的mina,netty等,可以分拆為server和client配置
serverserverstring可選dubbo協(xié)議缺省為netty,http協(xié)議缺省為servlet性能調(diào)優(yōu)協(xié)議的服務(wù)器端實現(xiàn)類型,比如:dubbo協(xié)議的mina,netty等,http協(xié)議的jetty,servlet等
clientclientstring可選dubbo協(xié)議缺省為netty性能調(diào)優(yōu)協(xié)議的客戶端實現(xiàn)類型,比如:dubbo協(xié)議的mina,netty等
charsetcharsetstring可選UTF-8性能調(diào)優(yōu)序列化編碼
heartbeatheartbeatint可選0性能調(diào)優(yōu)心跳間隔,對于長連接,當(dāng)物理層斷開時,比如拔網(wǎng)線,TCP的FIN消息來不及發(fā)送,對方收不到斷開事件,此時需要心跳來幫助檢查連接是否已斷開

服務(wù)參數(shù)

針對每個Dubbo服務(wù),都會有一個配置,全部的參數(shù)配置在這:http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html。

我們關(guān)注幾個與性能相關(guān)的。在我們的使用場景中,重試次數(shù)設(shè)置成了0,集群方式用的failfast,其他是默認(rèn)值。

屬性對應(yīng)URL參數(shù)類型是否必填缺省值作用描述兼容性
delaydelayint可選0性能調(diào)優(yōu)延遲注冊服務(wù)時間(毫秒) ,設(shè)為-1時,表示延遲到Spring容器初始化完成時暴露服務(wù)1.0.14以上版本
timeouttimeoutint可選1000性能調(diào)優(yōu)遠(yuǎn)程服務(wù)調(diào)用超時時間(毫秒)2.0.0以上版本
retriesretriesint可選2性能調(diào)優(yōu)遠(yuǎn)程服務(wù)調(diào)用重試次數(shù),不包括第一次調(diào)用,不需要重試請設(shè)為02.0.0以上版本
connectionsconnectionsint可選1性能調(diào)優(yōu)對每個提供者的最大連接數(shù),rmi、http、hessian等短連接協(xié)議表示限制連接數(shù),dubbo等長連接協(xié)表示建立的長連接個數(shù)2.0.0以上版本
loadbalanceloadbalancestring可選random性能調(diào)優(yōu)負(fù)載均衡策略,可選值:random,roundrobin,leastactive,分別表示:隨機,輪詢,最少活躍調(diào)用2.0.0以上版本
asyncasyncboolean可選false性能調(diào)優(yōu)是否缺省異步執(zhí)行,不可靠異步,只是忽略返回值,不阻塞執(zhí)行線程2.0.0以上版本
weightweightint可選
性能調(diào)優(yōu)服務(wù)權(quán)重2.0.5以上版本
executesexecutesint可選0性能調(diào)優(yōu)服務(wù)提供者每服務(wù)每方法最大可并行執(zhí)行請求數(shù)2.0.5以上版本
proxyproxystring可選javassist性能調(diào)優(yōu)生成動態(tài)代理方式,可選:jdk/javassist2.0.5以上版本
clusterclusterstring可選failover性能調(diào)優(yōu)集群方式,可選:failover/failfast/failsafe/failback/forking2.0.5以上版本

這次擁堵的主要原因,應(yīng)該就是服務(wù)的connections設(shè)置的太小,dubbo不提供全局的連接數(shù)配置,只能針對某一個交易做個性化的連接數(shù)配置。

四、連接數(shù)與Socket緩沖區(qū)對性能影響的實驗

通過簡單的Dubbo服務(wù),驗證一下連接數(shù)與緩沖區(qū)大小對傳輸性能的影響。

我們可以通過修改系統(tǒng)參數(shù),調(diào)節(jié)TCP緩沖區(qū)的大小。

在 /etc/sysctl.conf 修改如下內(nèi)容, tcp_rmem是發(fā)送緩沖區(qū),tcp_wmem是接收緩沖區(qū),三個數(shù)值表示最小值,默認(rèn)值和最大值,我們可以都設(shè)置成一樣。

net.ipv4.tcp_rmem = 4096 873800 16777216
net.ipv4.tcp_wmem = 4096 873800 16777216

然后執(zhí)行sysctl –p 使之生效。

服務(wù)端代碼如下,接受一個報文,然后返回兩倍的報文長度,隨機sleep 0-300ms,所以均值應(yīng)該是150ms。服務(wù)端每10s打印一次tps和響應(yīng)時間,這里的tps是指完成函數(shù)調(diào)用的tps,而不涉及傳輸,響應(yīng)時間也是這個函數(shù)的時間。

   //服務(wù)端實現(xiàn)
public String sayHello(String name) {
counter.getAndIncrement();
long start = System.currentTimeMillis();
try {
Thread.sleep(rand.nextInt(300));
} catch (InterruptedException e) {
}
String result = "Hello " + name + name + ", response form provider: " + RpcContext.getContext().getLocalAddress();
long end = System.currentTimeMillis();
timer.getAndAdd(end-start);
return result;
}

客戶端起N個線程,每個線程不停的調(diào)用Dubbo服務(wù),每10s打印一次qps和響應(yīng)時間,這個qps和響應(yīng)時間是包含了網(wǎng)絡(luò)傳輸時間的。

        for(int i = 0; i < N; i ++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
Long start = System.currentTimeMillis();
String hello = service.sayHello(z);
Long end = System.currentTimeMillis();
totalTime.getAndAdd(end-start);
counter.getAndIncrement();
}
}});
threads[i].start();
}
通過ss -it命令可以看當(dāng)前tcp socket的詳細(xì)信息,包含待對端回復(fù)ack的數(shù)據(jù)Send-Q,最大窗口cwnd,rtt(round trip time)等。
(base) niuxinli@ubuntu:~$ ss -it
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 36 192.168.1.7:ssh 192.168.1.4:58931
cubic wscale:8,2 rto:236 rtt:33.837/8.625 ato:40 mss:1460 pmtu:1500 rcvmss:1460 advmss:1460 cwnd:10 bytes_acked:559805 bytes_received:54694 segs_out:2754 segs_in:2971 data_segs_out:2299 data_segs_in:1398 send 3.5Mbps pacing_rate 6.9Mbps delivery_rate 44.8Mbps busy:36820ms unacked:1 rcv_rtt:513649 rcv_space:16130 rcv_ssthresh:14924 minrtt:0.112
ESTAB 0 0 192.168.1.7:36666 192.168.1.7:2181
cubic wscale:7,7 rto:204 rtt:0.273/0.04 ato:40 mss:33344 pmtu:65535 rcvmss:536 advmss:65483 cwnd:10 bytes_acked:2781 bytes_received:3941 segs_out:332 segs_in:170 data_segs_out:165 data_segs_in:165 send 9771.1Mbps lastsnd:4960 lastrcv:4960 lastack:4960 pacing_rate 19497.6Mbps delivery_rate 7621.5Mbps app_limited busy:60ms rcv_space:65535 rcv_ssthresh:66607 minrtt:0.035
ESTAB 0 27474 192.168.1.7:20880 192.168.1.5:60760
cubic wscale:7,7 rto:204 rtt:1.277/0.239 ato:40 mss:1448 pmtu:1500 rcvmss:1448 advmss:1448 cwnd:625 ssthresh:20 bytes_acked:96432644704 bytes_received:49286576300 segs_out:68505947 segs_in:36666870 data_segs_out:67058676 data_segs_in:35833689 send 5669.5Mbps pacing_rate 6801.4Mbps delivery_rate 627.4Mbps app_limited busy:1340536ms rwnd_limited:400372ms(29.9%) sndbuf_limited:433724ms(32.4%) unacked:70 retrans:0/5 rcv_rtt:1.308 rcv_space:336692 rcv_ssthresh:2095692 notsent:6638 minrtt:0.097

通過netstat -nat也能查看當(dāng)前tcp socket的一些信息,比如Recv-Q, Send-Q。

(base) niuxinli@ubuntu:~$ netstat -nat
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:20880 0.0.0.0:* LISTEN
tcp 0 36 192.168.1.7:22 192.168.1.4:58931 ESTABLISHED
tcp 0 0 192.168.1.7:36666 192.168.1.7:2181 ESTABLISHED
tcp 0 65160 192.168.1.7:20880 192.168.1.5:60760 ESTABLISHED

可以看以下Recv-Q和Send-Q的具體含義:

 Recv-Q
Established: The count of bytes not copied by the user program connected to this socket.

Send-Q
Established: The count of bytes not acknowledged by the remote host.

Recv-Q是已經(jīng)到了接受緩沖區(qū),但是還沒被應(yīng)用代碼讀走的數(shù)據(jù)。Send-Q是已經(jīng)到了發(fā)送緩沖區(qū),但是對方還沒有回復(fù)Ack的數(shù)據(jù)。這兩種數(shù)據(jù)正常一般不會堆積,如果堆積了,可能就有問題了。

第一組實驗:單連接,改變TCP緩沖區(qū)

結(jié)果:

繼續(xù)調(diào)大緩沖區(qū)

我們用netstat或者ss命令可以看到當(dāng)前的socket情況,下面的第二列是Send-Q大小,是寫入緩沖區(qū)還沒有被對端確認(rèn)的數(shù)據(jù),發(fā)送緩沖區(qū)最大時64k左右,說明緩沖區(qū)不夠用。

繼續(xù)增大緩沖區(qū),到4M,我們可以看到,響應(yīng)時間進一步下降,但是還是在傳輸上浪費了不少時間,因為服務(wù)端應(yīng)用層沒有壓力。

服務(wù)端和客戶端的TCP情況如下,緩沖區(qū)都沒有滿

服務(wù)端

客戶端

這個時候,再怎么調(diào)大TCP緩沖區(qū),也是沒用的,因為瓶頸不在這了,而在于連接數(shù)。因為在Dubbo中,一個連接會綁定到一個NioWorker線程上,讀寫都由這一個連接完成,傳輸?shù)乃俣瘸^了單個線程的讀寫能力,所以我們看到在客戶端,大量的數(shù)據(jù)擠壓在接收緩沖區(qū),沒被讀走,這樣對端的傳輸速率也會慢下來。

第二組實驗:多連接,固定緩沖區(qū)

服務(wù)端的純業(yè)務(wù)函數(shù)響應(yīng)時間很穩(wěn)定,在緩沖區(qū)較小的時候,調(diào)大連接數(shù)雖然能讓時間降下來,但是并不能到最優(yōu),所以緩沖區(qū)不能設(shè)置太小,Linux一般默認(rèn)是4M,在4M的時候,4個連接基本上已經(jīng)能把響應(yīng)時間降到最低了。

結(jié)論

要想充分利用網(wǎng)絡(luò)帶寬, 緩沖區(qū)不能太小,如果太小有可能一次傳輸?shù)膱笪木痛笥诹司彌_區(qū),嚴(yán)重影響傳輸效率。但是太大了也沒有用,還需要多個連接數(shù)才能夠充分利用CPU資源,連接數(shù)起碼要超過CPU核數(shù)。


有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)

歡迎大家關(guān)注Java之道公眾號


好文章,我在看??

瀏覽 81
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

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

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 探花在线综合| 内射少妇18| 日韩在线精品视频| 无码在线观看免费视频| 青青草伊人大香蕉| 超碰1999| 成人在线三级| 黑人中文字幕| 成人AV电影在线观看| 国产一级大片| 2014天堂网| 成人精品无码免费视频| 欧美一级特黄AAAAAA片| 亚洲色婷婷五月天| 中文字幕无码观看| 亚洲熟妇在线观看一区二区| 日韩无码一区二区三| 99久久综合九九| 日韩无码人妻久久一区二区三区| 少妇一区二区三区| 黄色三级在线观看| 色哟哟一区二区三区| 欧美又粗又大| 北条麻妃毛片| 2019国产精品| 国产剧情一区二区三区| 波多野结衣天堂| 国产亚洲婷婷| 狼人综合影院| 亚洲精品字幕久久久久| 色色免费黄色视频| 日韩一级视频| 俺也来俺也去| 亚洲精品视频在线| 97资源在线| 亚洲性爱自拍| 超碰97人人操| 天天爽视频| 亚洲人在线| 国产无码中文字幕| 美女天堂网| 九九99热| 国产毛片毛片毛片毛片毛片| 尹人在线视频| 又黄又爽的视频| 亚洲免费看黄| 亚洲人免费视频| 亚洲精品高清视频| 蜜桃久久精品成人无码AV| 婷婷五月天成人社区| 亚洲视频欧洲视频| 成年人性生活免费视频| 精品看片| 亚洲国产另类精品| 中文字幕午夜福利| 字幕一区二区久久人妻网站| 黑人粗暴偷拍一区二区| 欧美经典自拍狼友| 乳揉みま痴汉电车羽月希免费观看| 色九九| 成人A片视频| 高清一区二区三区| 涩婷婷| 欧美日韩成人电影| 人妻少妇精品视频| 日韩在线视频观看| 亚洲一级无码| 综合久久99| 亚洲激情在线| 蜜臀AV在线| 日韩毛片在线| 亚洲视频在线播放| 日韩精品欧美一区二区三区| 中文字幕在线观看1| 在线观看av网站中文字幕| 国产精品三级| 女人自慰在线观看| 久久这里有精品视频| 91丨豆花丨成人熟女| AAA片网站| 国产精品秘精东影业| 亚洲无码操逼视频| 99导航| 大香蕉啪啪啪啪| 国产乱子伦一区二区三区视频| 三级99| 久草香蕉| 一区二区三区福利| 99国产一区| 午夜视频网站| 免费无码网站| 久久6精品| 国产裸体网站| 久久精品成人导航| 中文字幕日本在线| 欧美午夜三级| 三级a片| A级网站| 亚洲免费在线观看视频| 国产精品久久久久久久久| 日韩不卡| 欧美3P视频| 国产乱在线| 国产福利免费视频| 亚洲区在线播放| 亚洲一在线| 欧美国产中文| 国产精品无码免费| 日韩日韩日韩| 大香蕉AV在线观看| 五月天无码在线| 日韩中文一区| 国产黄色视频免费观看| 黄片AAA| 123操逼| 久久久一区二区三区四区免费听| 色哥网在线一区| 长腿女神打扫偷懒被主人猛操惩罚| 操比免费视频| 久久久久久久久久久久成人| 久视频在线观看| 隸則av| 久久无码一区二区| 一级性爱| 亚洲综合视频在线观看| 东方AV在线观看| 亚洲操| 美女av日逼| 国产欧美日韩成人| 欧美午夜精品久久久久免费视 | 亚洲免费性爱视频| 91水蜜桃| 日韩免费在线观看一区入口| 日本一区二区三区四区在线观看 | 91探花秘在线播放偷拍| 高潮无码视频| 国产电影一区二区三区| 人人色人人| 粉嫩AV蜜乳AV蜜臀AV蜂腰AV | 高清无码一区二区在线| 蜜臀精品色无码蜜臀AV| 亚洲三级毛片| 老妇槡BBBB槡BBBB槡| 午夜欧美| 久色| 青青操国产乱伦| 秋霞网一区二区| 国产精品人人| 蜜臀久久久99久久久久久久| 豆花视频成人版www满18| 成人三级视频在线观看| 91玖玖| 国产av一区二区三区| 婷婷成人五月天| 黄色视频网站观看| 亚洲国产无码在线观看| 亚洲国产三级片| 俺来也俺也去| 欧美色成人免费在线视频| 亚洲人成777| 日韩欧美91| 无码秘蜜桃吴梦梦| 国产AV在| 国产777777| 欧美性猛交一区二区三区| 国产乱子伦-区二区| 操逼视频在线免费看| 亚洲国产剧情| 性爱AV网| 黄片网址大全| 日韩不卡一区| 日韩精品成人在线| 精品国产污污免费网站入口| 天堂综合| 天堂成人| 姐弟乱伦性爱| 国产精品亚洲一区| 人人操人人爱人人拍| 久久婷婷婷| 免费视频爱爱| 国产精品无码ThePorn| 91小仙女jK白丝袜呻吟| 亚洲免费在线观看| 午夜无码久久| 亚洲黄色三级| 久久精品9| 嫩草人人精品免费| 亚洲情在线| 午夜偷拍视频| 老婆中文字幕乱码中文乱码| 成人A片免费| 在线综合国产欧美| 麻豆午夜福利视频| 日韩精品一二| 国产精品久久久久久无人区| 91久久免费视频| 亚洲国产成人综合| 在线无码免费| 亚洲福利天堂| 日韩无码人妻视频| 北条麻妃三区| 波多野结衣无码高清视频| 国产VA| 国产精品9999| 夜夜骑免费视频| 欧美高清一级| 豆花在线视频| 九九热精品视频在线观看| 蜜臀精品| 成人国产精品秘久久久网站| 国精产品九九国精产品| 人人看人人色| 精品人妻一区二区免费蜜桃视频| 在线成人一区二区| 水蜜桃一区二区三区| 成人片免费看| 成人在线免费视频观看| 大香煮伊在75| aaa三级片| 2018最好看的中文字幕高清电影| 俺去操| 欧美精品性爱| 91丨露脸丨熟女精品| 久久五月亭亭| 亚洲高清无码视频在线| 97久久精品国产熟妇高清网| 日韩Av无码一区二区三区不卡| 欧美日韩在线观看一区| 天天爽夜夜操| 国产无码一二三| 大香蕉久久爱| 久久99精品久久久久婷婷 | 午夜精品18视频国产17c| 嫩BBB嫩BBB嫩BBB| 精品中文一区二区三区| 无码AV网| 三级成人网| 亚洲无码中文人妻| 淫香淫色天天影视| 免费看黄片,在线观看| 大香蕉久久| 蜜桃久久精品成人无码AV| 亚洲美女免费视频| 淫色五月| 国产精成人品| 做aAAAAA免费视频| 久色天堂| 97自拍视频| 日本处女性高潮喷水视频| 二区三区不卡| 亚洲福利免费观看| 国产成人亚洲综合A∨婷婷| 国产精品一区二区三区四区| 69激情网| 黑人巨大精品欧美| 暖暖爱视频免费| 蜜桃网一区二区| 国产欧美日韩视频| 日韩三级网| 午夜无码精品一区二区三区99午| 老鸭窝av免费入口在线观看| 日逼网站视频| 黄色av免费| 无码精品一区二区三区在线观看| 国产又大又粗又黄| 国精产品一区二区三区黑人和中国| 国产三级黄色片| 日韩成人黄片| 欧美黄色A片| 久久久久久亚洲AV黄床| 日韩黄色三级| 免费一级A毛片夜夜看| 夜夜嗨老熟女AV一区二区三区| 特级西西444www高清大胆免费看| 9l视频自拍蝌蚪9l成人| 怡春院国产| 看操b视频| 屁屁影院CCYYCOM发布地 | 操逼高清无码| 影音先锋AV成人| 内射| 乱伦性爱视频| 蜜桃在线一区| 特级西西444www大精品| 色妹子综合| 开心激情站| 亚洲三级黄片| 97一区二区三区| 性猛交╳XXX乱大交| 懂色AV一区二区三区国产中文在线| 亚洲高清无码在线| 黄色大片网址| 欧美午夜视频| 一本色道久久88综合无码| 大香蕉婷婷五月天| 久久久久国产| 一本加勒比HEZYO东京热无码 | 9991区二区三区四区| 国产免费av在线| 欧美精品久久| 亚洲av无码精品| 91久久成人| 色婷婷综合网| 日韩v欧美v日本v亚洲v国产v| 国产A片网站| 一区二区三区亚洲| 亚洲操屄| 亚洲AV秘无码苍井空| 欧美激情色色| 97大香蕉在线视频| 人妻无码免费视频| www.色中色| 五月丁香婷婷在线| 久久成人三级| 伊人精品在线| 人妻第一页| 国产秘精品区二区三区日本| 婷婷五月在线观看| 水蜜桃视频网站在线观看| 欧美在线大香蕉| 一区二区精品| 亚洲日韩国产成人精品久久 | 高清无码不卡视频| 午夜无码人妻AV| 成人亚洲性情网站www在线| 极品久久| 日韩插泄| 在线免费观看网站| 操操操操操操| 婷婷丁香色| 九九热在线观看| 亚洲欧洲精品成人久久曰影片| 国产精品一区二区三区在线| 99久久久成人国产精品| 成人精品一区二区三区电影| 丝瓜视频| 无码人妻av一区| 麻豆二区| 69AV视频网站| 亚洲乱码精品久久久久..| 免费看毛片中文字幕| 黄色a级片| 久久一级片| 精品无码视频在线| 中文字幕亚洲有码| 亚洲AV无码乱码国产精品黑人| 熟妇自拍| 欧美一区二区三区四| 国产精品爽爽久久久久| 91精品国产一区| 99久久99久久| 国产精品毛片一区视频播| 亚洲乱码在线观看| 亚洲AⅤ欧美AⅤ| 亚洲综合精品| 欧美日韩午夜福利视频| 亚洲成a| 曰本中文字幕在线视频| 香蕉视频毛片| 精品久久久久久久| 福利无码| 国内操B电影| 欧亚免费视频| 亚洲AV免费在线| 亚洲高清福利视频| 色色五月婷婷| 超碰九九热| 免费黄色毛片| 1000部毛片A片免费视频| 亚洲人BBwBBwBBWBBw| 黑人一区二区三区四区| 91免费网站| 嫩BBB槡BBBB槡BBBB百度| 成人精品在线视频| 成人免费网站在线观看| 久久久黄色| jizz久久| 国产日韩欧美在线| 91大香蕉视频| 2025毛片| 欧美性受XXXX黑人XYX性爽冫| 免费成人在线网站| 成人无码日韩| 国产福利免费视频| 热久久久久| 91天天操| 天天做天天爱| 欧美日韩一区二区三区四区| 黄色视频在线观看18| 无码免费毛片一区二区三区古代| 电影豹妹香港版| 国产69精品久久久久久| 亚洲精品性爱| 一区二区三区四区高清无码| 天堂AV色| 国产日韩欧美一区| 丁香五月婷婷综合网| 日韩午夜成人电影| 99re视频在线播放| 毛片区| 黄色无码在线观看| 日韩女人性爱| 日韩免费成人| 老鸭窝久久| 午夜理论片| 日韩成人无码电影网站| 国产美女高潮| 翔田千里91| 综合色国产精品欧美在线观看| 国产精品视频免费在线观看| 丁香花在线高清完整版视频| 中文字幕在线有码| 大肉大捧视频免费观看| 国产无码网站| 丁香五月情| 四虎影库男人天堂| 亚洲成人网在线观看| 九色丨蝌蚪丨老版熟女| 乱伦A片| 极品av| 波多野结衣成人网站| 欧美淫乱视频| 无码欧精品亚洲日韩一区| 亚洲婷婷在线| 国产一级a毛一级a毛视频在线网站) | 欧美视频免费操逼图。| 亚洲日韩成人电影| 东北骚妇大战黑人视频| 国产精品久久久久久久久久王安宇 | 北条麻妃毛片| 成人毛片在线大全免费| 91小宝寻花一区二区三区三级| 亚洲淫秽视频| 国产精品无毛五区六区| 欧美精产国品一区二区区别| 内射视频免费看| 一级片日韩| 久久久成人免费视频| 亚洲区无码| 白嫩外女BBWBBWBBW| 中文字幕AV网| 在线成人一区二区| www.一区二区| 怡红院一区二区| 久久高清免费视频| 91视频在线免费看| 无码三级在线播放| 男女av| AV一区二区在线观看| 欧美老妇大BBBBXXXX| 欧美成人激情| 久久成人国产| 亚洲无码一区二区三区蜜桃| 插菊花综合网2| 男女无套在线观看免费| 黄色片免费看| 人妻体内射精一区二区三区| 91丨精品丨国产丨丝袜| 91在线亚洲| 波多野结衣无码一区二区| 操碰99| 日韩一级二级| 999一区二区三区| 亚洲xxxxxx| 大香蕉国产视频| 成人毛片100免费观看| 激情综合网五月婷婷| 91成人在线观看国产| а√最新版在线中文8| 国产精品美女久久久| 91成人做爰A片| 日批国产| 久久久久亚洲AV无码专区| 色婷婷天天操天天干| 337p大胆色噜噜噜噜噜| 老太老熟女城中层露脸60| 蜜桃av秘一区二区三区| 夜夜草视频| 亚洲三级片无码| 成人福利免费视频| 久久ww| 喷水在线观看| 在线看v片| 亚洲色在线播放| 人妻无码一区二区三区摄像头| 色福利视频| 国产一级A片视频| 大地二中文在线观看免费鲁大师| 91精品在线免费观看| 韩日综合在线| 日韩欧美一区二区三区| 亚洲精品一二三区| 国产精品天天狠天天看| 自拍偷拍一区二区三区| 亚洲综合色婷婷| 成人小说一区二区三区| 2018天天日天天操| 国产黄色AV| 亚洲精品一二三区| 爱插美女网| va婷婷在线免费观看| 特级西西WWW888| 北条麻妃电影九九九| 黄片免费网站| 小黃片秘嗯嗯啊| 日韩大鸡巴| Av一区二区三区| www.人人操| 国产欧美在线观看| 99视频精品视频| 欧美日韩肏屄视频| 精品视频日韩| 免费的av网站| 狠狠干2021| 成人免费黄色| 操逼资源| 亚洲大胆视频| 亚洲AV成人无码精品| 91久久成人| 无码在线免费视频| 黄色AV免费在线观看| 色五月婷婷中文字幕| 亚洲人成电影| 国产亚洲av| 99热官网| 欧美黄色成人网站| 国产精品九九九| 国产成人TV| 精品国产乱码久久久久久郑州公司 | 一区二区三区水蜜桃| 欧美九九九九| 黄色在线免费看| 日韩人妻视频| 欧美日本中文字幕| 天天干免费视频| 日本成人A| 日韩欧美一级| av无码中文字幕| 日韩免费视频观看| 久久五月亭亭| 一级黄色av| 亚洲无码免费| 色五月综合| 熟女嗷嗷叫高潮合集91| 国产1区2区3区中文字幕| 无码国精品一区二区免费蜜桃| 91成人电影| 欧美在线黄色| 日韩免费一级| 国产乱伦中文字幕| 青青久视频| 国产婷婷内射| 国产中文字幕亚洲综合欧美| 亚洲国产高清无码| 亚洲V国产v欧美v久久久久久| 欧美区亚洲区| 亚洲AV无码乱码A片无码沈樵| 婷婷激情中文字幕| 欧美色网| 精品无码秘人妻一区二区三区| 日韩无码操逼视频| 91艹逼| 无码人妻AV一区| 麻豆国产成人AV一区二区三区| 成人在线免费视频| 高清无码视频在线播放| 亚洲A级| 无码人妻丰满熟妇精品| 国产性爱免费视频| 日日夜夜超碰| 欧美国产成人在线| 综合一区二区| jizz在线免费观看| 无码777| 密臀久久| 黄色片无码| 久久五月天综合| 日韩AV一区二区在线观看| 丹麦电影《下午》| 日韩成人视频在线观看| 无码AV在线观看| 亚洲涩情91日韩一区二区| 97超碰资源总站| 久久综合色色| 午夜福利视频无码| 国产亚洲99久久精品| 初学影院WWWBD英语完整版在线观看 | 亚洲成人二区| 丁香综合网| 亚洲成人视频网| 色色丁香五月天| 亚洲猛男操逼欧美国产视频| 国产欧美在线| 婷婷日韩中文字幕| 日韩无码二区| 97大香蕉视频| 精品aaa| 18精品爽国产冫绿帽社| 天堂网一区二区三区| 亚洲欧美91| 国产精品自拍一区| 无毛无码| 国产欧美一区在线看| 人妻少妇精品| 豆花成人社区,视频| 一级A黄色片| 欧美成人激情视频| 久久久久久久无码| 日本高清视频免费观看| 婷婷五月天性爱| 日本黄色视频大全| 亚洲视频在线观看网站| 97精品人妻一区二区三区香蕉农 | 日本91视频| 天天骑夜夜操| 在线观看污网站| 老婆被黑人杂交呻吟视频| 少妇AV| 成人精品一区日本无码网站suv| 亚洲精品无码更新| 欧美系列在线| 乱人伦欲国语对白| 婷婷色片| 国产A级黄色片| 国产精品久久久久久亚洲毛片| 中文字幕精品在线免费视频观看视频 | 亚洲精品一区二区三区无码电影| 风间由美大荫蒂无码AV| 97伊人大香蕉| 黄色免费网| 中文色片| 亚洲成人黄色在线| 久久黄色成人视频| 国产精品H| 日韩高清精品在线| 黄色大片av| 欧美一级夜夜爽| 在线免费看AV片| 久久肏屄视频| 中国无码专区| 日韩人妻无码一区二区三区七区| 国产香蕉视频| 网址你懂的| 成人黄色大片| 人妻夜夜爽天天爽三区麻豆AV网站| 国产成人在线播放| 婷婷射| 欧美色图网站| 加勒比无码在线| 蜜柚AV| 无码视频免费在线观看| 爱搞搞就搞搞| 高清国产av| 日韩成人无码AV| 日韩A片在线观看| 成人欧美一区二区三区黑人免费 | 色婷婷av在线| 国产精品码一本A片| 在线看片av| 在线欧美日韩| 日本男人天堂| 操屄网站| 人人看人人爱| 亚洲日韩视频在线播放| 91成人在线播放| 中国免费一级无码成人片| 日韩婬乱片A片AAA真人视频 | 福利视频一区二区| 熟女人妻视频| 操逼视频网址| 熟妇在线| 久久久久久性爱| 性爱视频无码| 天美精东蜜桃91| 玖玖国产| 日韩A片无码ⅩXXXX| 亚洲日韩高清无码| 国产免费视频| 中文字幕有码在线观看| 91久久精品无码一区二区三区| 一级黄色A片| 午夜毛片| 午夜视频在线| 精品少妇视频| 男女啪啪啪| www.射| 国产69视频在线观看| 懂色av蜜臀av粉嫩av分| 在线中文字幕亚洲| 免费版成人久久幺| 欧美成人精品网站| 在线看一区| 99国产精品久久久久久久成人| 黄片国产| 久久久成人免费视频| 亚洲综合成人网| 又大又黄又爽| 亚洲第一免费视频| 91成人福利| 三级国产| 欧美成人一区二区三区| 无码射精电影| 啪视频网站国产馆| 国产激倩都市一区二区三区欧美 | 99福利视频| 丝袜美腿亚洲综合| 精品自拍视频| 精品人妻无码| 狠狠的操| AⅤ视频在线观看| 国产激情内射| 少妇性受XXXX黑人XYX性爽| 二区三区视频| 色色五月丁香婷婷| 久久午夜一级A片| 男人的天堂视频网站| 打炮影院| 欧美A片视频| 91香蕉视频在线| aaa免费| 思思热在线视频播放| 爱爱爱爱网| 久久视频免费在线观看| 中文字幕无码网站| 一区二区日本| 欧美成人版| 五月丁香影院| 91青青草| 日产精品久久| 免费v在线观看| 免费在线观看视频a| 国产黄色视频免费在线观看| 日本毛片在线观看| 免费无码国产| 色婷婷综合久久久中文字幕| 人人摸人人搞| yy午夜福利| 亚洲天堂久久久| 色综合成人| 国产AV播放| 丁香五月综合网| 中文字幕AV无码| 国产在线观看免费视频| 初学影院WWWBD英语完整版在线观看| 毛片天堂| 蜜桃精品一区二区| 欧美国产性爱| 超碰97在线免费观看| 亚洲69视频| 国产黄色免费网站| 亚洲色在线视频| 操逼操逼操逼操逼操逼操逼| 国产av天天| 北条麻纪无码视频| 日韩久久免费视频| 国产suv精品一区二区6| 午夜福利干B在线免费小视频| 国产伊人自拍| 偷拍一区二区三区| 亚洲黄色电影网| 视频一区二区三区在线观看| 精精品人妻一区二区三区| 日本一级一片免费视频| 思思热精品在线| 走光无码一区二区三区| av影片在线播放| Av一区二区三区| 爱爱视频免费| 香蕉黄色三级片| 黄色香蕉网站| 亚洲精品秘一区二区三区影| 久久精品苍井空免费一区二| 人妻无码电影推荐| 大香蕉伊人视频| 日韩AV无码免费| 亚洲Av无码午夜国产精品色软件 | 国产黄片自拍| 水蜜桃视频在线播放| 伊人免费在线| 久久WW| 日本一级a片| 天天日天天日天天日| AV中文无码| AV2014天堂网| 亚洲综合视频在线观看| 性色网站| 免费无码一区二区三区四区五区| 天天干欧美| 麻豆精品一区| 岛国精品在线播放| 激情一区| 粉嫩AV在线| 亚洲精品国产成人AV在线| 欧美精品18| 天天干天天添| 蜜臀av一区二区三区| 九九香蕉网| 欧美成人福利| 亚洲无码高清视频在线观看| 蜜挑视频一区二区三区| 日韩精品免费一区二区在线观看| 婷婷午夜精品久久久久久性色| 免费看国产黄色视频| 日韩黄色三级片| 亚洲无码三级片在线观看| 亚洲AV女人18毛片水真多| 亚洲操B视频| av电影在线观看| 北条麻妃电影九九九| 内射一区二区三区| 激情内射网站| 亚洲视频播放| 欧美性爱操逼视频| 怡红院一区二区| 热久在线| 欧美、日韩、中文、制服、人妻| 国产成人片色情AAAA片| 白天操夜夜操| 欧美成人视屏| 国产精品无码在线观看| 91毛片观看| 国产人体视频| 操日韩| 婷婷激情五月| 亚洲AV无码成人精品区www| 国产AV无码高清| 免费成人毛片| 99久久黄色| 91久久午夜无码鲁丝片久久人妻| 精品一区二区ww| 一区二区三区无码视频| 欧美一级成人片| 骚逼综合网| 影音先锋成人av| 蜜桃免费AV| 国产精品九九九九九九| 久久黄视频| 91女人18毛片水多国产| 蜜桃传媒AV| 日韩成人无码免费视频| 日韩欧美在线免费观看| 精品看片| 成人免费A片在线观看直播96| 亚洲最大的成人网站| 最近日韩中文字幕中文翻译歌词| 无码人妻一区二区三区三| 大地资源38页| 亚洲v在线| 日韩中文字幕成人| 影音先锋男人资源网| 一区二区高清视频| 在线观看高清无码中文字幕| 国产黄片一区二区三区| 中文字幕精品无码一区二区| 国产AV高清| 在线国产激情视频| 性饥渴熟妇乱子伦| 四虎网站| 天堂无码高清| 亚洲成人AⅤ| 丁香五香天堂网| 二级黄色毛片| 天天操人人| 九九热精品在线| 69激情网| 日本毛片在线观看| 欧美卡一卡二| 久久蜜桃成人| www男人天堂| 国产美女被操| 天堂视频在线观看亚洲美女 | 日逼一级片| 91视频免费在线看| 日韩一级片在线播放| 桃色AV| 亚洲婷婷视频| 欧美黄片免费在线观看| 影音先锋成人资源AV在线观看| 尻屄视频网站| 欧美日韩一区二区在线观看| 中文字幕在线看| 蝌蚪窝在线视频免费观看| 久久99久久99精品免视看婷婷| 欧美成人18| 中文无码一区二区三区四区| 亚洲中文字幕视频在线观看| 国产激情视频在线免费观看| 中文字幕巨肉乱码中文乱码| 欧美一级片在线| 天天操天天干麻豆| 色婷婷18禁| 久久免费精品视频| 骚BBBB槡BBB槡BBB| 精品久久成人| 黄色大片AV在线| 中文字幕免费在线观看视频| 北条麻妃91| 亚洲九九在线| 大地资源38页| 看毛片网站|