日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高性能网络编程技术

發(fā)布時間:2024/9/30 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高性能网络编程技术 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://blog.csdn.net/heiyeshuwu/article/details/40508683

高性能網(wǎng)絡(luò)編程技術(shù)

作者:jmz (360電商技術(shù)組)


如何使網(wǎng)絡(luò)服務(wù)器能夠處理數(shù)以萬計的客戶端連接,這個問題被稱為C10K?Problem。在很多系統(tǒng)中,網(wǎng)絡(luò)框架的性能直接決定了系統(tǒng)的整體性能,因此研究解決高性能網(wǎng)絡(luò)編程框架問題具有十分重要的意義。


1.?網(wǎng)絡(luò)編程模型

C10K?Problem中,給出了一些常見的解決大量并發(fā)連接的方案和模型,在此根據(jù)自己理解去除了一些不實際的方案,并做了一些整理。


1.1、PPC/TPC模型

典型的Apache模型(Process?Per?Connection,簡稱PPC),TPCThread?Per?Connection)模型,這兩種模型思想類似,就是讓每一個到來的連接都一邊自己做事直到完成。只是PPC是為每個連接開了一個進(jìn)程,而TPC開了一個線程。可是當(dāng)連接多了之后,如此多的進(jìn)程/線程切換需要大量的開銷;這類模型能接受的最大連接數(shù)都不會高,一般在幾百個左右。


1.2、異步網(wǎng)絡(luò)編程模型

異步網(wǎng)絡(luò)編程模型都依賴于I/O多路復(fù)用模式一般地,I/O多路復(fù)用機(jī)制都依賴于一個事件多路分離器(Event?Demultiplexer)。分離器對象可將來自事件源的I/O事件分離出來,并分發(fā)到對應(yīng)的read/write事件處理器(Event?Handler)。開發(fā)人員預(yù)先注冊需要處理的事件及其事件處理器(或回調(diào)函數(shù));事件分離器負(fù)責(zé)將請求事件傳遞給事件處理器。兩個與事件分離器有關(guān)的模式是Reactor和Proactor。Reactor模式采用同步IO,而Proactor采用異步IO。

在Reactor中,事件分離器負(fù)責(zé)等待文件描述符或socket為讀寫操作準(zhǔn)備就緒,然后將就緒事件傳遞給對應(yīng)的處理器,最后由處理器負(fù)責(zé)完成實際的讀寫工作。

而在Proactor模式中,處理器--或者兼任處理器的事件分離器,只負(fù)責(zé)發(fā)起異步讀寫操作。IO操作本身由操作系統(tǒng)來完成。傳遞給操作系統(tǒng)的參數(shù)需要包括用戶定義的數(shù)據(jù)緩沖區(qū)地址和數(shù)據(jù)大小,操作系統(tǒng)才能從中得到寫出操作所需數(shù)據(jù),或?qū)懭霃膕ocket讀到的數(shù)據(jù)。事件分離器捕獲IO操作完成事件,然后將事件傳遞給對應(yīng)處理器。


l?在Reactor中實現(xiàn)讀:

-?注冊讀就緒事件和相應(yīng)的事件處理器

-?事件分離器等待事件

-?事件到來,激活分離器,分離器調(diào)用事件對應(yīng)的處理器

-?事件處理器完成實際的讀操作,處理讀到的數(shù)據(jù),注冊新事件,然后返還控制權(quán)


l?在Proactor中實現(xiàn)讀:

-?處理器發(fā)起異步讀操作(注意:操作系統(tǒng)必須支持異步IO)。在這種情況下,處理器無視IO就緒事件,它關(guān)注的是完成事件。

-?事件分離器等待操作完成事件

-?在分離器等待過程中,操作系統(tǒng)利用并行的內(nèi)核線程執(zhí)行實際的讀操作,并將結(jié)果數(shù)據(jù)存入用戶自定義緩沖區(qū),最后通知事件分離器讀操作完成。

-?事件分離器呼喚處理器。

-?事件處理器處理用戶自定義緩沖區(qū)中的數(shù)據(jù),然后啟動一個新的異步操作,并將控制權(quán)返回事件分離器。


可以看出,兩個模式的相同點,都是對某個IO事件的事件通知(即告訴某個模塊,這個IO操作可以進(jìn)行或已經(jīng)完成)。在結(jié)構(gòu)上,兩者也有相同點:demultiplexor負(fù)責(zé)提交IO操作(異步)、查詢設(shè)備是否可操作(同步),然后當(dāng)條件滿足時,就回調(diào)handler;不同點在于,異步情況下(Proactor),當(dāng)回調(diào)handler時,表示IO操作已經(jīng)完成;同步情況下(Reactor),回調(diào)handler時,表示IO設(shè)備可以進(jìn)行某個操作(can?read?or?can?write)。


1.2.1?Reactor模式框架

使用Proactor模式需要操作系統(tǒng)支持異步接口,因此在日常中比較常見的是Reactor模式的系統(tǒng)調(diào)用接口。使用Reactor模型,必備的幾個組件:事件源、Reactor框架、多路復(fù)用機(jī)制和事件處理程序,先來看看Reactor模型的整體框架,接下來再對每個組件做逐一說明。


?


l?事件源

Linux上是文件描述符,Windows上就是Socket或者Handle了,這里統(tǒng)一稱為“句柄集”;程序在指定的句柄上注冊關(guān)心的事件,比如I/O事件。


l?event?demultiplexer——事件多路分發(fā)機(jī)制

??由操作系統(tǒng)提供的I/O多路復(fù)用機(jī)制,比如select和epoll。

??程序首先將其關(guān)心的句柄(事件源)及其事件注冊到event?demultiplexer上;

??當(dāng)有事件到達(dá)時,event?demultiplexer會發(fā)出通知“在已經(jīng)注冊的句柄集中,一個或多個句柄的事件已經(jīng)就緒”;

??程序收到通知后,就可以在非阻塞的情況下對事件進(jìn)行處理了。


l?Reactor——反應(yīng)器

Reactor,是事件管理的接口,內(nèi)部使用event?demultiplexer注冊、注銷事件;并運行事件循環(huán),當(dāng)有事件進(jìn)入“就緒”狀態(tài)時,調(diào)用注冊事件的回調(diào)函數(shù)處理事件。

一個典型的Reactor聲明方式


class?Reactor?{??

public:??

????int?register_handler(Event_Handler?*pHandler,?int?event);??

????int?remove_handler(Event_Handler?*pHandler,?int?event);??

????void?handle_events(timeval?*ptv);??

????//?...??

};??


l?Event?Handler——事件處理程序

事件處理程序提供了一組接口,每個接口對應(yīng)了一種類型的事件,供Reactor在相應(yīng)的事件發(fā)生時調(diào)用,執(zhí)行相應(yīng)的事件處理。通常它會綁定一個有效的句柄。

下面是兩種典型的Event?Handler類聲明方式,二者互有優(yōu)缺點。


class?Event_Handler?{??

public:??

????virtual?void?handle_read()?=?0;??

????virtual?void?handle_write()?=?0;??

????virtual?void?handle_timeout()?=?0;??

????virtual?void?handle_close()?=?0;??

????virtual?HANDLE?get_handle()?=?0;??

????//?...??

};??

class?Event_Handler?{??

public:??

????//?events?maybe?read/write/timeout/close?.etc??

????virtual?void?handle_events(int?events)?=?0;??

????virtual?HANDLE?get_handle()?=?0;??

????//?...

};??


1.2.2?Reactor事件處理流程


前面說過Reactor將事件流“逆置”了,使用Reactor模式后,事件控制流可以參見下面的序列圖

?


1.3?Select,pollepoll

在Linux環(huán)境中,比較常見的I/O多路復(fù)用機(jī)制就是Select,poll和epoll,下面對這三種機(jī)制進(jìn)行分析和比較,并對epoll的使用進(jìn)行介紹。


1.3.1?select模型

1.?最大并發(fā)數(shù)限制,因為一個進(jìn)程所打開的FD(文件描述符)是有限制的,由FD_SETSIZE設(shè)置,默認(rèn)值是1024/2048,因此Select模型的最大并發(fā)數(shù)就被相應(yīng)限制了。

2.?效率問題,select每次調(diào)用都會線性掃描全部的FD集合,這樣效率就會呈現(xiàn)線性下降,把FD_SETSIZE改大的后果就是所有FD處理都慢慢來

3.?內(nèi)核/用戶空間?內(nèi)存拷貝問題,如何讓內(nèi)核把FD消息通知給用戶空間呢?在這個問題上select采取了內(nèi)存拷貝方法。


int?res?=?select(maxfd+1,?&readfds,?NULL,?NULL,?120);

if?(res?>?0)?{

????for?(int?i?=?0;?i?<?MAX_CONNECTION;?i++)?{

????????if?(FD_ISSET(allConnection[i],&readfds))?{

????????????handleEvent(allConnection[i]);

????????}

????}

}


1.3.2?poll模型

基本上效率和select是相同的,select缺點的23都沒有改掉。


1.3.3?epoll模型

1.?Epoll沒有最大并發(fā)連接的限制,上限是最大可以打開文件的數(shù)目,這個數(shù)字一般遠(yuǎn)大于2048,?一般來說這個數(shù)目和系統(tǒng)內(nèi)存關(guān)系很大,具體數(shù)目可以cat?/proc/sys/fs/file-max察看。

2.?效率提升,Epoll最大的優(yōu)點就在于它只管你“活躍”的連接,而跟連接總數(shù)無關(guān),應(yīng)用程序就能直接定位到事件,而不必遍歷整個FD集合,因此在實際的網(wǎng)絡(luò)環(huán)境中,Epoll的效率就會遠(yuǎn)遠(yuǎn)高于selectpoll


int?res?=?epoll_wait(epfd,?events,?20,?120);

for(int?i?=?0;?i?<?res;?i++)?{

????handleEvent(events[n]);

}


3.?內(nèi)存拷貝,Epoll在這點上使用了“共享內(nèi)存”,這個內(nèi)存拷貝也省略了。?


1.3.4?使用epoll

Epoll的接口很簡單,只有三個函數(shù),十分易用。?

int?epoll_create(int?size);

生成一個epoll專用的文件描述符,其實是申請一個內(nèi)核空間,用來存放你想關(guān)注的socket?fd上是否發(fā)生以及發(fā)生了什么事件。size就是你在這個Epoll?fd上能關(guān)注的最大socket?fd數(shù),大小自定,只要內(nèi)存足夠。

int?epoll_ctl(int?epfd,?int?op,?int?fd,?struct?epoll_event?*event);

控制某個Epoll文件描述符上的事件:注冊、修改、刪除。其中參數(shù)epfdepoll_create()創(chuàng)建Epoll專用的文件描述符。相對于select模型中的FD_SETFD_CLR宏。

int?epoll_wait(int?epfd,?struct?epoll_event?*?events,?int?maxevents,?int?timeout);

等待I/O事件的發(fā)生;參數(shù)說明:

??epfd:epoll_create()生成的Epoll專用的文件描述符;

??epoll_event:用于回傳代處理事件的數(shù)組;

??maxevents:每次能處理的事件數(shù);

??timeout:等待I/O事件發(fā)生的超時值;

??返回發(fā)生事件數(shù)。

上面講到了Reactor的基本概念、框架和處理流程,基于Reactor模型的select,poll和epoll進(jìn)行了比較分析后,再來對比看網(wǎng)絡(luò)編程框架就會更容易理解了


?

2.?Libeasy網(wǎng)絡(luò)編程框架

Libeasy底層使用的是Libev事件庫,在分析Libeasy代碼前,首先對Libev有相關(guān)了解。


2.1?Libev簡介

l?Libev是什么?

Libev?is?an?event?loop:?you?register?interest?in?certain?events?(such?as?a?file?descriptor?being?readable?or?a?timeout?occurring),?and?it?will?manage?these?event?sources?and?provide?your?program?with?events.

Libev是一個event?loop:向libev注冊感興趣的events,比如Socket可讀事件,libev會對所注冊的事件的源進(jìn)行管理,并在事件發(fā)生時觸發(fā)相應(yīng)的程序。通過event?watcher來注冊事件


l?libev定義的watcher類型

??ev_io??//?io?讀寫類型watcher

??ev_timer??//?定時器?類watcher

??ev_periodic

??ev_signal

??ev_child

??ev_stat

??ev_idle

??ev_prepare

??ev_check

??ev_embed

??ev_fork

??ev_cleanup

??ev_async??//?線程同步信號watcher

在libev中watcher還能支持優(yōu)先級?


2.1.1?libev使用

下面以一個簡單例子程序說明libev的使用。這段程序?qū)崿F(xiàn)從標(biāo)準(zhǔn)輸入異步讀取數(shù)據(jù),5.5秒內(nèi)沒有數(shù)據(jù)到來則超時的功能。


#include?<ev.h>

#include?<stdio.h>?

ev_io?stdin_watcher;

ev_timer?timeout_watcher;

//?all?watcher?callbacks?have?a?similar?signature

//?this?callback?is?called?when?data?is?readable?on?stdin

static?void?stdin_cb?(EV_P_?ev_io?*w,?int?revents)?{

??puts?("stdin?ready");

??//?for?one-shot?events,?one?must?manually?stop?the?watcher

??//?with?its?corresponding?stop?function.

??ev_io_stop?(EV_A_?w);

??//?this?causes?all?nested?ev_run's?to?stop?iterating

??ev_break?(EV_A_?EVBREAK_ALL);

}

//?another?callback,?this?time?for?a?time-out

static?void?timeout_cb?(EV_P_?ev_timer?*w,?int?revents)?{

??puts?("timeout");

??//?this?causes?the?innermost?ev_run?to?stop?iterating

??ev_break?(EV_A_?EVBREAK_ONE);

}

int?main?(void)?{

???//?use?the?default?event?loop?unless?you?have?special?needs

???struct?ev_loop?*loop?=?EV_DEFAULT;

???//?initialise?an?io?watcher,?then?start?it

???//?this?one?will?watch?for?stdin?to?become?readable

???ev_io_init?(&stdin_watcher,?stdin_cb,?/*STDIN_FILENO*/?0,?EV_READ);

???ev_io_start?(loop,?&stdin_watcher);

???//?initialise?a?timer?watcher,?then?start?it

???//?simple?non-repeating?5.5?second?timeout

???ev_timer_init?(&timeout_watcher,?timeout_cb,?5.5,?0.);

???ev_timer_start?(loop,?&timeout_watcher);

???//?now?wait?for?events?to?arrive

???ev_run?(loop,?0);

???//?break?was?called,?so?exit

???return?0;

}


2.1.2??Libev和Libevent比較


libevent和libev架構(gòu)近似相同,對于非定時器類型,libevent使用雙向鏈表管理,而libev則是使用數(shù)組來管理。如我們所知,新的fd總是系統(tǒng)可用的最小fd,所以這個長度可以進(jìn)行大小限制的,我們用一個連續(xù)的數(shù)組來存儲fd/watch?信息。如下圖,我們用anfd[fd]就可以找到對應(yīng)的fd/watcher?信息,當(dāng)然可能遇到anfd超出我們的buffer長度情形,這是我們用類似relloc?的函數(shù)來做數(shù)組遷移、擴(kuò)大容量,但這種概率是很小的,所以其對系統(tǒng)性能的影響可以忽略不計。


?


我們用anfd[fd]找到的結(jié)構(gòu)體中,有一個指向io_watch_list的頭指針,以epoll為例,當(dāng)epoll_wait返回一個fd_event時?,我們就可以直接定位到對應(yīng)fd的watch_list,這個watch_list的長度一般不會超過3?,fd_event會有一個導(dǎo)致觸發(fā)的事件,我們用這個事件依次和各個watch注冊的event做?“&”?操作,?如果不為0,則把對應(yīng)的watch加入到待處理隊列pendings中(當(dāng)我們啟用watcher優(yōu)先級模式時,pendings是個2維數(shù)組,此時僅考慮普通模式)所以我們可以看到,這個操作是非常非常快。


?


再看添加watch的場景,把watch插入到相應(yīng)的鏈表中,這個操作也是直接定位,然后在fdchange隊列中,加入對應(yīng)的fd(如果這個fd已經(jīng)被添加過,則不會發(fā)生這一步,我們通過anfd[fd]中一個bool?值來判斷)


注意,假如我們在某個fd上已經(jīng)有個watch?注冊了read事件,這時我們又再添加一個watch,還是read?事件,但是不同的回調(diào)函數(shù),在此種情況下,我們不應(yīng)該調(diào)用epoll_ctrl?之類的系統(tǒng)調(diào)用,因為我們的events集合是沒有改變的,所以為了達(dá)到這個目的,anfd[fd]結(jié)構(gòu)體中,還有一個events事件,它是原先的所有watcher的事件的“|操作,向系統(tǒng)的epoll從新添加描述符的操作是在下次事件迭代開始前進(jìn)行的,當(dāng)我們依次掃描fdchangs,找到對應(yīng)的anfd結(jié)構(gòu),如果發(fā)現(xiàn)先前的events與當(dāng)前所有的watcher的“|操作結(jié)果不等,則表示我們需要調(diào)用epoll_ctrl之類的函數(shù)來進(jìn)行更改,反之不做操作,作為一條原則,在調(diào)用系統(tǒng)調(diào)用前,我們已經(jīng)做了充分的檢查,確保不進(jìn)行多余的系統(tǒng)調(diào)用。


再來看刪除和更新一個watcher造作,基于以上分析,這個操作也是近乎O(1)?的,當(dāng)然,如果events事件更改,可能會發(fā)生一次系統(tǒng)調(diào)用。


所以我們對io?watcher的操作,在我們的用戶層面上,幾乎總是是O(1)的復(fù)雜度,當(dāng)然如果牽涉到epoll?文件結(jié)構(gòu)的更新,我們的系統(tǒng)調(diào)用?epoll_ctrl?在內(nèi)核中還是?O(lgn)的復(fù)雜度,但我們已經(jīng)在我們所能掌控的范圍內(nèi)做到最好了。



2.1.3??性能測試對比


?


結(jié)論:The?cost?for?setting?up?or?changing?event?watchers?is?clearly?much?higher?for?libevent?than?for?libev,詳細(xì)性能對比測試參考這http://libev.schmorp.de/bench.html



2.2?libeasy

2.2.2?Server端使用

?

1、啟動流程

eio_?=?easy_eio_create(eio_,?io_thread_count_);

easy_eio_create(eio_,?io_thread_count_)做了如下幾件事:


1.?分配一個easy_pool_t的內(nèi)存區(qū),存放easy_io_t對象?

2.?設(shè)置一些tcp參數(shù),比如tcp_nodelay(tcp_cork),cpu親核性等參數(shù)

3.?分配線程池的內(nèi)存區(qū)并初始化

4.?對每個線程構(gòu)建client_listclient_array,?初始化雙向鏈表conn_list?session_list?request_list

5.?設(shè)置listen?watcher的ev回調(diào)函數(shù)為easy_connection_on_listen

6.?調(diào)用easy_baseth_init初始化io線程


easy_listen_t*?listen?=?easy_connection_add_listen(eio_,?NULL,?port_,?&handler_);

1.?從eio->pool中為easy_listen_t和listen?watcher(在這里listen的watcher數(shù)默認(rèn)為2個)分配空間

2.?開始監(jiān)聽某個地址

3.?初始化每個read_watcher

4.?關(guān)注listen?fd的讀事件,設(shè)置其回調(diào)函數(shù)easy_connection_on_accep在這里僅僅是初始化read_watcher,?還沒有激活,激活在每個IO線程啟動調(diào)用easy_io_on_thread_start的時候做。一旦激活后,當(dāng)有連接到來的時候,觸發(fā)easy_connection_on_accept


rc?=?easy_eio_start(eio_);

1.?調(diào)用pthread_create啟動每個io線程,線程執(zhí)行函數(shù)easy_io_on_thread_start,在easy_io_on_thread_start

a)?設(shè)置io線程的cpu親核性sched_setaffinity

b)?如果不是listen_all或者只有一個線程,則發(fā)出ev_async_send喚醒一個線程的listen_watcher(實現(xiàn)連接請求的負(fù)載均衡)

2.?線程執(zhí)行ev_run


easy_eio_wait(eio_);

調(diào)用pthead_join等待線程結(jié)束



2、處理流程

l?當(dāng)連接到來時觸發(fā)easy_connection_on_accept

1.?調(diào)用accept獲得連接fd,構(gòu)建connection(easy_connection_new),設(shè)置非阻塞,初始化connection參數(shù)和read、write、timeout的watcher

2.?切換listen線程,從自己切換到下一個io線程,調(diào)用ev_async_send激活下一個io線程的listen_watcher,實現(xiàn)負(fù)載均衡

3.?將connection加入到線程的connected_list線程列表中,并開啟該連接上的read、write、timeout的watcher

?

l?當(dāng)數(shù)據(jù)包到來時觸發(fā)easy_connection_on_readable回調(diào)函數(shù)


1.?檢查當(dāng)前IO線程同時正在處理的請求是否超過EASY_IOTH_DOING_REQ_CNT(8192),當(dāng)前連接上的請求數(shù)是否超過EASY_CONN_DOING_REQ_CNT(1024),如果超過,則調(diào)用easy_connection_destroy(c)將連接銷毀掉,?提供了一種負(fù)載保護(hù)機(jī)制


2.?構(gòu)建message空間


3.?調(diào)用read讀取socket數(shù)據(jù)


4.?作為服務(wù)端調(diào)用easy_connection_do_request

? ? a)?從message中解包

? ? b)?調(diào)用easy_connection_recycle_message看是否需要釋放老的message,構(gòu)建新的message空間

? ? c)?調(diào)用hanler的process處理數(shù)據(jù)包,如果返回easy_ok則調(diào)用easy_connection_request_done

? ? d)?對發(fā)送數(shù)據(jù)進(jìn)行打包

? ? e)?對返回碼是EASY_AGAIN的request將其放入session_list中

? ? f)?對返回碼是EASY_OK的request將其放入request_done_list中,更新統(tǒng)計計數(shù)

? ? g)?統(tǒng)計計數(shù)更新??

? ? h)?調(diào)用easy_connection_write_socket發(fā)送數(shù)據(jù)包

? ? i)?調(diào)用easy_connection_evio_start中ev_io_start(c->loop,?&c->read_watcher);開啟該連接的讀watcher

? ? j)?調(diào)用easy_connection_redispatch_thread進(jìn)行負(fù)載均衡


如果負(fù)載均衡被禁或者該連接的message_list和output不為空,則直接返回,否則調(diào)用easy_thread_pool_rr從線程池中選擇一個io線程,將該連接從原來io線程上移除(停止讀寫timeout?的watcher),將該連接加入到新的io線程中的conn_list中,調(diào)用ev_async_send喚醒新的io線程,在easy_connection_on_wakeup中調(diào)用easy_connection_evio_start將該連接的read、write、timeou的watcher再打開。

?

l?當(dāng)socket可寫時觸發(fā)easy_connection_on_writable回調(diào)函數(shù):

1.?調(diào)用easy_connection_write_socket寫數(shù)據(jù)

2.?如果沒有數(shù)據(jù)可寫,將該連接的write_watcher停掉

?

2.2.3?客戶端使用

libeasy作為客戶端時,將每個發(fā)往libeasy服務(wù)器端的請求包封裝成一個session(easy_session_t),客戶端將這個session放入連接的隊列中然后返回,隨后收到包后,將相應(yīng)的session從連接的發(fā)送隊列中刪除。詳細(xì)流程如下:


easy_session_t?*easy_session_create(int64_t?asize)

這個函數(shù)主要就做了一件事分配一個內(nèi)存池easy_pool_t,在內(nèi)存池頭部放置一個easy_session_t,剩下部分存放實際的數(shù)據(jù)包Packet,然后將session的type設(shè)置為EASY_TYPE_SESSION。


異步請求

int?easy_client_dispatch(easy_io_t?*eio,?easy_addr_t?addr,?easy_session_t?*s)

1.?根據(jù)socket?addr從線程池中選擇一個線程,將session加入該線程的session_list,然后將該線程喚醒

2.?線程喚醒后調(diào)用easy_connection_send_session_list

? ? ?a)??其中首先調(diào)用easy_connection_do_client,這里首先在該線程的client_list中查找該addr的client,如果沒找到,則新建一個client,初始化將其加入client_list,如果該client的connect未建立,調(diào)用easy_connection_do_connect建立該連接,然后返回該連接

? ? b)?easy_connection_do_connect中首先創(chuàng)建一個新的connection結(jié)構(gòu),和一個socket,設(shè)置非阻塞,并調(diào)用connect進(jìn)行連接,初始化該連接的read、write、timeout?watcher(連接建立前是write,建立后是read)

? ? c)?調(diào)用easy_connection_session_build,其中調(diào)用encode函數(shù)對數(shù)據(jù)包進(jìn)行打包,調(diào)用easy_hash_dlist_add(c->send_queue,?s->packet_id,?&s->send_queue_hash,?&s->send_queue_list)將這個session添加到連接的發(fā)送隊列中。這個函數(shù)將session添加到發(fā)送隊列的同時,同時將相應(yīng)的項添加到hash表的相應(yīng)的bucket的鏈表頭

? ? d)?開啟timeout?watcher?????

? ? e)?調(diào)用easy_connection_write_socket發(fā)送數(shù)據(jù)包?

?

l?當(dāng)回復(fù)數(shù)據(jù)包到達(dá)觸發(fā)easy_connection_on_readable回調(diào)函數(shù)

1.?初始化一個easy_message_t存放數(shù)據(jù)包

2.?從內(nèi)核緩沖區(qū)讀入數(shù)據(jù)到應(yīng)用層輸入緩沖區(qū)中然后調(diào)用easy_connection_do_response進(jìn)行處理

? ? a)?先解包,將該packet_id數(shù)據(jù)包從發(fā)包隊列中刪除,更新統(tǒng)計信息,停止timeout?watcher,

? ? b)?如果是同步請求,則調(diào)用session的process函數(shù),從而調(diào)用easy_client_wait_process函數(shù),喚醒客戶端接收數(shù)據(jù)包


l?當(dāng)超時時間到還沒有收到回復(fù)數(shù)據(jù)包時觸發(fā)easy_connection_on_timeout_mesg回調(diào)函數(shù)

1.?從發(fā)送隊列中刪除請求數(shù)據(jù)包

2.?調(diào)用session的process函數(shù)從而調(diào)用easy_client_wait_process函數(shù),喚醒客戶端接

3.?釋放此連接


同步請求

void?*easy_client_send(easy_io_t?*eio,?easy_addr_t?addr,?easy_session_t?*s)

同步請求是通過異步請求實現(xiàn)的easy_client_send方法封裝了異步請求接口easy_client_dispatch

1.?easy_client_send將session的process置為easy_client_wait_process方法

2.?初始化一個easy_client_wait_t?wobj

3.?調(diào)用easy_client_dispatch方法發(fā)送異步請求

4.?客戶端調(diào)用wait在wobj包裝的信號量上等待

5.?當(dāng)這個請求收到包的時候觸發(fā)session的process函數(shù)回調(diào)easy_client_wait_process方法,其中會給wobj發(fā)送信號喚醒客戶端,返回session封裝的請求的ipacket

?


2.2.4??特性總結(jié)

1.?多個IO線程/epoll,大大提升了數(shù)據(jù)包處理性能,特別是處理小數(shù)據(jù)包的性能

針對多核處理器,libeasy使用多個IO線程來充分發(fā)揮處理器性能,提升IO處理能力。特別是針對小數(shù)據(jù)包IO處理請求數(shù)較多的情況下,性能提升十分明顯。

2.?短任務(wù)和長任務(wù)區(qū)分,處理短任務(wù)更加高效(編碼了內(nèi)存拷貝,線程切換)

同步處理

對于短任務(wù)而言,調(diào)用用戶process回調(diào)函數(shù)返回EASY_OK的數(shù)據(jù)包直接被加入該連接的發(fā)送隊列,發(fā)送給客戶端,這樣避免了數(shù)據(jù)包的內(nèi)存拷貝和線程切換開銷。


異步處理


對于耗時較長的長任務(wù)而言,如果放在網(wǎng)絡(luò)庫的IO線程內(nèi)執(zhí)行,可能會阻塞住IO線程,所以需要異步處理。


?

3.?應(yīng)用線程CPU親核性,避免線程調(diào)度開銷,提升處理性能

開啟親核特性將線程與指定CPU核進(jìn)行綁定,避免了線程遷移導(dǎo)致的CPU?cache失效,同時它允許我們精確控制線程和cpu核的關(guān)系,從而根據(jù)需要劃分CPU核的使用。


sched_setaffinity(pid_t?pid,?unsigned?int?cpusetsize,?cpu_set_t?*mask)??


該函數(shù)設(shè)置進(jìn)程為pid的這個進(jìn)程,讓它運行在mask所設(shè)定的CPU上.如果pid的值為0,則表示指定的是當(dāng)前進(jìn)程,使當(dāng)前進(jìn)程運行在mask所設(shè)定的那些CPU上.第二個參數(shù)cpusetsize是mask所指定的數(shù)的長度.通常設(shè)定為sizeof(cpu_set_t).如果當(dāng)前pid所指定的進(jìn)程此時沒有運行在mask所指定的任意一個CPU上,則該指定的進(jìn)程會從其它CPU上遷移到mask的指定的一個CPU上運行.?



4.?內(nèi)存管理,減少小內(nèi)存申請開銷,避免內(nèi)存碎片化

Libeasy的內(nèi)存管理和nginx一致,有興趣的可以去學(xué)習(xí)下,下面大致介紹其思想。

1)?創(chuàng)建一個內(nèi)存池

2)?分配小塊內(nèi)存(size?<=?max)

小塊內(nèi)存分配模型:

?


上圖這個內(nèi)存池模型是由上3個小內(nèi)存池構(gòu)成的,由于第一個內(nèi)存池上剩余的內(nèi)存不夠分配了,于是就創(chuàng)建了第二個新的內(nèi)存池,第三個內(nèi)存池是由于前面兩個內(nèi)存池的剩余部分都不夠分配,所以創(chuàng)建了第三個內(nèi)存池來滿足用戶的需求。由圖可見:所有的小內(nèi)存池是由一個單向鏈表維護(hù)在一起的。這里還有兩個字段需要關(guān)注,failed和current字段。failed表示的是當(dāng)前這個內(nèi)存池的剩余可用內(nèi)存不能滿足用戶分配請求的次數(shù),如果下一個內(nèi)存池也不能滿足,那么它的failed也會加1,直到滿足請求為止(如果沒有現(xiàn)成的內(nèi)存池來滿足,會再創(chuàng)建一個新的內(nèi)存池)。current字段會隨著failed的增加而發(fā)生改變,如果current指向的內(nèi)存池的failed達(dá)到了一個閾值,current就指向下一個內(nèi)存池了。


3)、大塊內(nèi)存的分配(size?>?max)

大塊內(nèi)存的分配請求不會直接在內(nèi)存池上分配內(nèi)存來滿足,而是直接向操作系統(tǒng)申請這么一塊內(nèi)存(就像直接使用malloc分配內(nèi)存一樣),然后將這塊內(nèi)存掛到內(nèi)存池頭部的large字段下。內(nèi)存池的作用在于解決小塊內(nèi)存池的頻繁申請問題,對于這種大塊內(nèi)存,是可以忍受直接申請的。同樣,用圖形展示大塊內(nèi)存申請模型:


?


4)、內(nèi)存釋放

nginx利用了web?server應(yīng)用的特殊場景來完成;一個web?server總是不停的接受connection和request,所以nginx就將內(nèi)存池分了不同的等級,有進(jìn)程級的內(nèi)存池、connection級的內(nèi)存池、request級的內(nèi)存池。也就是說,創(chuàng)建好一個worker進(jìn)程的時候,同時為這個worker進(jìn)程創(chuàng)建一個內(nèi)存池,待有新的連接到來后,就在worker進(jìn)程的內(nèi)存池上為該連接創(chuàng)建起一個內(nèi)存池;連接上到來一個request后,又在連接的內(nèi)存池上為request創(chuàng)建起一個內(nèi)存池。這樣,在request被處理完后,就會釋放request的整個內(nèi)存池,連接斷開后,就會釋放連接的內(nèi)存池。


5)、總結(jié)

通過內(nèi)存的分配和釋放可以看出,nginx只是將小塊內(nèi)存的申請聚集到一起申請(內(nèi)存池),然后一起釋放,避免了頻繁申請小內(nèi)存,降低內(nèi)存碎片的產(chǎn)生等問題。


5.?網(wǎng)絡(luò)流量自動負(fù)載均衡,充分發(fā)揮多核性能

1、在連接到來時,正在listen的IO線程接受連接,將其加入本線程的連接隊列中,之后主動喚醒下一個線程執(zhí)行l(wèi)isten。通過切換listen線程來使每個線程上處理的連接數(shù)大致相同。

2、每一個連接上的流量是不同的,因此在每次有讀寫請求,計算該線程上近一段時間內(nèi)請求速率,觸發(fā)負(fù)載均衡,將該連接移動到其它線程上,使每個線程處理的IO請求數(shù)大致相同。


6.?encodedecode接口暴露給應(yīng)用層,實現(xiàn)網(wǎng)絡(luò)編程框架與協(xié)議的分離

Libeasy將網(wǎng)絡(luò)數(shù)據(jù)包打包解包接口暴露給應(yīng)用層,由用戶定義數(shù)據(jù)包內(nèi)容的格式,實現(xiàn)了網(wǎng)絡(luò)編程框架與協(xié)議的分離,能夠支持http等其他協(xié)議類型,格式更改更加方便。


7.?底層采用libev,對于事件的注冊和更改速度更快

?



參考資料

1、?C10K?Problem

2、?Unix環(huán)境高級編程

3、?Unix網(wǎng)絡(luò)編程

4、?Nginx、Libevent

5、?Libevhttp://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#WHAT_TO_READ_WHEN_IN_A_HURRY

6、?Libeasy源碼分析等http://www.cnblogs.com/foxmailed/archive/2013/02/17/2908180.html




-------------------------------------------------------------------------------------

黑夜路人,一個關(guān)注開源技術(shù)、樂于學(xué)習(xí)、喜歡分享的程序員


博客:http://blog.csdn.net/heiyeshuwu

微博:http://weibo.com/heiyeluren

微信:heiyeluren2012 ?


與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的高性能网络编程技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

91精品国产乱码 | 99亚洲国产| 国产探花| www.神马久久| 精品资源在线 | 亚洲色影爱久久精品 | 黄色影院在线观看 | 五月综合色婷婷 | 国产高清免费在线观看 | 精品国产免费一区二区三区五区 | 91免费看黄 | 精品国产一区二区三区四 | 久久综合欧美 | 在线观看资源 | www.超碰| 天天干天天干天天干天天干天天干天天干 | 97在线免费视频观看 | 欧美日韩免费一区二区三区 | 国产日韩一区在线 | 草久在线观看视频 | 国产精品不卡视频 | 中文字幕国产一区二区 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产精品视频永久免费播放 | 在线国产日韩 | 欧美精品久久久久久 | 精品国产1区2区3区 国产欧美精品在线观看 | 国产色婷婷精品综合在线手机播放 | 久久视频在线视频 | 午夜丰满寂寞少妇精品 | 91av视频| 午夜国产一区二区 | 三级动图 | 国产中文字幕视频 | 国产又粗又硬又长又爽的视频 | 亚洲欧美日韩精品久久久 | 国产伦理久久精品久久久久_ | 精品中文字幕视频 | 日韩 在线观看 | 日韩h在线观看 | 免费99精品国产自在在线 | 欧美在线a视频 | 亚洲视频大全 | 99热精品国产一区二区在线观看 | 国产成本人视频在线观看 | 亚洲毛片一区二区三区 | 在线观看日韩视频 | 久久精美视频 | www.91国产| 最近中文字幕免费av | 国产伦理一区二区 | 又黄又刺激视频 | 久久精品久久久久久久 | 久久久久国产精品免费免费搜索 | 欧美精品久 | 99视频精品视频高清免费 | 日韩在线视频播放 | 精品色999 | 久久韩国免费视频 | 成人av亚洲 | 欧美巨乳网 | 在线 影视 一区 | 国产99黄| 91插插视频 | 国内小视频在线观看 | 深爱激情五月婷婷 | 91精品视频一区二区三区 | 国产美女免费看 | 中文字幕在线观看你懂的 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 久久夜夜爽 | 久久精选 | 国产黄视频在线观看 | 成年人看片 | 久久久亚洲成人 | 久久你懂的 | 亚洲午夜精品久久久久久久久久久久 | 四虎影视精品成人 | 激情视频网页 | 96久久久| 亚洲精品国产电影 | 国产麻豆电影在线观看 | 成人黄色片免费看 | 久久国产免费 | 日韩电影一区二区三区在线观看 | 久久免费一级片 | 久久久免费视频播放 | 国产xxxx | 中文字幕在线网 | 草久视频在线观看 | 国产999精品久久久影片官网 | 成人在线免费小视频 | 中文av字幕在线观看 | 免费麻豆 | 中文字幕在线观看国产 | 超碰97人人干 | 国产小视频网站 | 国产91精品一区二区麻豆网站 | 欧美日韩a视频 | 91免费日韩 | 成人在线电影观看 | 高清av在线免费观看 | 久久99国产精品久久99 | av在线免费观看网站 | 在线观看国产成人av片 | 亚洲国产字幕 | 亚洲一二区精品 | 成人av.com| 国产在线欧美在线 | 一区二区三区免费播放 | 精品久久久久久综合日本 | 在线观看免费黄视频 | 亚洲精品一区二区在线观看 | 99热99热| 精品超碰| 久久av一区二区三区亚洲 | 午夜影院日本 | 中文字幕av最新 | 国产在线播放一区 | 久久线视频 | 午夜视频久久久 | 欧美日韩一区二区免费在线观看 | 特黄特色特刺激视频免费播放 | 国产成人a v电影 | 国产高清在线永久 | 久久精品中文视频 | 一区二区欧美在线观看 | 久草视频中文在线 | 久久婷婷综合激情 | 日狠狠 | 91干干干| 久久99国产一区二区三区 | 国产精品高清在线观看 | 伊人电影在线观看 | 久久天天躁夜夜躁狠狠85麻豆 | 久久免费视频这里只有精品 | 国产美女精彩久久 | 91一区一区三区 | 亚洲人成在 | 13日本xxxxxⅹxxx20| 婷婷在线视频 | 日韩精品在线视频免费观看 | 黄色动态图xx | 天堂av免费看| 97电影在线 | 人人爽爽人人 | 成人sm另类专区 | 中文字幕av在线播放 | 国产99久久精品一区二区300 | 99久久这里只有精品 | 最新日韩在线 | 国产 在线 日韩 | 99久久激情视频 | 国产一在线精品一区在线观看 | 一级成人网 | 国产成人一区二区三区免费看 | 91成人免费视频 | 美女在线观看av | 亚洲女欲精品久久久久久久18 | 亚洲自拍偷拍色图 | 97在线公开视频 | 免费观看v片在线观看 | 国产亚洲精品日韩在线tv黄 | 成人国产精品久久久 | 狠狠干美女 | 操久久免费视频 | 欧美极品xxxx| 激情视频综合网 | 国产小视频免费在线网址 | 欧美日韩国产一区二区在线观看 | 国产精品va在线观看入 | 欧美a级一区二区 | 99色在线播放 | 亚洲精品色 | 99视频在线免费看 | 91九色视频在线 | 国产一级在线免费观看 | 午夜精品久久久久久99热明星 | 成人国产精品久久久 | 香蕉网址| 国产精品美女久久久网av | 国产精品综合av一区二区国产馆 | 免费日韩视| 黄色国产大片 | 永久免费在线 | 精品久久久久久久久久久久 | 99热精品视 | adc在线观看 | 欧美一区二区三区在线看 | 久99久视频 | 97色视频在线 | 久香蕉 | 日韩网站在线看片你懂的 | 精品久久一区 | 欧美天堂视频在线 | 精品视频久久久 | 国产一区播放 | 亚洲欧美国产精品 | 在线看毛片网站 | 国产精品专区一 | 久久久精品网站 | 日韩影视在线 | 91插插视频 | 狠狠操影视 | 99久久综合国产精品二区 | 亚洲国产大片 | 黄色一级免费电影 | 天天草综合 | 最新av中文字幕 | 天天操夜操 | 日韩在线观看影院 | 国产日产精品久久久久快鸭 | 天天射天| 激情av网 | 中文字幕在线观看不卡 | 91成人精品一区在线播放69 | 二区三区毛片 | 亚洲久草网 | 亚洲国产片 | 狠狠色狠狠色综合日日92 | 欧美日韩国产精品一区二区亚洲 | 91色九色 | 色在线国产 | 欧美中文字幕久久 | 日本免费久久高清视频 | 国产粉嫩在线观看 | 三级黄色免费片 | 国产一区二区三区 在线 | 亚洲精品一区二区三区在线观看 | 日韩欧美高清在线 | 国产小视频你懂的在线 | 51久久夜色精品国产麻豆 | 中文字幕韩在线第一页 | 欧美a级成人淫片免费看 | 成人a免费 | 玖玖玖在线观看 | 亚洲精品在线国产 | 特级西西444www大精品视频免费看 | 国产大陆亚洲精品国产 | 超碰在线天天 | 成人免费一区二区三区在线观看 | 91精彩视频在线观看 | 91视频首页| 四虎国产视频 | 日韩av中文| 亚洲高清av在线 | 亚洲精品视频在线观看网站 | 4438全国亚洲精品观看视频 | 天天曰视频 | 亚洲欧美色婷婷 | 一区免费观看 | 国产黄色av | 国产精品女视频 | 中文字幕一区av | 国产午夜精品免费一区二区三区视频 | 色婷婷福利视频 | 日韩欧美视频在线免费观看 | 午夜精品一区二区三区在线视频 | 久久久久久在线观看 | 午夜av免费 | 一区二区 精品 | 91在线视频一区 | 麻豆视频在线免费观看 | 亚洲aaa毛片 | 欧美综合色在线图区 | 日韩在线视频网站 | 国产精品嫩草影视久久久 | 国产精品麻豆免费版 | 久久久69| 成人av资源在线 | 国产 一区二区三区 在线 | 少妇bbb搡bbbb搡bbbb′ | 福利一区二区在线 | 天天在线免费视频 | 久久综合九九 | 免费在线观看黄 | 日韩免费播放 | 五月天婷亚洲天综合网鲁鲁鲁 | 欧美一级视频免费看 | 精品久久久久_ | 国产精品免费观看久久 | 一区二区av | 久久免费观看视频 | 在线观看色视频 | 丁香久久五月 | 国产精品久久久免费看 | 在线va视频| 久久久久久久久久久久电影 | 国产精品系列在线播放 | 激情小说 五月 | 国产精品免费久久久久久久久久中文 | 久久99热这里只有精品国产 | 国产精品永久免费观看 | 免费网址你懂的 | 国产一区二区电影在线观看 | 91片网 | 色综合久久五月天 | 高清精品在线 | a在线观看视频 | 美女视频一区二区 | 日韩videos | 欧美日韩高清国产 | 久久久久9999亚洲精品 | 国产黄网在线 | av中文天堂 | 欧美激情精品久久 | 久草在线官网 | 九九在线高清精品视频 | 最新在线你懂的 | 91视频久久久久 | 美女很黄免费网站 | 国产精品久久久久久久久久不蜜月 | 欧美日韩不卡一区二区 | 97色资源| 天天综合精品 | 日韩免费观看一区二区三区 | 欧美国产一区二区 | 男女全黄一级一级高潮免费看 | 高清久久久 | 精品国产免费一区二区三区五区 | 久久久99久久 | 一级免费av | 久亚洲| 最新高清无码专区 | 国产区在线视频 | 国产一级片视频 | 国产欧美中文字幕 | 最新av电影网址 | 免费看黄色毛片 | 探花视频网站 | 日韩免费大片 | bbbbb女女女女女bbbbb国产 | 免费精品在线观看 | 成人午夜性影院 | 国产日韩欧美视频 | 天天天天爱天天躁 | 久草视频播放 | 狠狠久久 | 久久99久久99精品中文字幕 | 97中文字幕 | 国产精品一区二区免费看 | 午夜精品久久久久久久久久久 | 日韩欧美电影在线 | 国产91影视| 在线免费观看的av | 日韩欧美一区二区在线播放 | 久久新| 91在线观看高清 | 婷婷丁香激情网 | 欧美a影视 | 中文字幕观看在线 | 波多野结衣在线中文字幕 | 国产不卡av在线 | 国产色影院 | 欧美在线视频日韩 | 国产999视频 | 久久成人高清视频 | 午夜久久福利影院 | 亚洲精选视频免费看 | 国产999精品久久久久久绿帽 | 久久久国产精品视频 | 久久久久欠精品国产毛片国产毛生 | 国产第一页在线播放 | japanesefreesex中国少妇 | 最新av免费在线观看 | 岛国片在线 | 亚洲国产mv | 免费精品在线 | 美女福利视频一区二区 | 一区二区三区在线观看免费 | 久草视频免费 | 久久精品美女视频 | 久久一二三四 | 久久精品专区 | 成人久久亚洲 | 91九色porny蝌蚪视频 | 正在播放国产一区 | 91av国产视频 | 亚洲成av片人久久久 | 亚洲国产精品成人女人久久 | 亚洲成人软件 | 99国产在线视频 | 久久国产欧美日韩 | www.久久婷婷 | 99久e精品热线免费 99国产精品久久久久久久久久 | 99视频免费| 97天堂网 | 91在线视频免费91 | 国产精品一二三 | 免费观看特级毛片 | 成 人 黄 色 视频免费播放 | 日韩色一区二区三区 | 亚洲 欧洲av | www视频在线观看 | 天天人人综合 | 一级黄色大片在线观看 | 成年人在线观看视频免费 | 久影院 | 美女网站黄免费 | 国产精品一区二区在线观看 | 日韩欧美电影 | 亚洲aⅴ在线观看 | 欧美日韩视频在线 | 在线观看日韩专区 | 国产精品视频区 | 国产裸体永久免费视频网站 | 中文久草 | 久久精品五月 | 激情久久伊人 | 精产嫩模国品一二三区 | 精品一区免费 | 国产亚洲精品久久久久久移动网络 | 国产精品综合在线观看 | 一级a性色生活片久久毛片波多野 | 欧美日韩精品国产 | 亚洲 中文 在线 精品 | 狠狠狠狠狠狠狠狠干 | 亚洲色图 校园春色 | 国产亚洲精品久久久久久久久久 | 日韩综合一区二区 | 欧美激情在线看 | 欧美狠狠操 | 日韩av在线免费看 | 日韩免费观看视频 | 99久久99视频 | 国产va饥渴难耐女保洁员在线观看 | 国产91成人在在线播放 | 亚洲精品美女久久久久 | 1区2区视频 | 99精品热视频| 国产视频一区在线免费观看 | 天天操天天干天天操天天干 | 黄色大片中国 | 欧美一区影院 | 99热在线看| 激情综合色综合久久 | 国产一区观看 | 日韩网站在线 | 免费视频一二三区 | 二区三区av | 久久久久国产免费免费 | 国产免费黄色 | 国产日韩欧美网站 | 日韩在线观看a | 中文字幕一区二区三区乱码不卡 | 日韩视频在线不卡 | 国产精品久久 | 91麻豆国产福利在线观看 | 伊人成人精品 | 视频在线观看日韩 | 丁香综合网 | 亚洲精品日韩一区二区电影 | 国产69精品久久久久99尤 | 国产v在线 | 婷婷综合亚洲 | 日韩一级理论片 | 国产精品久免费的黄网站 | 五月天久久久久久 | 免费高清在线观看成人 | 91探花国产综合在线精品 | 久久男人免费视频 | 在线欧美小视频 | 日韩午夜电影 | 亚洲最大成人网4388xx | 亚洲精品视频中文字幕 | 久久 一区 | 久久成人综合 | 西西大胆免费视频 | 亚洲免费专区 | 免费国产一区二区视频 | 伊人六月| 久操视频在线播放 | 久久丁香网 | 成人免费观看大片 | 欧美精品久久久久久久久久白贞 | 日韩av网址在线 | 在线观看黄av | 97国产精品亚洲精品 | 中文字幕亚洲综合久久五月天色无吗'' | 婷婷日| 综合网在线视频 | 91x色| 久久久精品国产一区二区电影四季 | 久久婷婷五月综合色丁香 | 深爱激情av | 久久久久99精品成人片三人毛片 | 91精品在线观看入口 | 五月天六月色 | 久久久久久亚洲精品 | 久免费 | 91视频下载 | 日韩一区二区免费播放 | 天天操操操操操 | 亚洲国产高清视频 | 天天操天天操天天操天天操天天操天天操 | 欧美午夜久久久 | 免费试看一区 | 99久久99久久免费精品蜜臀 | 色在线视频网 | 久久久受www免费人成 | 国产成人久久精品亚洲 | 精品一区二区在线免费观看 | 中文av在线免费观看 | 2024国产精品视频 | 99一区二区三区 | 久草在线视频新 | 欧美日韩一区二区视频在线观看 | 日韩高清一区二区 | 丝袜美腿亚洲 | av丁香 | 999一区二区三区 | 成人黄色在线视频 | 国产又粗又猛又色又黄视频 | 精品视频久久 | 日日夜夜亚洲 | 天天se天天cao天天干 | 视频一区二区视频 | 一区二区三区免费播放 | 福利区在线观看 | 日韩特黄av | 欧美日韩在线视频免费 | 亚洲黄色在线观看 | 日韩试看 | 国产r级在线观看 | 麻豆视频在线 | 视频国产 | 五月天六月丁香 | av久久久久久 | 国产成人精品一区二区在线 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 狠狠色噜噜狠狠狠合久 | 91麻豆视频 | 人人干在线观看 | 欧美国产日韩激情 | 黄色av三级在线 | 97精品国产91久久久久久 | 免费看黄在线 | 一级欧美黄 | 极品中文字幕 | 久久久久久久久综合 | 视频二区在线 | 波多野结衣亚洲一区二区 | 久久免费视频6 | 五月天伊人网 | 日韩欧美电影网 | 97av在线 | 国产精品一区久久久久 | 亚洲免费一级 | 99热9| 免费在线看成人av | 99久精品视频 | a√资源在线| 九九在线国产视频 | 黄色日本免费 | 狠狠色狠狠综合久久 | 二区三区毛片 | 免费在线黄色av | 欧美做受xxx | 亚洲性xxxx| 成 人 黄 色 视频 免费观看 | av在线网站观看 | 五月天婷亚洲天综合网精品偷 | 99r在线视频 | 99久久99久久精品国产片 | 亚洲欧美国内爽妇网 | 亚洲天堂网视频 | 91精品啪在线观看国产81旧版 | 成人性生交大片免费看中文网站 | 久久最新网址 | 国产精品久久久久久久久久尿 | 国产精品国产三级国产aⅴ入口 | 91日韩免费| av在线免费观看黄 | 一区中文字幕电影 | 500部大龄熟乱视频使用方法 | 91av手机在线 | 欧美日韩一区二区视频在线观看 | 国产永久免费高清在线观看视频 | 人人爽爽人人 | 国产三级香港三韩国三级 | 视频一区视频二区在线观看 | 亚洲三级毛片 | 日韩h在线观看 | 一级一片免费观看 | 国产成人亚洲在线观看 | 亚洲亚洲精品在线观看 | 欧美日韩午夜爽爽 | 久久av中文字幕片 | 97国产精品免费 | 性色av一区二区三区在线观看 | 天天综合人人 | 99热免费在线 | 日韩视频免费看 | 久久久久美女 | 久久无码精品一区二区三区 | 国产精品video爽爽爽爽 | 国产成人a v电影 | 97免费公开视频 | 99精品一区 | av网址最新 | 精品久久网 | 欧美精品久久久久久久久久久 | 国外调教视频网站 | 99久久精品国产一区二区三区 | 337p日本欧洲亚洲大胆裸体艺术 | 日韩二区在线观看 | 亚洲污视频 | 在线观看深夜福利 | 中文视频一区二区 | 久久少妇 | 日韩在线视频线视频免费网站 | 久久黄色网 | 亚洲视频大全 | 欧美电影在线观看 | 久久久国产成人 | 婷婷网站天天婷婷网站 | 日韩a在线播放 | 国产一区在线视频观看 | 欧美激情综合五月 | 黄免费在线观看 | 韩国三级av在线 | 亚洲国产精品va在线 | 99国产情侣在线播放 | 亚洲成免费 | 久久毛片网站 | 久草视频2| 日本视频精品 | 成人久久久久久久久久 | 国产无限资源在线观看 | 欧美日韩综合在线 | 国产一区二区三区高清播放 | 久久在视频 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 国产一线天在线观看 | 亚洲天堂网在线视频观看 | 久久新视频 | 国产中文字幕网 | 国内精品久久久久久 | 精品国内自产拍在线观看视频 | 日韩欧在线 | 国产va精品免费观看 | 亚洲成av人片 | 免费在线播放视频 | 九九久 | 视频国产区 | 国产精品久久久久久久妇 | 中文字幕在线观看视频一区二区三区 | 国产麻豆精品久久一二三 | 免费看一级 | 欧美精品v国产精品 | 麻豆成人精品 | 91麻豆精品91久久久久同性 | 国产乱对白刺激视频在线观看女王 | 99热手机在线观看 | 狠狠干婷婷 | 不卡的一区二区三区 | 一区二区三高清 | 亚洲成人精品影院 | 日韩在线观看网址 | 麻豆免费在线视频 | 日韩免费观看一区二区三区 | 国产1区2区3区精品美女 | 中文一区二区三区在线观看 | 亚洲精品1区2区3区 超碰成人网 | 亚洲色图色 | 色在线最新 | 亚洲欧美综合 | 一区二区三区四区五区六区 | 欧美日韩中文字幕视频 | 日韩在线观看免费 | 精品久久久亚洲 | 国产在线色站 | 久久久久免费精品 | 国产精品一区二区在线 | 免费看的黄色的网站 | 欧美精品久久99 | 正在播放国产一区二区 | 五月婷婷综合在线观看 | 亚洲精品玖玖玖av在线看 | 99色视频 | 久久人视频 | av片中文字幕 | avwww在线| 天天射天天射天天射 | 久草视频免费播放 | 菠萝菠萝蜜在线播放 | 久久综合久久八八 | 五月婷婷六月丁香激情 | 日日夜夜人人精品 | 久久精品国产一区 | 香蕉视频一级 | 最近中文字幕mv | www黄| 亚洲h视频在线 | 欧美激情在线看 | 国产五码一区 | 亚洲欧美视频在线观看 | 国产精品igao视频网入口 | 久久国产精品免费观看 | 99精品99| 日韩激情片在线观看 | 久久精品国产精品亚洲精品 | 在线免费中文字幕 | 狠狠狠狠狠干 | av线上免费看| 热99在线视频 | 在线播放 一区 | 国产视频久 | 最近高清中文字幕 | 国内精品久久久久影院日本资源 | 丁香花在线观看视频在线 | 黄色在线观看污 | 国产成人91 | 欧美色888 | 在线观看中文字幕视频 | 一区 二区 精品 | 97色免费视频 | 日韩影视精品 | 久久精品欧美一 | 日韩在线免费电影 | 色综合天天天天做夜夜夜夜做 | 国产色拍 | 精品亚洲午夜久久久久91 | 久久精品爱视频 | 国产精品久久中文字幕 | 国产小视频在线观看 | 香蕉网在线观看 | 成人网在线免费视频 | 欧美久久久一区二区三区 | 国产黄色看片 | 国产视频二区三区 | 婷婷久久网 | 精品视频久久久久久 | 99色在线视频 | 亚洲精品久久久久久久不卡四虎 | 国产精品久久久久久久久久久久午夜 | 国产高清一区二区 | 久久精品国产v日韩v亚洲 | 久久精品国产一区二区电影 | 在线观看黄色大片 | 久久99视频 | 国产一级黄色av | 18av在线视频| 欧美在线free | 中文字幕在线看 | 中文字幕在线视频精品 | 黄色国产高清 | 99久久99久久精品免费 | 片黄色毛片黄色毛片 | 国产精品日韩精品 | 98久久| av在线一级 | 亚洲砖区区免费 | 久久免费精彩视频 | 久久久久久网站 | 国产vs久久 | 香蕉久草在线 | 午夜精品视频一区二区三区在线看 | 在线视频欧美日韩 | 久久精品激情 | 欧美一级特黄高清视频 | 日本mv大片欧洲mv大片 | 精品久久久久久久久久久久 | 日韩欧美电影在线观看 | 国产精品自在欧美一区 | 日操操| 国产精品久久网站 | 黄色a一级片 | 激情久久婷婷 | 天天干,夜夜操 | 国产中文字幕视频在线 | 色国产精品一区在线观看 | 在线观看黄色大片 | 国产精品视频区 | 69国产成人综合久久精品欧美 | 91丨精品丨蝌蚪丨白丝jk | 狠狠色噜噜狠狠狠狠2021天天 | 91亚洲精品久久久蜜桃网站 | 欧美午夜久久 | 91视频中文字幕 | 综合久久久久久久久 | 国色天香在线观看 | 色在线视频 | 天天操比 | 国产中文字幕大全 | 一区二区三区中文字幕在线 | 黄污网 | 美女网站视频久久 | 国产成人福利在线观看 | av在线等| 91av欧美 | 三级黄色网络 | 国产黄色精品在线 | 狠狠色丁香久久综合网 | 黄色三级视频片 | 免费观看成人网 | 色香蕉网 | av在线电影网站 | 国产高清视频在线 | 欧美一级性生活视频 | 在线看毛片网站 | 免费av小说 | 欧美在线视频免费 | 黄色一级大片在线免费看产 | 久久久久亚洲国产精品 | 91最新在线视频 | 日韩两性视频 | 蜜桃视频日本 | 玖玖在线观看视频 | 四虎在线视频免费观看 | 午夜在线免费观看 | 狂野欧美激情性xxxx欧美 | 超级碰碰碰免费视频 | 手机av电影在线观看 | www.超碰| 亚洲年轻女教师毛茸茸 | 2023国产精品自产拍在线观看 | 亚av在线| 国产99亚洲| www.成人精品 | 黄色亚洲大片免费在线观看 | 免费久久久 | 午夜精品一区二区三区在线观看 | www99精品 | 中文字幕精品三级久久久 | 成人在线视频你懂的 | 视频福利在线 | 婷婷成人在线 | 黄色片免费电影 | 天堂网一区 | 天天射天天干天天爽 | japanesexxxhd奶水 91在线精品一区二区 | 亚洲欧美国产精品 | 欧美热久久 | 天堂网在线视频 | 欧美一级片免费在线观看 | 精品国产一二三四区 | 久久精品视频国产 | 国产成人久久精品一区二区三区 | 最新国产精品拍自在线播放 | 国产精品欧美久久久久无广告 | 国产区精品 | 成人a级网站 | 国产这里只有精品 | 激情五月婷婷网 | 一区二区视频在线观看免费 | 久久精品视频2 | 中文字幕激情 | 亚洲乱码国产乱码精品天美传媒 | 色香蕉在线 | 一级α片免费看 | 黄a在线看 | 色姑娘综合网 | 久久国产经典视频 | 激情五月在线视频 | 成人九九视频 | 96亚洲精品久久 | 在线观看免费av网站 | 欧美极品xxx | 中文字幕大全 | 国产精品黄网站在线观看 | 日韩欧美不卡 | 久草观看视频 | 国产网站色 | 欧美激情综合网 | 中文字幕av在线不卡 | 色妞色视频一区二区三区四区 | 女人18精品一区二区三区 | 麻豆免费视频 | 国产精品免费观看在线 | 国产日韩视频在线 | 久久久一本精品99久久精品66 | 国产99久久久国产精品成人免费 | 日韩久久久久久久久久久久 | 久久av一区二区三区亚洲 | 国产剧情av在线播放 | 天天操天天干天天操天天干 | 人人舔人人舔 | 久草视频在线资源 | 精品一区二区在线免费观看 | 久久影院精品 | 久久综合中文色婷婷 | 麻豆传媒一区二区 | 亚洲人人爱 | 欧美日韩国内在线 | 国产无遮挡又黄又爽馒头漫画 | 综合激情av| 中文字幕在线乱 | 91av在线免费播放 | 激情综合五月天 | 日韩一级电影在线 | 草免费视频 | 日韩黄色在线电影 | 欧美三级在线播放 | 国产一级电影免费观看 | 免费亚洲黄色 | 国产视频欧美视频 | 最新三级在线 | 亚洲有 在线 | 国产理伦在线 | 亚洲国产福利视频 | 亚洲专区中文字幕 | 久久综合狠狠综合久久综合88 | 在线播放视频一区 | 国产精品中文在线 | 国产在线看 | 超碰97中文 | 久久久久婷 | 在线观看国产亚洲 | 成人影音av| 一区二精品 | 91私密保健 | 国产永久免费观看 | 国产精品自产拍在线观看蜜 | 高清av在线 | 久草免费在线观看视频 | 国产精品av在线免费观看 | 欧美在线一 | 98超碰在线观看 | 九九视频精品在线 | 波多野结衣电影一区二区三区 | 久久公开免费视频 | 国产精品九九九九九九 | 四虎永久免费在线观看 | 日韩av一区在线观看 | 国产在线视频资源 | 久热久草| 精品国产三级a∨在线欧美 免费一级片在线观看 | 在线你懂的视频 | 超碰97成人 | 欧美亚洲免费在线一区 | 一区在线播放 | 人人爽久久涩噜噜噜网站 | 久久亚洲私人国产精品 | 国产精品久久久精品 | 综合激情久久 | 久久久久黄 | 日韩av影视在线 | 日韩一级电影在线 | 成人h电影 | 黄色一级大片在线观看 | 日韩mv欧美mv国产精品 | 99精品免费视频 | 日本资源中文字幕在线 | 久久精品79国产精品 | 香蕉久草 | 欧美激情片在线观看 | 亚洲成av人片一区二区梦乃 | 日日天天av| 五月婷婷丁香激情 | 一区在线免费观看 | 午夜精品一区二区国产 | 中文字幕中文字幕在线中文字幕三区 | 国产高清av免费在线观看 | 国产精品亚州 | 国产福利精品一区二区 | 1024手机基地在线观看 | 国产亚洲欧美在线视频 | 制服丝袜在线 | 亚洲男女精品 | 日韩天堂在线观看 | 日韩在线观看你懂的 | 国产视频在线看 | 国产片免费在线观看视频 | 欧洲性视频 | 日韩精品三区四区 | 欧美一级片免费播放 | 9999精品免费视频 | 免费看片成人 | 国产视频 久久久 | 亚洲黄色成人 | 综合激情av| 国产日韩欧美在线观看视频 | 视频福利在线观看 | 欧美日韩国产xxx | 999成人 | 碰天天操天天 | www.天天干.com | 公与妇乱理三级xxx 在线观看视频在线观看 | www.黄色小说.com| 成人国产精品一区 | 免费在线观看成人小视频 | 久草视频网 | 精品久久久网 | 超碰在97| 操久久网| 国产伦理一区二区 | 草久久久久 | 韩国精品福利一区二区三区 | 一级a性色生活片久久毛片波多野 | 免费在线观看av网站 | 国产一二区视频 | 欧美巨乳波霸 | 日韩三级.com | 中文字幕精品一区二区精品 | 一区在线观看 | 又大又硬又黄又爽视频在线观看 | 午夜精品视频福利 |