免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7690 | 回复: 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, 达到了非常简单控制连接数以及维持服务端负载稳定的目的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP