- 论坛徽章:
- 0
|
1. 如果你做的是内部服务. 那就让客户端主动发心跳. 服务器只定时检查客户端是不是丢失心跳就OK了.
很明显,对外开放服务的系统,这种方式是不保险的。
2. 如果你做的是开放平台. 那么就模仿libevent. 给每个连接作一个类时器. 规定每个socket的空闲时间.
定时器就由select来驱动.
高性能网络用epoll,虽然可以设计成不需要太多定时器,但我认为select 最好不用。
谁给你说的epoll没法超时返回?
首先你思路混乱阿伙计。
给你说下apache 的keepalvie的实现,在客户端keep-alvie的时候,apache需要检测客户端是否超时,和你的需求一样。
首先在你的epoll线程 将你的句柄在epoll_wait的时候设置上超时,如1s,此处就是为了让他超时,超时干嘛尼,就是为了
让它有功夫检测一个存储超时时间项目的队列,这个队列里有客户端句柄和其对应的expire time,到这里你也该想到这个队列的时间应该有人维护,
谁哪?就是你处理用户请求的线程,在那里你可以根据处理情况,重设或者删除队列里对应你的超时项。
这样apache就用一个epoll线程兼职维护了所有的keep-alive连接,这样做也是为了不让这些连接占用较多的工作线程。
这个地方是基本不影响接收连接的。因为你的工作线程参与维护这个队列,所以对这个队列的操作是需要加锁的。
在有超时项目的时候,apache是将该项目从队列删除后,将句柄交给工作线程处理的,这样是尽量避免epoll线程受
影响,也符合设计思路。
上面说的是apache 的实验版epoll mpm的实现。
你的问题似乎是在一个线程做了这所有的事情,所以感觉没法办。
..... 不是非常明白你的意思。将你的句柄在epoll_wait的时候设置上超时,如1s,此处就是为了让他超时???
我还是说一下 我的做法吧
epoll_wait 返回, 这个时候你需要做2件事情,
1 处理epoll_wait返回的有效事件,
2 处理没有返回事件的socket, 处理超时的情况,主动断开连接
那么如何查询没有返回事件的socket呢?
很显然,你在加入到epoll 之前就需要首先将时间点和socket记录下来,加入一个队列X,以便以后遍历检查。
效率呢?
非常低, X 需要加锁的情况,
1 新连接建立
2 断开连接
3 定时检查超时。
再仔细分析一下性能。
epoll 返回回来的结果,是单线程处理还是多线程处理? 每个线程做什么事情?
epoll_wait() ;
返回一个结果集。假设有100个结果
A 方案 是每个线程取一个返回记录处理, 另外一个单独线程处理超时扫描
b 方案 还是一个线程逐一取了结果进行处理,最后做超时扫描。
很明显A效率高,B方案的效率其实就是个单线程,即使你cpu可以跑的线程数目再多也没办法发挥效率。
但是很明显A方案有可能在队列X争锁的情况出现,效率反而可能低。
所以如果能够让socket 自己超时以结果集返回,那么就不会出现争锁的情况了,也就没有必要保存X队列了,
效率会高很多,所以我希望的是这种方式。
而我开始表述的方式就是在没有队列X的情况下,能否做到我的要求? 很明显没有队列X,就无法扫描。epoll_wait也
只会返回个0 对我们没有帮助 |
|