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

ChinaUnix.net

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

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

论坛徽章:
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-04 14:50 |显示全部楼层
获奖详情:http://bbs.chinaunix.net/thread-4241378-1-1.html

首先,跟大家分享个陈年趣事:
几年前,我去某软公司应聘,电话面试中与面试官有如下一番对话。 面试官:你了解多线程并发吗?
我:不了解,我之前做业务系统,多线程很大程度上都是委托给容器的……
面试官:我理解了。你不太熟悉并发是吗?
我:是的。
面试官:那我们还是来聊一聊并发吧。
祝大家线程安全。

案列介绍:
      最初是一个单线程程序性能到达瓶颈后,通过将整个作业切成一个个小任务,每一个任务执行一个线程,运行结果发现居然和之前差不多,通过调试发现其中一个任务执行时间过长,再动态调节该任务的线程数,当发现队列过多时启动新线程来同时进行,结果性能上升不大,再定位发现多个线程竞争需要同步访问同一个资源,修改为静态线程池,再由上游哈希将数据放置不同的线程队列中。
      进一步的性能提升发现怎么增大线程数性能都是这样了,再检查发现之前下游任务需要等待上游线程全部完成才能进一步操作,通过查阅资料找到一个算法只要上游有数据就可以开始进行计算,这样到上游全部陆续完成时该步骤也只需要计算少量的数据就可以了。针对此问题您有什么更好的解决方法?


讨论话题:(可任选一个或几个)
1. 阐述一下你设计过的最满意的并发/并行软件架构。
2. 详细描述一下在多线程/进程/协程方式下遇到过的最难解决的问题以及如何解决的
3. 详细讲述一下曾经使用过的最好的并发/并行组件
4. 对并行/并发的某一个理论进行详细的说明


讨论时间:2015年12月15日—2016年1月15日


奖励设置:
活动结束后,我们将选取5位讨论精彩的同学,各送技术图书《七周七并发模型》一本。



作者: (美)Paul Butcher   
译者: 黄炎
丛书名: 图灵程序设计丛书
出版社:人民邮电出版社
ISBN:9787115386069
上架时间:2015-3-13
出版日期:2015 年4月
开本:16开
页码:234
版次:1-1

内容简介:并发编程近年逐渐热起来,Go等并发语言也对并发编程提供了良好的支持,使得并发这个话题受到越来越多人的关注。本书延续了《七周七语言》的写作风格,通过以下七个精选的模型帮助读者了解并发领域的轮廓:线程与锁,函数式编程,Clojure,actor,通信顺序进程,数据级并行,Lambda架构。书中每一章都设计成三天的阅读量。每天阅读结束都会有相关练习,巩固并扩展当天的知识。每一章均有复习,用于概括本章模型的优点和缺陷。


样章试读: 第1章 概述.pdf (1.11 MB, 下载次数: 15)

论坛徽章:
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-17 09:23 |显示全部楼层
这个好像很难,没人回了......

论坛徽章:
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-17 11:38 |显示全部楼层
才看到,居然没有人回答 ... 支持一下,期待大牛回答

论坛徽章:
8
数据库技术版块每日发帖之星
日期:2015-12-22 06:20:00平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2016-01-21 06:20:00IT运维版块每日发帖之星
日期:2016-02-03 06:20:00技术图书徽章
日期:2016-02-03 16:35:252016猴年福章徽章
日期:2016-02-18 15:30:34shanzhi
日期:2016-06-17 17:59:31JAVA
日期:2016-10-25 16:16:28
发表于 2015-12-17 11:58 |显示全部楼层

主要是没用到过

论坛徽章:
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-17 13:52 |显示全部楼层
其实案例我想描述的更清楚一些,因为当时没有时间,现在补充如下:
软件功能描述,通过libpcap抓取Mysql的包,并按照Mysql协议分解后将数据发送到Kafka供后续的分析实现,软件架构如下:
pcapThread---->TcpProcThread----->MysqlProcThread----->KafkaSendThread
各线程作用比较清晰,pcap线程调用libpcap的接口获取抓包,并根据配置排除掉不属于本机或黑名单中的抓包,并将TCP/IP头域将解开有用的放到一个数据结构中
TcpProc线程负责TCP的排序,包括乱序重传等处理,将有效的消息发送到Mysql线程处理,MySQL线程根据MySQL协议提取SQL语句和结果元数据信息组成json格式并调用rdkafka库发送
之前开发为简便实现,各线程之间通信采用出入队列方式,同步采用互斥锁,在QPS比较小的机器上测试正常,但上线到QPS比较大机器上,pcapThread出现丢包且比较严重
同时CPU飚的很高,直接占据单个核的100%,当前通过一些手段,如锁改为条件变量、使用无锁队列等,CPU下降到30%,丢包从30%以上下降到10%以下,但优化还未完成
后续做完后有时间总结一下发到这里更合适一些

