免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: hy036630
打印 上一主题 下一主题

多线程OR多进程-访存密集型应用 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2011-12-22 16:49 |只看该作者
moseslg 发表于 2011-12-22 15:29
数据大 可以考虑写内存

直接写内存么 不经过缓存?
怎么实现呢?

论坛徽章:
0
32 [报告]
发表于 2011-12-22 16:53 |只看该作者
zylthinking 发表于 2011-12-22 15:39
只是怀疑而已, 你需要验证到底是不是这个原因才能决定下一步啊


我还在想怎么测试呢

论坛徽章:
0
33 [报告]
发表于 2011-12-22 18:53 |只看该作者
凭感觉在说,如果问题都没有看懂请包涵。

引用“然后每个线程查看数据(不会修改)”,以这个为前提条件。

如果业务线程都只是read为什么还要“流数据的指针在不同的处理单元串行流动”串行处理了,从3w/s下降到3k/s也说明了串行处理带来了性能下降。

建议数据单元增加一个处理标志位,所有业务线程都并行的读取数据单元,完成处理后设置处理标志位;数据单元维护线程移除掉已完成处理的数据单元。 标志位根据业务线程个数来设计,比如长度16bit,每个业务线程用一个bit。

论坛徽章:
0
34 [报告]
发表于 2011-12-22 22:16 |只看该作者
ks9960 发表于 2011-12-22 18:53
凭感觉在说,如果问题都没有看懂请包涵。

引用“然后每个线程查看数据(不会修改)”,以这个为前提条件 ...

其实这里用到了流水线的思路
每一个线程是一个流水线结点,单个线程看似是串行,整体上看是并行
每个线程关心不同的地方,做不同的处理,所以用了很多线程read流数据

论坛徽章:
0
35 [报告]
发表于 2011-12-22 22:49 |只看该作者
本帖最后由 xhl 于 2011-12-22 23:08 编辑
hy036630 发表于 2011-12-21 14:58
不好意思 可能我上面没有说清楚
我用的是下面这个环形队列  无锁的实现一个进程读,一个进程写,没有牵涉 ...



先不说性能问题, 你用这样的环形队列实现lockfree肯定有问题, 因为你的push_count, push_index, pop_count, pop_index没有原子操作保护。

多个线程下, 可能会出现问题的。


而且按你的思路, 你的生产消费关系不应该是两边死循环的一个push, 一个get, 这个是非常不经济的。

你应该让让一边一直生产, 一边每间隔一段时间, 取出一批循环处理, 这样才能真正发挥多核心生产线的优势。 你的模型大部分时间多个线程之间都没在做有意义的事情, 都在轮训判断那个队列是否可取或者可以放。

所以我认为你的模型没必要用lockfreequeue, 直接用普通mutex就可以了, 最好做到批量生产, 批量消费, 不要上锁做业务, 把一批做完, 上锁挂一批指针, 取也是, 上锁取一批指针, 然后死循环做业务。

锁的机会很少, 保证多个线程几乎能同跑做业务。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
36 [报告]
发表于 2011-12-22 23:33 来自手机 |只看该作者
本帖最后由 zylthinking 于 2011-12-22 23:37 编辑
xhl 发表于 2011-12-22 22:49 先不说性能问题, 你用这样的环形队列实现lockfree肯定有问题, 因为你的push_count, push_index, po ...
你不说我还没注意到, 你一说我还学到了楼主的处理技巧了, 楼主实现是绝对没有线程安全问题的,至于所谓空转浪费时间, 也不见得是比睡眠唤醒这类通用处理方式差, 相反恐怕还要好些

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
37 [报告]
发表于 2011-12-22 23:42 来自手机 |只看该作者
本帖最后由 zylthinking 于 2011-12-23 08:54 编辑
xhl 发表于 2011-12-22 22:49 先不说性能问题, 你用这样的环形队列实现lockfree肯定有问题, 因为你的push_count, push_index, po ...
你的建议感觉不可行,原因很简单, 楼主是很可能做网络测量的,而你只是个做游戏的, 背景不同, 考虑的侧重点也不一样。

论坛徽章:
0
38 [报告]
发表于 2011-12-23 08:22 |只看该作者
xhl 发表于 2011-12-22 22:49
先不说性能问题, 你用这样的环形队列实现lockfree肯定有问题, 因为你的push_count, push_index, po ...

首先谢谢你的回复啊
环形队列在一个线程读,一个线程写的情况下是没有问题的,linux内核2.6也用到了环形缓冲区。
空转浪费时间(的确是这样的,可以用条件量和唤醒来解决,这个不是主要问题,现在主要问题是性能问题),我是在测试机器上面跑的,就我一个人跑(16个线程的机器,32G内存),我只跑了8个线程,但是性能下降的趋势是每个线程只能处理单线程的1/8。
本来认为这是一个比较好的线程模型,如果能够解决这个性能问题就好了。

论坛徽章:
0
39 [报告]
发表于 2011-12-23 08:52 |只看该作者
看看看看

论坛徽章:
0
40 [报告]
发表于 2011-12-23 09:00 |只看该作者
本帖最后由 xhl 于 2011-12-23 09:19 编辑
hy036630 发表于 2011-12-23 08:22
首先谢谢你的回复啊
环形队列在一个线程读,一个线程写的情况下是没有问题的,linux内核2.6也用到了环形 ...




仔细看了一下那个队列, 貌似没问题。主要是利用数组跟最大长度机制保证了非原子不安全性。

我没太明白LZ你的意思, 你说的性能不行, 到底是啥意思。

我的理解是, 你不是想把一个线程可以做到事情, 拆分成多个功能块, 然后用多个线程流水线的模式去做增加并发效率吗。

那首先你得弄清楚你每个流水线的做到事情是否压力平衡, 如果某个节点特别慢, 再加上你的轮训一个一个事件取出来处理, 势必导致你多线程不如单线程快。

所以我的建议是, 你可以批量做, 第一个线程循环做一批数据, 然以吧这批数据给下个流水线程继续循环做, 自己继续做下批数据, 这样即使你某个节点操作慢, 也没多大关系。

总之, 你应该利用多线程在SMP下利用多核心去最大限度利用CPU做业务。


你说的“空转是浪费时间, 可以用条件变量来解决“, 我认为你的误区就在这里, 首先你是希望让多个线程都跑起来的吧, 不会一个等一个的。
所以我们必须让多个线程都转起来(但不是空转), 转起来是做业务。 条件变量就会让生产者跟消费者之间停等了。

另外, 我只是针对你的流水线模型讨论如何增加效率, 至于你的业务需求是否采用这种模式最理想, 那个就是你们设计的问题了。
其实我觉得如果你都是只读的数据, 就直接用多线程并发, 每个线程独立吧业务从头做到尾, 模型简单, 而且容易实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP