免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7885 | 回复: 5

[C] libevent v2用线程锁效率比pipe通知方式更高么? [复制链接]

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
发表于 2012-11-09 10:18 |显示全部楼层
libvent 1.4.x是非线程安全的,要跨线程执行event_add,会有问题。
因此传统做法是通过pipe来通知宿主线程执行event_add操作。

libevent 2.0.x通过线程锁做到了线程安全,可以跨线程执行event_add。

感觉pipe的开销比线程锁要大一些,我在考虑是否将pipe通知的做法改为libevent 2.0.x内置的线程锁方式。
希望有这方面经验的朋友分享一下经验,谢谢!

论坛徽章:
0
发表于 2012-11-09 16:24 |显示全部楼层
在多线程中libvent 1.4.x,使用管道的那种解决方法,之前我研究过,
是非常巧妙,避免了锁,没有显示的线程同步,但是有一个缺点就是:
如果一个线程要注册读或写事件,先要对管道进行读写用来产生一个事件,
这样,中间有延时,特别是并发高的时候. 这种解决方法,必须配合线程池一起使用.

libevent 2.0.x没仔细研究过,不知道你说的线程锁是不是显示用了pthread mutex之类的实现同步操作,
不知道有没有1.4.x的巧妙.

多线程,如果锁越少,效率相对高,但是也得考虑对业务产生影响,比如我前面说的延时。


论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
发表于 2012-11-09 17:45 |显示全部楼层
回复 2# osmanthusgfy

libevent 2.0.x对event_add等调用会做加锁保护的,使用的是线程互斥锁(thread mutex),以支持跨线程调用。

论坛徽章:
0
发表于 2012-11-09 22:03 |显示全部楼层
我扫了一下libevent 2.0.20的源码, 发现event_base已经添加了一个th_base_lock字段用来同步所有操作:
add, dell, event_lopp等. 相对无锁的操作,加锁会影响多线程并发的性能,特别是对单进程多线程模型的服务器.

所以,如果用libvent 1.4.x,配合管道,虽然在连接数多的时候,业务处理可能有延时现象,但由于只需要在event_lopp
的时候加锁,event_add不需要,加锁的次数少,效率要高一些。具体用法可以参考SPServer的实现.

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
发表于 2012-11-10 00:02 |显示全部楼层
回复 4# osmanthusgfy
LS说得很有道理。
pipe的write和read操作会进入内核态,存在用户态和内核态切换,我觉得应该比线程锁消耗要大一些。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2012-11-10 11:23 |显示全部楼层
为啥不是每个线程一个libevent base呢.

memcached/apache的多线程架构思路就OK了,

memcached:监听线程base只负责监听到连接后后dispatch到逻辑线程池(这里pipe+write 1 byte), 管理线程负责线程池增减回收控制, 逻辑线程池每个线程一个base自己掌管自己的I/O. (实际上memcached没有独立的监听线程, 但apache有)

apache: MPM模式, 和memcached的唯一区别就是有独立的监听线程, 并且逻辑线程池是抢夺mutex+cond队列的, 监听线程accept后推向队列, 并且有一个优点就是队列满了, 监听线程可以挂起在cond, 达到了非常简单控制连接数以及维持服务端负载稳定的目的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年8月17日~19日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP