服务端事件组成
网络io事件
定时事件
信号事件
reator 使用非阻塞io
libevent
和
libev
都是
c
语言实现的异步事件库;通过注册异步事件,库检测事件触发,从而库根据
发生事件的先后顺序,调用相应回调函数进行处理;
事件包括:网络
io
事件,定时事件,信号事件;
事件循环:等待并分发事件;用于管理事件;
libevent
和
libev
主要封装了异步事件库与操作系统的交互;让用户不用关注平台的差异,只需着
手事件的具体处理;
libevent
和
libev
对
window
支持都比较差,因此产生
libuv
库,
libuv
基于
libev
,但是
window
上封装了
iocp
;
node.js
基于
libuv
;
libevent 缺点:多线程支持不好,全局变量使用过多
libev 使用callba携带上下文
定时器 最小堆 libevent二叉树,libev 四叉树 定时事件超过5000+,5%提升,go语言 最小堆 四叉树
libevent http dns openssl 杂糅在具体网络封装中,性能< libev 只关注网络事件的封装、封装和不封装其他协议
-1 = accept();会导致epoll listen fd一直读事件
errno = EFOILE fd 数量达到上限
解决方案
方案1、设置fd数量 ulimit
方案2、在accept之前,先创建一个空fd,accept返回-1时,close 空fd,再调用accept并设置为clientfd, 关闭clientfd 再创建空fd
方案3、限制链接数小于硬件设置的fd数量