论坛徽章:
133
2015年亚洲杯之日本
日期:2015-04-28 13:32:012015年亚洲杯之朝鲜
日期:2015-05-06 10:16:442015年亚洲杯之日本
日期:2015-05-06 10:21:342015年亚洲杯纪念徽章
日期:2015-05-13 17:16:442015亚冠之北京国安
日期:2015-05-13 17:18:292015亚冠之鹿岛鹿角
日期:2015-05-13 17:19:062015亚冠之德黑兰石油
日期:2015-05-27 16:47:402015亚冠之塔什干棉农
日期:2015-05-28 15:24:122015亚冠之卡尔希纳萨夫
日期:2015-06-01 13:52:392015亚冠之柏斯波利斯
日期:2015-06-04 17:37:292015亚冠之阿尔纳斯尔
日期:2015-06-16 11:31:202015亚冠之塔什干火车头
日期:2015-06-23 10:12:33
发表于 2015-12-17 14:20 |显示全部楼层
大牛在下面回复了,可以给大家普及写各位不懂的领域,希望大家能得到更多回复 4# sjf0115


   

论坛徽章:
8
数据库技术版块每日发帖之星
日期:2015-12-22 06:20:00平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2016-01-21 06:20:00IT运维版块每日发帖之星
日期:2016-02-03 06:20:00技术图书徽章
日期:2016-02-03 16:35:252016猴年福章徽章
日期:2016-02-18 15:30:34shanzhi
日期:2016-06-17 17:59:31JAVA
日期:2016-10-25 16:16:28
发表于 2015-12-17 20:46 |显示全部楼层
回复 6# 王楠w_n


    恩  就是希望在这个平台学到自己感兴趣的知识

论坛徽章:
34
CU大牛徽章
日期:2013-04-17 11:10:17CU大牛徽章
日期:2013-09-18 15:26:10狮子座
日期:2013-09-27 17:44:07CU十二周年纪念徽章
日期:2013-10-24 15:41:34射手座
日期:2013-10-24 21:01:23辰龙
日期:2013-12-20 17:07:19狮子座
日期:2014-05-12 11:00:00寅虎
日期:2014-06-04 16:25:27IT运维版块每日发帖之星
日期:2015-08-17 06:20:002015亚冠之首尔
日期:2015-11-04 22:25:43数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00平安夜徽章
日期:2015-12-26 00:06:30
发表于 2015-12-17 21:04 |显示全部楼层
本帖最后由 laputa73 于 2015-12-17 21:08 编辑

一直觉得线程狠复杂,性能也狠差。
基于线程模型的java服务器,跑到500并发已经狠了不起了。
基于事件的就可以轻松上万并发。但是回调写起来让头大。
最早接触协程是通过erlang.这个对后续的影响很大。
但是erlang的学习门槛确实比较高。
后来又陆续看了lua的协程和perl的coro,python的stackless和gevent.
感觉协程确实是个好东西,高大上,但是组件级别的支持还是比较别扭。
golang一出,语言级支持协程并发,而且还同时支持多核并行。
没有什么可犹豫的,直接拥抱go吧。
java的同学,估计转scala比较容易。

论坛徽章:
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-18 12:56 |显示全部楼层
回复 5# heguangwu


看描述,pcapThread用来抓包,然后还处理。当QPS高的时候,处理慢了,丢包正常。

建议 抓包和处理数据分开。

pcapThread抓包后,直接发到kafka,然后多个消费者取包,然后处理,再继续后面的处理,根据量还可增加消费者

如:

宝突然增加的时候,kafka也可以积压存储,保证丢包率比较低
pcapThread(抓包)  --> kafka   --> 增加一个程序(根据配置排除掉不属于本机或黑名单中的抓包,并将TCP/IP头域将解开有用的放到一个数据结构中) --> kafka --> TcpProcThread --> kafka -->MysqlProcThread -->KafkaSendThread

论坛徽章:
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-18 13:32 |显示全部楼层

pcapThread并没有做业务处理,只是做了一些及其简单的过滤,如去掉了长度为0的包,这个不是丢包的原因,因为哪怕我直接将数据放入下一个线程的队列同样会丢包
回复 9# chenxing2


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP