精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux高性能網絡編程十談 | IO復用和模式

系統 Linux
通常我們寫一個linux的client和server,但是怎么提升性能?系統是如何快速處理網絡事件?因此本文就來談談IO復用和模式。

通常我們寫一個linux的client和server如下圖:

但是怎么提升性能?系統是如何快速處理網絡事件?因此本文就來談談IO復用和模式。

第一部分:模式

我們都知道socket分為阻塞和非阻塞,阻塞情況就是卡住流程,必須等事件發生;而非阻塞是立即返回,不管事件是否有沒有準備好,需要上層代碼通過EAGAIN,EWOULDBLOCK和EINPROGRESS等errno返回值來判斷,基于非阻塞有兩種網絡編程模式:Reactor和Proactor事件處理。

1、Reactor

同步IO模型一般使用Reactor,如果使用線程模式,Reactor是遇到事件就通知工作線程處理,然后主線程繼續循環等待事件的發生:

reactorreactor

(1)對于網絡讀寫,先將socket注冊到epoll內核事件表中;

(2)使用epoll_wait等待句柄的讀寫事件;

(3)當句柄的可讀可寫事件發生,通知工作線程執行對應的讀寫動作;

(4)當工作線程處理完讀寫動作,如果還有后續讀寫,工作線程可以將句柄繼續注冊到epoll內核事件表中;

(5)主線程繼續用epoll_wait等待事件發生,然后繼續告知工作線程處理;

2、Proactor

在講Proactor之前我們先說說一個例子:

...
#include <libaio.h>

int main() {
    io_context_t context;
    struct iocb io[1], *p[1] = {&io[0]};
    struct io_event e[1];
    ...

    // 1. 打開要進行異步IO的文件
    int fd = open("xxx", O_CREAT|O_RDWR|O_DIRECT, 0644);
    if (fd < 0) {
        printf("open error: %d\n", errno);
        return 0;
    }

    // 2. 創建一個異步IO上下文
    if (0 != io_setup(nr_events, &context)) {  
        printf("io_setup error: %d\n", errno);
        return 0;
    }

     // 3. 創建一個異步IO任務
    io_prep_pwrite(&io[0], fd, wbuf, wbuflen, 0); 

    // 4. 提交異步IO任務
    if ((ret = io_submit(context, 1, p)) != 1) {
        printf("io_submit error: %d\n", ret);
        io_destroy(context);
        return -1;
    }

    while (1) {
        // 5. 獲取異步IO的結果
        ret = io_getevents(context, 1, 1, e, &timeout);
        if (ret < 0) {
            printf("io_getevents error: %d\n", ret);
            break;
        }
        ...
    }
    ...
}

以上就是linux的aio處理一個讀寫文件的流程,可以看到整個流程不需要工作線程處理,而是由內核直接處理后,主線程只需要等待處理結果即可。

proactorproactor

3、Half-Reactor

前面提到Reactor大家從圖中看出,都是主線程等待事件,分發事件,然后工作線程爭搶事件后處理,這里會有幾個缺點:

(1)工作線程需要加鎖取出自己的工作任務,浪費CPU;

(2)工作線程取出隊列一次只能處理一個,對于CPU密集型的任務可以跑滿CPU,但是如果是IO密集型任務,這個工作線程又會切換到休眠或者等待其他任務,不能充分利用CPU;

為了解決以上缺點,于是提出了Half-Reactor半反應堆模式:

Half-ReactorHalf-Reactor

第二部分:IO復用

在開發一些業務面前,我們可能會面對C10K,C100K或者C10M等問題,只是靠堆服務器可能不能完全解決,所以我們就需要從IO復用來處理服務的并發能力,這里我們就直接講epoll(對于select,poll和epoll的大概區別應該都知道了,所以就不詳細說了,如果有疑問可以留言給我),同時找了一張libevent的幾個事件處理性能對比:

libeventlibevent

1、epoll的使用

#include <sys/epoll.h>

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

(1)epoll_create創建一個內核事件表,size可以指定大小,但是并沒有作用;

(2)epoll_ctl操作事件,epfd就是epoll事件表,op指定操作類型(EPOLL_CTL_ADD往事件表添加fd,EPOLL_CTL_MOD往事件表修改fd,EPOLL_CTL_DEL往事件表刪除fd);

(3)struct epoll_event其結構體:

sturct epoll_event{ _uint32_t events; // EPOLLIN(數據可讀),EPOLLOUT(數據可寫)... epoll_data_t data; // 用于存儲用戶監聽事件句柄需要在上下文攜帶的用戶數據}

(4)epoll_wait等待事件發生,events返回發生事件的列表,timeout等待一定的超時時間,如果沒有事件發生依舊返回,maxevents最多一次監聽集合的大小;

2、LT和ET

(1)LT是epoll對文件操作符的模式,表示電平觸發(Level Trigger),當epoll_wait監聽了事件,上層可以不處理該事件,下一次epoll_wait依舊會觸發;

(2)ET是epoll對文件描述符的高效模式,表示邊緣觸發(Edge Trigger),當epoll_wait監聽了事件,如果不處理下一次不會再觸發,需要應用層一次就處理完,這樣可以減少觸發的次數,從而提升性能。

所以要注意對于read使用將套接口設置為非阻塞,再用while循環包住read一直讀到產生EAGAIN錯誤,采用非阻塞套接口的原因在于防止read被阻塞住。

3、樣例

詳細代碼由于篇幅原因,就不寫了,大概流程如下:

...
listen_fd = bind(...);
 
listen(listen_fd, LISTENQ);
 
int epoll_fd;
struct epoll_event events[10];
int nfds, i, fd;
...

// 創建一個描述符
epoll_fd = epoll_create(...);
// 添加監聽描述符事件
epoll_ctl(epoll_fd, ... listen_fd, ... EPOLLIN);

for ( ; ; )
{
    nfds = epoll_wait(epoll_fd, events, sizeof(events)/sizeof(events[0]), 1000);
    
    for (i = 0; i < nfds; i++)
    {
        fd = events[i].data.fd;
        if (fd == listen_fd)
        {
            // 創建新連接
            ...
        }
        else if (events[i].events & EPOLLIN)
        {
            // 讀取socket數據
            ....
        }
        else if(events[i].events & EPOLLOUT)
        {
            // 寫入socket數據
            ...
        }
    }
}

close(epoll_fd);

4、epoll的實現

epoll底層數據結構是紅黑樹和鏈表組成,通過epoll_ctrl增加、減少事件,其中epoll結構體如下:

struct eventpoll
{
    wait_queue_head_t wq;
    struct list_head rdlist;
    struct rb_root rbr;
    ...
}

epollepoll

(1)wq是等待隊列,用于epoll_wait;

(2)rdlist是就緒隊列,當有事件觸發時候,內核會將句柄等信息放入rdlist,方便快速獲取,不需要遍歷紅黑樹;

(3)rbr是一顆紅黑樹,支持增加,刪除和查找,管理用戶添加的socket信息;

第三部分:提升網絡編程中服務器性能的建議

在網絡編程中我們會遇到各種各樣的處理任務,比如純轉發的proxy,需要處理https的server,需要處理任務的業務邏輯server等等,而且在微服務時代和云原生時代可能這些問題更加復雜,比如我們需要在server前加上斷路器,在容器服務中我們都適用多線程模式等等。雖然面臨很多問題,但是網絡編程中服務器性能還是最基礎的那些問題,于是基于我的一些經驗,我整理了一些。

1、復用

(1)線程復用 :前面提到的工作線程,我們不應該對于每個客戶端都開一個線程,而是構建一個線程pool,當某些線程空閑就可以從隊列中取事件或者數據進行處理,畢竟linux中的線程和進程調度方式一樣,線程太多必然加劇內核的負載;

(2)內存復用 :在網絡狀態流轉和工作線程流轉過程中,我們需要盡可能考慮內存復用,而不是在每一層中都拷貝,比如一個請求從內核讀到數據以后,盡可能在當前請求的什么周期內,一直使用相同的內存塊(包括在業務層,盡量使用指針偏移量操作),減少拷貝;

當然減少內存拷貝以外,還需要做的就是同一塊內存用完不是讓系統回收,而是自己放到內存pool中,等待下一次請求需要再復用;

2、減少內存拷貝

這里上一篇文章提到的零拷貝,就是減少內存拷貝的一種方式,比如在文件讀寫方面能提升性能(可以參考nginx的sendfile),另一種可以使用共享內存,通過一寫多讀的方式解決一些場景下的內存拷貝;

3、減少上下文切換和競爭

上下文切換是阻礙性能提升的一個問題,比如頻繁的事件觸發會導致主線程和工作線程之間切換,其CPU時間會被浪費;小量的數據包多次觸發讀處理等。因此我們在寫server過程中對于能在同一個上下文處理的,就不必要再丟該其他線程處理,對于多個小塊數據可以等待一段超時時間一起處理(當然具體問題可以分析);

競爭也是阻礙性能提升的一個問題,掙搶共享資源會一段CPU時間片內阻塞操作,減少鎖的使用或者將鎖拆分更加細粒度的鎖,減少鎖住臨界區的范圍,是我們需要注意的;

4、利用CPU親和性

這里以nginx為例,提供了一個worker_cpu_affinity,cpu的親和性能使nginx對于不同的work工作進程綁定到不同的cpu上面去。就能夠減少在work間不斷切換cpu,進程通常不會在處理器之間頻繁遷移,進程遷移的頻率小,來減少性能損耗。

這種可以參考CPU性能提升方式,比如在NUMA下,處理器訪問它自己的本地存儲器的速度比非本地存儲器(存儲器的地方到另一個處理器之間共享的處理器或存儲器)快一些,所以針對NUMA架構系統的特點,可以通過將進程/線程綁定指定CPU(一個或多個)的方式,提高CPU CACHE的命中率,減少進程/線程遷移CPU造成的內存訪問的時間消耗,從而提高程序的運行效率。

5、協程

協程是一種用戶態線程,在現在主流的server框架,協程已經成為一個提升性能的銀彈(比如golang寫server又快又方便),后續文章會專門介紹協程(在此埋一個坑),但是協程也不是萬能的,需要定位本身業務特點,比如IO密集型就適合(當然這里也需要情況而定,比如純轉發類型的面對長尾延時,可能協程也不合適),CPU密集型自己調度協程還是比較麻煩的,所以在做優化的適合可以拷貝業務的特性和后續的擴展而定,畢竟沒有一個框架是萬能的。

責任編輯:華軒 來源: 周末程序猿
相關推薦

2024-03-18 13:43:20

Linux架構

2023-11-01 11:59:13

2023-11-01 10:38:46

Linux高性能網絡編程

2023-11-01 11:51:08

Linux性能優化

2023-11-01 11:27:10

Linux協程

2023-11-01 11:40:46

Linux高性能網絡編程工具

2023-11-01 10:58:31

系統調用高性能網絡編程Linux

2023-11-01 11:13:58

Linux信號處理定時器

2023-11-01 11:20:57

2023-11-01 10:43:31

Linux高性能網絡編程

2025-06-26 01:27:00

2020-06-17 16:43:40

網絡IO框架

2019-01-08 13:32:38

Nginx服務器IO復用

2024-10-06 14:37:52

2024-08-06 08:22:18

2024-09-03 09:15:37

2024-10-16 11:03:30

Linux高性能編程

2017-07-07 16:36:28

BIOIO模型 NIO

2020-11-06 18:51:17

LinuxTCP服務器

2023-12-13 09:45:49

模型程序
點贊
收藏

51CTO技術棧公眾號

日韩av在线天堂| 免费网站在线观看黄| 无码国产精品96久久久久| 美女尤物久久精品| 日韩一区二区三区在线播放| 樱花草www在线| av免费不卡国产观看| 99久久夜色精品国产网站| 国产精品久久久久久久7电影 | 91久色porny| 国产精品久久久亚洲| 欧美精品成人久久| 欧美激情在线精品一区二区三区| 欧美日韩中文国产| 日韩黄色短视频| youjizz在线播放| 国产白丝网站精品污在线入口| 亲子乱一区二区三区电影 | 日韩午夜影院| 国产麻豆精品久久一二三| 2019中文在线观看| 欧美成人一二三区| 成人同人动漫免费观看| 亚洲国产一区二区三区在线观看 | 国产美女久久| 欧美午夜久久久| 18视频在线观看娇喘| 风间由美一区| 久久一夜天堂av一区二区三区| 95av在线视频| 波多野结衣在线观看视频| 亚洲经典三级| 欧美成人精品三级在线观看| 国产精品久久久久久成人| 成人资源在线| 欧美一级午夜免费电影| 99re精彩视频| 欧美aaa大片视频一二区| 欧美日韩精品在线| 国产aaa免费视频| 日本无删减在线| 亚洲人成网站精品片在线观看| 日韩经典在线视频| 可以在线观看的av网站| 99精品黄色片免费大全| 国产精品一区二区不卡视频| 亚洲AV午夜精品| 国产麻豆精品theporn| 成人中心免费视频| 国产伦理一区二区| 韩国精品在线观看| 国产精品网站大全| 中文字幕在线网站| 男人的j进女人的j一区| 国产精品久久视频| 一区二区的视频| 紧缚奴在线一区二区三区| 国产精品第三页| av手机天堂网| 麻豆精品久久精品色综合| 国产精品激情av电影在线观看| 国产一级免费视频| 日韩电影一区二区三区四区| 国产91在线播放九色快色| 精品久久久久久久久久久久久久久久| 欧美亚洲在线| 国产精品1区2区在线观看| 四虎成人在线观看| 日本中文一区二区三区| 国产日韩欧美在线| 国产福利小视频| 国产a久久麻豆| 久久久福利视频| 噜噜噜噜噜在线视频| 欧美激情在线一区二区三区| 亚洲欧美久久234| 久久黄色美女电影| 亚洲一区中文日韩| 一本大道熟女人妻中文字幕在线| 日本免费一区二区三区四区| 欧美午夜影院一区| 奇米777在线| 你懂的在线观看一区二区| 亚洲天堂成人在线| 激情无码人妻又粗又大| 韩国亚洲精品| 日本三级久久久| 92久久精品一区二区| 成人在线视频首页| 日韩福利在线| 成人在线播放| 欧美性xxxx18| 久久久久久久久久毛片| 欧美久久香蕉| 精品国产欧美一区二区五十路 | 欧美日韩精品一区二区三区| 国产精品999.| 日韩中出av| 久久激情五月丁香伊人| 国产精品999久久久| 日韩高清不卡在线| 国产精品视频一区二区三区经| 韩国福利在线| 亚洲一区二区三区四区的| 久久人妻精品白浆国产| 久久av网站| 国产亚洲欧美视频| 国产网站在线看| 六月婷婷色综合| 久久亚洲午夜电影| 亚洲男同gay网站| 在线观看免费一区| 色综合久久久无码中文字幕波多| 国产精品一区高清| 久久久免费电影| 国产免费无遮挡| 国产三级精品三级在线专区| 免费在线观看视频a| 在线日韩三级| 亚洲性69xxxbbb| 亚洲男人第一av| 国产99久久久国产精品免费看 | 欧美视频一区在线| 国产精品一级黄片| 欧美日韩亚洲一区三区| 国产情人节一区| 精品久久av| 欧美日韩色婷婷| 一区二区三区四区影院| 91精品二区| 国产在线播放91| 国产精品久久一区二区三区不卡| 午夜精品一区在线观看| 熟妇无码乱子成人精品| 久久密一区二区三区| 国产精品∨欧美精品v日韩精品| 污视频网站在线播放| 亚洲一区二区精品久久av| 人妻体体内射精一区二区| 天天做综合网| 成人免费福利视频| 黄色av网站在线播放| 欧美日韩国产天堂| 国产成人免费在线观看视频| 日本美女一区二区| 天堂va久久久噜噜噜久久va| 日韩精品麻豆| 在线视频精品一| 在线观看你懂的网站| 国产亚洲成年网址在线观看| 99精品视频播放| 精品在线91| 国产精品成人久久久久| 国产专区在线播放| 欧美午夜在线一二页| 国产馆在线观看| 精品综合久久久久久8888| 影音先锋男人的网站| **精品中文字幕一区二区三区| 日韩一区二区久久久| 国产精品美女一区| 樱桃视频在线观看一区| 在线免费看黄色片| 另类亚洲自拍| 亚洲视频在线二区| 精品一区二区三区在线观看视频| 欧美理论片在线观看| 色呦呦免费观看| 欧美日韩在线影院| 中字幕一区二区三区乱码| 久久国产成人午夜av影院| 超碰成人在线免费观看| 亚洲精品视频一二三区| 91成人在线播放| 在线观看免费高清完整| 91精品国产91综合久久蜜臀| 精品一区在线视频| 久久免费看少妇高潮| 亚洲天堂2018av| 欧美视频久久| 欧美日韩精品不卡| 色婷婷成人网| 国产69精品久久久| 99reav在线| 精品国产制服丝袜高跟| 五月婷婷激情视频| 亚洲精品视频在线观看网站| 亚洲乱妇老熟女爽到高潮的片 | 国产又粗又长又爽又黄的视频| 黄色成人av网站| 日本在线观看一区| 亚州一区二区| 国产精品9999| 免费毛片在线看片免费丝瓜视频| 日韩精品日韩在线观看| 国产精品午夜福利| 午夜精品123| 三级黄色录像视频| 97se亚洲国产综合在线| 亚洲精品中文字幕乱码无线| 亚洲一区日本| 亚洲小说欧美另类激情| 国产欧美一区二区精品久久久| 91视频免费在线观看| av一区在线| 国语对白做受69| 免费观看成人高潮| 午夜免费福利视频| 精品视频免费在线| 国语对白永久免费| 亚洲一区二区三区影院| 国产又粗又猛又爽又黄的视频四季| 成人午夜电影久久影院| 亚洲欧美国产中文| 日韩精品电影在线观看| 欧美午夜小视频| 亚洲国产一成人久久精品| 日韩精彩视频| 亚洲综合福利| 精品91免费| 风间由美一区二区av101 | 另类小说第一页| 国产欧美欧美| 丁香六月激情婷婷| 亚洲欧美综合国产精品一区| 亚洲资源在线网| 精品视频99| 欧美黄色直播| 日本成人a网站| 国产成人成网站在线播放青青| 亚洲综合资源| 国产日韩欧美成人| 日韩电影免费观看高清完整版在线观看| 热99精品只有里视频精品| 色偷偷色偷偷色偷偷在线视频| 欧美激情精品久久久久久黑人| 老司机精品影院| 色哟哟入口国产精品| 久久久资源网| 亚洲色图欧美制服丝袜另类第一页 | 国产精品亚洲综合久久| 777av视频| 亚洲视频大全| 一本大道熟女人妻中文字幕在线| 国产亚洲激情| av天堂永久资源网| 三级欧美在线一区| 黑人粗进入欧美aaaaa| 日韩成人伦理电影在线观看| 亚欧在线免费观看| 久久av资源站| 精品人妻一区二区乱码| 国产福利精品导航| 国产一精品一aⅴ一免费| 国产·精品毛片| 性色av蜜臀av色欲av| 91在线观看下载| 91网站免费视频| 国产精品区一区二区三区| 午夜成人亚洲理伦片在线观看| 中文字幕一区免费在线观看| 国产精品精品软件男同| 一区二区三区欧美激情| 九九九国产视频| 欧美小视频在线| 中文字幕乱码在线观看| 91精品久久久久久久久99蜜臂| 国产成人麻豆精品午夜在线 | 91精品美女在线| 久久视频免费| 国内一区二区三区在线视频| 综合伊思人在钱三区| 亚洲精品中文字幕乱码三区不卡| 欧美电影三区| 丰满少妇大力进入| 日韩制服丝袜av| 亚洲天堂网站在线| 99久久久国产精品免费蜜臀| 熟女高潮一区二区三区| 一区在线观看视频| 激情综合网五月婷婷| 欧美在线免费视屏| 亚洲免费不卡视频| 国产一区二区av| gogo在线高清视频| 欧美最猛黑人xxxx黑人猛叫黄| 日韩专区视频| 久久久福利视频| 综合av在线| 97视频在线免费播放| 精品一区二区三区久久| 制服丝袜第二页| 亚洲精品日韩综合观看成人91| 久久国产视频播放| 欧美一区二区不卡视频| 国产精品久久久久久久龚玥菲| 色综合久久精品亚洲国产| 色8久久影院午夜场| 国产精品久久波多野结衣| 日本不卡高清| heyzo亚洲| 国产综合成人久久大片91| 青青草视频播放| 亚洲日本在线观看| 中文字幕手机在线视频| 亚洲国产精品成人av| 黄色av免费在线| 国产精品福利在线| 久久97精品| 国产福利片一区二区| 日本欧美一区二区| 少妇毛片一区二区三区| 亚洲制服丝袜在线| 91久久精品国产91性色69| 亚洲视频免费一区| 国产资源在线观看入口av| 99视频在线免费观看| 亚洲成人av| 污网站在线免费| 国产色91在线| 最近免费中文字幕大全免费版视频| 欧美xo影院| 国产精品久久久久久超碰| 亚洲第一福利专区| 丰满少妇大力进入| 懂色一区二区三区免费观看| 国产老头老太做爰视频| 欧美亚洲国产bt| 黄视频在线播放| 97久久久久久| 欧美日韩一区二区三区在线电影| 国产 欧美 日本| 国产麻豆精品theporn| 日韩在线视频网址| 6080国产精品一区二区| 在线免费观看黄色网址| 国产精品久久久久久久久久久久久久| 四虎影视精品| 丰满少妇被猛烈进入高清播放| 91在线看国产| 成人午夜淫片100集| 日韩va亚洲va欧洲va国产| 老司机深夜福利在线观看| 国产美女99p| 亚洲作爱视频| 丰满少妇一区二区| 在线观看视频91| а√天堂中文在线资源bt在线 | 日韩在线你懂得| 三年中文高清在线观看第6集| 韩日欧美一区二区三区| 国产极品美女在线| 日韩欧美成人一区二区| 视频在线这里都是精品| 国产精品二区在线| 国产亚洲一级| 娇妻被老王脔到高潮失禁视频| 欧美无人高清视频在线观看| 日本电影在线观看网站| 成人性生交xxxxx网站| 欧美搞黄网站| 亚洲第一黄色网址| 91久久久免费一区二区| 午夜看片在线免费| 亚洲www在线| 亚洲日韩视频| 97超碰在线资源| 欧美日韩激情一区二区| 超碰在线免费播放| 极品日韩久久| 免费av网站大全久久| 在线免费观看亚洲视频| 亚洲精品电影在线| 视频精品导航| 91精品国产毛片武则天| 91麻豆精品一区二区三区| 久久精品国产亚洲av麻豆蜜芽| 最近2019中文字幕mv免费看| 日本免费精品| 成人毛片视频网站| 国产精品―色哟哟| 亚洲精品人妻无码| 国产精品aaa| 国产精品草草| 中国美女黄色一级片| 亚洲精品一区二区三区精华液| 日韩影片中文字幕| 欧美a级免费视频| 国产午夜亚洲精品不卡| 午夜精品在线播放| 国产精品狼人色视频一区| 精品动漫av| 一本一本久久a久久| 亚洲黄色av网站| 亚洲欧美在线综合| 成年人视频网站免费观看| 亚洲女同ⅹxx女同tv| 免费黄色片在线观看| 99国内精品久久久久久久软件| 视频一区在线播放|