`
weiyinchao88
  • 浏览: 1187338 次
文章分类
社区版块
存档分类
最新评论

epoll高性能网络服务

 
阅读更多

Q:网络服务器的瓶颈在哪?
A:IO效率。

在大家苦苦的为在线人数的增长而导致的系统资源吃紧上的问题正在发愁的时候,Linux2.6内核中提供的SystemEpoll为我们提供了一套完美的解决方案。传统的select以及poll的效率会因为在线人数的线形递增而导致呈二次乃至三次方的下降,这些直接导致了网络服务器可以支持的人数有了个比较明显的限制。

自从Linux提供了/dev/epoll的设备以及后来2.6内核中对/dev/epoll设备的访问的封装(SystemEpoll)之后,这种现象得到了大大的缓解,如果说几个月前,大家还对epoll不熟悉,那么现在来说的话,epoll的应用已经得到了大范围的普及。

那么究竟如何来使用epoll呢?其实非常简单。
通过在包含一个头文件#include以及几个简单的API将可以大大的提高你的网络服务器的支持人数。

首先通过create_epoll(intmaxfds)来创建一个epoll的句柄,其中maxfds为你epoll所支持的最大句柄数。这个函数会返回一个新的epoll句柄,之后的所有操作将通过这个句柄来进行操作。在用完之后,记得用close()来关闭这个创建出来的epoll句柄。

之后在你的网络主循环里面,每一帧的调用epoll_wait(intepfd,epoll_eventevents, intmaxevents,inttimeout)来查询所有的网络接口,看哪一个可以读,哪一个可以写了。基本的语法为:
nfds=epoll_wait(kdpfd,events,maxevents,-1);
其中kdpfd为用epoll_create创建之后的句柄,events是一个epoll_event*的指针,当epoll_wait这个函数操作成功之后,epoll_events里面将储存所有的读写事件。max_events是当前需要监听的所有socket句柄数。最后一个timeout是 epoll_wait的超时,为0的时候表示马上返回,为-1的时候表示一直等下去,直到有事件范围,为任意正整数的时候表示等这么长的时间,如果一直没有事件,则范围。一般如果网络主循环是单独的线程的话,可以用-1来等,这样可以保证一些效率,如果是和主逻辑在同一个线程的话,则可以用0来保证主循环的效率。

epoll_wait范围之后应该是一个循环,遍利所有的事件:
for(n=0;n<nfds;++n){
if(events[n].data.fd==listener){//如果是主socket的事件的话,则表示有新连接进入了,进行新连接的处理。
client=accept(listener,(structsockaddr*)&local,
&addrlen);
if(client<0){
perror("accept");
continue;
}
setnonblocking(client);//将新连接置于非阻塞模式
ev.events=EPOLLIN|EPOLLET;//并且将新连接也加入EPOLL的监听队列。
注意,这里的参数EPOLLIN|EPOLLET并没有设置对写socket的监听,如果有写操作的话,这个时候epoll是不会返回事件的,如果要对写操作也监听的话,应该是EPOLLIN|EPOLLOUT|EPOLLET
ev.data.fd=client;
if(epoll_ctl(kdpfd,EPOLL_CTL_ADD,client,&ev)<0){
// 设置好event之后,将这个新的event通过epoll_ctl加入到epoll的监听队列里面,这里用EPOLL_CTL_ADD来加一个新的 epoll事件,通过EPOLL_CTL_DEL来减少一个epoll事件,通过EPOLL_CTL_MOD来改变一个事件的监听方式。
fprintf(stderr,"epollsetinsertionerror:fd=%d0,
client);
return-1;
}
}
else//如果不是主socket的事件的话,则代表是一个用户socket的事件,则来处理这个用户socket 的事情,比如说read(fd,xxx)之类的,或者一些其他的处理。
do_use_fd(events[n].data.fd);
}

对,epoll的操作就这么简单,总共不过4个API:epoll_create,epoll_ctl,epoll_wait和close。
如果您对epoll的效率还不太了解,请参考我之前关于网络游戏的网络编程等相关的文章。

分享到:
评论

相关推荐

    epoll高性能网络编程

    linux epoll 网络编程教程,不可多得的教程。

    使用epoll进行高性能网络编程

    使用epoll进行高性能网络编程.pdf

    高性能网络设计-网络编程(网络io与select、poll、epoll,react).zip

    高性能网络设计-网络编程(网络io与select、poll、epoll,reactor原理与实现、http服务器实现、websocket协议与服务器实现)与网络原理(服务器百万并发,网络协议栈,UDP可靠传输协议QUIC),协程框架NtyCo的实现....

    Herm(一套快速开发高性能的网络应用的C++库)

    Herm是一套快速开发高性能的网络应用的C++库。比如开发网络游戏、即时通信、流媒体、文件下载、P2P等基于TCP/IP网络应用。 Herm包括三个组件: (1)Utilities 最基础的组件,提供线程、一读一写线程不加锁的...

    实战Nginx:取代Apache的高性能Web服务器 中文版

    nginx是俄罗斯人igor sysoev编写的一款高性能的http和反向代理服务器。nginx选择了epoll和kqueue作为网络i/o模型,在高连接并发的情况下,内存、cpu等系统资源消耗非常低,运行稳定。  本书系统地介绍了nginx与php...

    C语言实现的支持高并发、超高性能Web服务器源码.rar

    C语言实现的支持高并发、超高性能Web服务器源码,可以编译运行,使用高性能HTTP解析器fasterhttp作为其解析核心,在开启Keep-Alive和gzip压缩时(现代浏览器默认开启)性能比nginx约快3倍。 hetao功能: * 支持主流...

    百万级高并发WebRTC流媒体服务器设计与开发课程

    第7章 libevent实现高性能网络服务器 第8章 TCP/IP详解 第9章 UDP/RTP/RTCP 详解 第10章 WebRTC协议 第11章 SDP协议与WebRTC媒体协商【需花大力气牢牢掌握】 第12章 各流媒体服务器的比较 第13章 mediasoup服务器的...

    linux 高性能服务器编程

    Linux网络编程 TCP/IP基础知识 涵盖socket epoll 多线程

    socket网络编程-epoll-水平触发和边缘触发源码

    socket网络编程-epoll-水平触发和边缘触发源码。 (1)I/O多路复用技术用于监控多个TCP连接上的数据收发,而epoll就是一种在Linux上使用的I/O多路复用并支持高并发的典型技术。传统的select、poll也是I/O多路复用...

    Linux高性能服务器编程

    内容简介《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,由资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐释了编写高性能Linux服务器应用的方法、...

    实战Nginx:取代Apache的高性能Web服务器

     Nginx(“engine x”)是俄罗斯人Igor Sysoev编写的一款高性能HTTP 和反向代理服务器。Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,Nginx是Apache服务器不错的替代品,它能够支持高达50000个...

    论文研究-一种Linux环境下搭建高性能网络库交互平台的方法 .pdf

    一种Linux环境下搭建高性能网络库交互平台的方法,王文明,高经纬,本项目重点阐述了基于Linux的epoll技术的网络库交互平台的设计方案,通过详细对比不同操作系统和不同I/0多路复用技术的效率,选择epoll

    实战Nginx:取代Apache的高性能Web服务器.part1.rar

    Nginx是俄罗斯人Igor Sysoev编写的一款高性能的HTTP和反向代理服务器。Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,内存、CPU等系统资源消耗非常低,运行稳定。 本书系统地介绍了Nginx与PHP、...

    实战Nginx:取代Apache的高性能Web服务器.part2.rar

    Nginx是俄罗斯人Igor Sysoev编写的一款高性能的HTTP和反向代理服务器。Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,内存、CPU等系统资源消耗非常低,运行稳定。 本书系统地介绍了Nginx与PHP、...

    leetcode题目汇总.docx

    epoll作为linux下高性能网络服务器的必备技术至关重要,nginx、redis、skynet和大部分游戏服务器都使用到这一多路复用技术。 因为epoll的重要性,不少游戏公司在招聘服务端同学时,会问及epoll相关的问题。比如...

    《实战Nginx:取代Apache的高性能Web服务器》PDF 下

    Nginx是俄罗斯人Igor Sysoev编写的一款高性能的HTTP和反向代理服务器。Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,内存、CPU等系统资源消耗非常低,运行稳定。  本书系统地介绍了Nginx与PHP...

    高性能跨平台网络通信框架.rar

    高性能跨平台网络通信框架代码,支持linux,windows,macos 等操作系统,可以编译使用, 描述 - ***Server*** 基于IOCP / EPOLL通信模型,并结合缓存池、私有堆等技术实现高效内存管理,支持超大规模、高并发通信...

    libevent for qt网络模块,直接替换qt的select模型,支持epoll,select,pool.使用非常简单,无需修改以前的代码结构

    最近在开发im服务器 需要大并发链接 QT默认的是使用select模型的 这种轮询方式非常慢 在高并发连接 我们需要epoll才能发挥linux服务器的性能 而且使用简单 整个服务端代码架构无需修改 直接可以使用 只要在 main...

    实战Nginx_取代Apache的高性能Web服务器].张宴.扫描版

    Nginx是俄罗斯人Igor Sysoev编写的一款高性能的HTTP和反向代理服务器。Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,内存、 CPU等系统资源消耗非常低,运行稳定。  本书系统地介绍了Nginx与PHP...

Global site tag (gtag.js) - Google Analytics