忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
楼主: heguangwu

线程性能到达瓶颈,并发还是并行? [复制链接]

论坛徽章:
12
数据库技术版块每日发帖之星
日期:2015-08-06 06:20:002017金鸡报晓
日期:2017-01-10 15:13:29极客徽章
日期:2016-12-07 14:08:02JAVA
日期:2016-10-25 16:01:09luobin
日期:2016-06-17 17:46:362016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之天津
日期:2015-12-16 22:35:03黄金圣斗士
日期:2015-11-24 10:43:13IT运维版块每日发帖之星
日期:2015-10-09 06:20:002015亚冠之广州恒大
日期:2015-09-21 21:40:222015七夕节徽章
日期:2015-08-21 11:06:172017金鸡报晓
日期:2017-02-08 10:39:42
发表于 2015-12-19 14:52 |显示全部楼层
回复 10# heguangwu

这样看就是 pcapThread 抓包的速度跟不上了。

LibPcap这玩意记得在资源不足以再容纳下一段数据时,会丢弃数据。

建个线程池,在loop的时候,拿到数据直接扔到线程池然后再后面的处理,每次也多收些包


   

论坛徽章:
15
2015七夕节徽章
日期:2015-08-21 11:06:172017金鸡报晓
日期:2017-01-10 15:19:56极客徽章
日期:2016-12-07 14:07:30shanzhi
日期:2016-06-17 17:59:3115-16赛季CBA联赛之四川
日期:2016-04-13 14:36:562016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之新疆
日期:2016-01-25 14:01:34IT运维版块每周发帖之星
日期:2016-01-07 23:04:26数据库技术版块每日发帖之星
日期:2016-01-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
发表于 2015-12-19 19:27 |显示全部楼层
我们的问题其实已经解决了,通过调整pcap的参数和进程优先级再加上之前的由互斥锁修改为条件变量、锁的同步范围等方法,现在已经丢包很少了

回复 11# chenxing2


   

论坛徽章:
33
处女座
日期:2014-06-03 14:14:412015亚冠之莱赫维亚
日期:2015-06-23 13:34:21程序设计版块每日发帖之星
日期:2015-08-30 06:20:00程序设计版块每日发帖之星
日期:2015-12-24 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-27 11:07:07程序设计版块每日发帖之星
日期:2016-01-12 06:20:0015-16赛季CBA联赛之北京
日期:2016-01-15 01:01:2115-16赛季CBA联赛之浙江
日期:2016-01-15 22:38:20程序设计版块每日发帖之星
日期:2016-01-18 06:20:00每日论坛发贴之星
日期:2016-01-18 06:20:0015-16赛季CBA联赛之北控
日期:2016-01-30 21:43:01程序设计版块每日发帖之星
日期:2016-02-08 06:20:00
发表于 2015-12-21 22:22
并发和并行难道不是一个意思么? 傻逼

论坛徽章:
0
发表于 2015-12-22 09:16 |显示全部楼层
e_zpoll的方式呢?

论坛徽章:
201
巨蟹座
日期:2013-09-02 09:16:36卯兔
日期:2013-09-02 20:53:59酉鸡
日期:2013-09-05 21:21:45戌狗
日期:2013-10-15 20:51:17寅虎
日期:2013-10-18 21:13:16白羊座
日期:2013-10-23 21:15:19午马
日期:2013-10-25 21:22:48技术图书徽章
日期:2013-11-01 09:11:32双鱼座
日期:2013-11-01 20:29:44丑牛
日期:2013-11-01 20:40:00卯兔
日期:2013-11-11 09:21:32亥猪
日期:2014-09-11 12:30:54
发表于 2015-12-22 09:28 |显示全部楼层
这个有点儿困难吧,需要实际操作先找到瓶颈,再对症下药

论坛徽章:
1
2015年亚洲杯之朝鲜
日期:2015-03-13 13:42:57
发表于 2015-12-22 14:19 |显示全部楼层
“ 最初是一个单线程程序性能到达瓶颈后,通过将整个作业切成一个个小任务,每一个任务执行一个线程,运行结果发现居然和之前差不多”
采用多线程,很多时候是为了防止在某个部分响应时间过长,影响其它的操作。
如果你的程序性能达到了瓶颈,仅仅想依靠多个线程分担来提升性能。这样的想法是不可行的。

论坛徽章:
12
射手座
日期:2014-11-29 19:22:492015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:252015年迎新春徽章
日期:2015-03-04 09:50:282015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之四川
日期:2017-02-07 21:08:57
发表于 2015-12-22 14:19 |显示全部楼层
本帖最后由 yulihua49 于 2015-12-22 14:45 编辑
heguangwu 发表于 2015-12-04 14:50
首先,跟大家分享个陈年趣事:
几年前,我去某软公司应聘,电话面试中与面试官有如下一番对话。 面试官:你 ...


我不知道你说的并发还是并行。从另一个角度说:

你这是想搞并发算法。每种业务不同,设计专门的算法,一是很费力,二是达不到充分运用核,三是不通用,没有普适价值。
现在更多的做法,算法是串行的。把数据分成多组,分发到多台服务器,由多个线程并行处理。
系统由任务分发器(数据分组,负载均衡)------>  多台应用服务器(每台多线程)<------> 数据库(ORACLE+RAC)
这是一个可伸缩结构。如果计算密集型,把应用服务器多配些。如果IO密集型,把数据库配强大些。
如果是网络密集型(数据传输量特大),我们在分发--->服务环节采用压缩/解压缩,把网络瓶颈转化为计算瓶颈,多核多线程并行处理化解之。
对于服务器里的线程来说,所有的线程做所有的事,就是对称多处理,这样负载很容易均衡的。

总结下:
算法串行,处理分段并行,系统可伸缩(每个段的资源可伸缩)。

这本来是很成熟的技术,使用交易中间件进行任务分发,完成map-reduce功能。

论坛徽章:
7
IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-08-29 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2016-02-03 16:35:252016猴年福章徽章
日期:2016-02-18 15:30:34fulanqi
日期:2016-06-17 17:54:25C
日期:2016-10-25 16:08:32
发表于 2015-12-22 14:20 |显示全部楼层
回复 5# heguangwu


    一般来讲使用多线程要依赖于做的操作室计算密集型还是I/O密集型。根据描述,pcapThread似乎是有读写操作,而TcpProcThread/MysqlProcThread其实都是编解码,不牵涉阻塞操作,如果是这样为什么不把他们两个线程合并到一起呢?还是说,每个线程已经绑定到某个cpu核上了?

论坛徽章:
7
IT运维版块每日发帖之星
日期:2015-08-29 06:20:00IT运维版块每日发帖之星
日期:2015-08-29 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2016-02-03 16:35:252016猴年福章徽章
日期:2016-02-18 15:30:34fulanqi
日期:2016-06-17 17:54:25C
日期:2016-10-25 16:08:32
发表于 2015-12-22 14:39 |显示全部楼层
本帖最后由 demilich 于 2015-12-22 14:40 编辑

抛砖引玉一下,尤其如何使用多线程,什么时候用,怎么用,还希望高手指教。

1. 阐述一下你设计过的最满意的并发/并行软件架构。
线程池+多个FIFO队列,这种类型应用范围最广

2. 详细描述一下在多线程/进程/协程方式下遇到过的最难解决的问题以及如何解决的
看似很莫名其妙的问题,最后解决的时候,会发现一般不外乎函数线程不安全/死锁/锁的太大导致性能差

3. 详细讲述一下曾经使用过的最好的并发/并行组件
尝试过TBB和openMP,谈不上更多的经验

4. 对并行/并发的某一个理论进行详细的说明
我的理解:是否要用并发,最简单还是要看应用类型,如果仅仅是单核环境的无阻塞计算密集型的任务,无需并发多线程,光是计算就可以把CPU全部占满;如果CPU是多核,此时是要用多线程的,这样可以调动更多的CPU参与运算。再有就是有阻塞的任务,此时才是并发的用武之地,无论单核多核,多线程都可以提高程序的效率,把CPU充分利用上,因此如何识别阻塞就比较重要了:常见的就是I/O和UI操作 ...

论坛徽章:
222
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2015-12-22 16:56 |显示全部楼层
就你那案例,我觉得线程分太多了,TcpProc和MysqlProc都是些内存运算,应该合到一起。我不知道“rdkafka库”,如果其内部有队列机制,可以异步,那么也不需要这个单独的发送线程。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

久等啦!10张门票开启你的DTCC2017之旅

2017中国数据库技术大会将于2017年5月11-13日如约而至,本届大会以“数据驱动•价值发现”为主题,共设定2大主场和21个技术专场,云集海内外120+位技术大牛,共同探讨Oracle、MySQL、NoSQL、云端数据库、区块链、深度学习等领域的前瞻性热点话题。
即日起,填写DTCC2017会前调查问卷,即有机会赢取价值2600元的大会门票1张!仅限10张!
----------------------------------------
活动截止时间:2017年5月5日统一公布

问卷入口>>
  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP