免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5053 | 回复: 23
打印 上一主题 下一主题

我请教一下提高epoll 工作性能的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-02 11:41 |只看该作者 |倒序浏览
我认为 epoll 可以看作一个服务。  当逻辑thread 需要发起连接的时候,我们可以用消息队列的形式 将消息传给epoll 服务。 当epoll 开始处理队列里面的请求

有的可能是 读某个fd 的操作, 有的是写操作。 有的是删除, 有的是新添加新fd.


当队列里面处理完以后开始 epoll_wait 获取出event.
此时我们可以直接进行read 和write 操作。 并将取到的内容 放到另一个消息队列里面去。 逻辑thread 处理这些消息。 当需要断开的时候,由逻辑thread  通知
epoll 服务close 掉这个fd.


伪代码就是

for( ;; )
{

     process_deque();  

     epoll_wait();

     for (int i =0; i < events; ++i)
    {
             readwritedata();
             sendtodeque();
    }

}


但是我感觉这个逻辑不太好。 因为process_deque() 会是品竟

但是当
     process_deque();   thread1


thread2
  epoll_wait();

     for (int i =0; i < events; ++i)
    {
             readwritedata();
             sendtodeque();
    }


分开处理的话,又有一个问题, 假设正在readwritedata 操作的时候
逻辑要求主动短开的话,导致creash ...


还有的办法就是加锁, 我感觉会非常麻烦

论坛徽章:
0
2 [报告]
发表于 2009-06-02 13:41 |只看该作者
原帖由 benjiam 于 2009-6-2 11:41 发表
我认为 epoll 可以看作一个服务。  当逻辑thread 需要发起连接的时候,我们可以用消息队列的形式 将消息传给epoll 服务。 当epoll 开始处理队列里面的请求

有的可能是 读某个fd 的操作, 有的是写操作。 有的 ...



什么原因导致的crash?

论坛徽章:
0
3 [报告]
发表于 2009-06-02 14:25 |只看该作者
假设 逻辑thread 收到定时器消息, 发送close fd 消息给epoll 服务

当thread1 希望close fd 的时候

thread2 可能正在read,  当close 发生在 read 的之前, 可能会crash.

论坛徽章:
0
4 [报告]
发表于 2009-06-02 14:36 |只看该作者
原帖由 benjiam 于 2009-6-2 14:25 发表
假设 逻辑thread 收到定时器消息, 发送close fd 消息给epoll 服务

当thread1 希望close fd 的时候

thread2 可能正在read,  当close 发生在 read 的之前, 可能会crash.

这是系统结构设计的问题。
还从epoll的底层开始编码,有那么多的线程库可以使用。
以上。

论坛徽章:
0
5 [报告]
发表于 2009-06-02 15:08 |只看该作者
原帖由 benjiam 于 2009-6-2 14:25 发表
假设 逻辑thread 收到定时器消息, 发送close fd 消息给epoll 服务

当thread1 希望close fd 的时候

thread2 可能正在read,  当close 发生在 read 的之前, 可能会crash.


close fd之后,read fd会返回-1,不会crash吧?recv()有个专门的errno: EBADF来描述这个错误。

论坛徽章:
0
6 [报告]
发表于 2009-06-02 15:50 |只看该作者
原帖由 wwwsq 于 2009-6-2 15:08 发表


close fd之后,read fd会返回-1,不会crash吧?recv()有个专门的errno: EBADF来描述这个错误。

我记得read 或者write 一个close的fd 会crash

论坛徽章:
0
7 [报告]
发表于 2009-06-02 16:18 |只看该作者
原帖由 benjiam 于 2009-6-2 15:50 发表

我记得read 或者write 一个close的fd 会crash



你是在什么平台下进行工作的?在windows和linux下应该都没有这个问题。

你可以做一下测试。

论坛徽章:
0
8 [报告]
发表于 2009-06-02 16:37 |只看该作者
如果每秒钟的请求数量比较大, 这种线程-队列的结构性能很差, 因为线程切换太多。
可以将 不需要阻塞的操作,全部放到epoll的同一线程里面。

建议阅读:
High-Performance Server Architecture
http://pl.atyp.us/content/tech/servers.html

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
9 [报告]
发表于 2009-06-02 18:46 |只看该作者
原帖由 benjiam 于 2009-6-2 15:50 发表

我记得read 或者write 一个close的fd 会crash

忽略掉一个信号SIGPIPE

论坛徽章:
0
10 [报告]
发表于 2009-06-02 21:24 |只看该作者
SIGPIPE 对的, 我记得是有一个信号默认会停止 程序的。

除此以外还有一个问题

当线程1  进行close 的时候。
线程2     进行了一次读取。  假设  读取先完成。

close 完成以后 应该发一个 close 完成的消息给 逻辑线程
而线程2  应该发一个读到数据的消息给逻辑线程。

但是2个线程同时进入一个消息队列的顺序是不可预测的。很有可能逻辑线程会
先收到某个fd 关闭完成。 此时逻辑线程 进行资源清理。 完成后,又接到了
线程2 收到数据的消息。  
逻辑上就是混乱的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP