免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4617 | 回复: 11
打印 上一主题 下一主题

多cpu环境下,多线程没有任何性能增益? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-14 09:49 |只看该作者 |倒序浏览
我们是solaris 8, 4 cpu, 需要进行xml文件的解析工作。 发现如果是单线程的解析一个文件,花费40秒,采用3个线程,每个线程分别解析不同的xml文件,此时cpu占用始终保持在75%,感觉三个cpu都满负荷运作了,三个xml同时解析完成,但是完成的时间竟然比40*3秒还要多,说明还没有一个线程串行的处理这三个xml文件来的快。 由于三个线程分别处理三个不同的xml文件,所以每个线程其实都是相对独立的,互相之间不用什么锁之类的调用,也都是使用各自的局部变量的,解析xml采用SAX方式,查看sar,发现在多线程处理中也没有明显的io争用问题。 接着试验三个进程,每个进程处理一个xml文件,cpu占用也是75%, 三个文件几乎同时解析完成,只花费了40秒,为何多进程可以那么快,而多个线程却不仅没有任何性能方面的提升,反而变慢了?  重复试验了绑定线程和非绑定线程,发现情况也一样,没有任何改善, 明明多个cpu都占用了,而且都满负荷的在解析文件了,为什么就一点提升都没有,实在弄不明白,这里的大虾帮忙分析一下看看,是什么原因吧。多谢。

论坛徽章:
0
2 [报告]
发表于 2005-10-14 09:57 |只看该作者

多cpu环境下,多线程没有任何性能增益?

CPU干活不光是做那点,I/O开销也占点资源,多CPU也得有并行环境配合才能发挥多CPU功能。

论坛徽章:
0
3 [报告]
发表于 2005-10-14 10:43 |只看该作者

多cpu环境下,多线程没有任何性能增益?

对,但是如果I/o成为了瓶颈的话,多个进程解析也应该同样不会快的,但发现多进程解析,cpu同样占用75%, 速度就提升了3倍了。 而且我的线程那么独立,又没有全局内存的访问或者锁之类的等待开销,实在想不明白,为什么多线程和多进程差别会那么大? 到底cpu的耗用在干什么了?

论坛徽章:
0
4 [报告]
发表于 2005-10-14 11:04 |只看该作者

多cpu环境下,多线程没有任何性能增益?

我在每个线程的处理中,会new一个Handler对象,该对象中保存了std::map,map主要用来保存解析文件中锁提取到的实际数据的。 每当文件处理结束后,需要delete这个Hanlder对象,发现单线程情况下,delete花费2秒,开两个线程并行处理的话,delete花费了5秒,而三个线程并行处理,完成delete花费了7秒,简直就感觉多线程并发处理其实还是在排队的,而不是真正在并行的delete。 但我根本没有上锁排队,而且它们是在每个线程中new出来的对象,delete的时候难道solaris内部排队处理的? 即时是排队处理的话,也应该是一个文件处理完了,再处理另一个,那么每个线程完成delete的时间点应该是不一样的,而目前实际情况是所有线程都在几乎同一时间点完成delete语句,但是时间却延长了n倍(n的线程数),怎么回事啊?

论坛徽章:
0
5 [报告]
发表于 2005-10-14 11:24 |只看该作者

多cpu环境下,多线程没有任何性能增益?

[quote]原帖由 \"mailme365\"]我们是solaris 8, 4 cpu, 需要进行xml文件的解析工作。 发现如果是单线程的解析一个文件,花费40秒,采用3个线程,每个线程分别解析不同的xml文件,此时cpu占用始终保持在75%,感觉三个cpu都满负荷运作了,三个xml

论坛徽章:
0
6 [报告]
发表于 2005-10-14 11:40 |只看该作者

多cpu环境下,多线程没有任何性能增益?

多谢楼上的回答,但是我们这边没有solaris10的环境,目前工作站也不多,都在做开发使用的,我不能换成solaris10的。 \r\n我再做一个试验工程看看,弄的再简单一些,看看多线程处理的性能变化情况

论坛徽章:
0
7 [报告]
发表于 2005-10-14 13:23 |只看该作者

多cpu环境下,多线程没有任何性能增益?

原帖由 \"mailme365\" 发表:\n多谢楼上的回答,但是我们这边没有solaris10的环境,目前工作站也不多,都在做开发使用的,我不能换成solaris10的。 \r\n我再做一个试验工程看看,弄的再简单一些,看看多线程处理的性能变化情况
\r\n\r\nSolaris 10 可以装到x86上啊。\r\n\r\n参加周六的技术沙龙就有Opensolaris的源代码和安装盘。\r\n\r\n\r\n当然,简化你的测试程序很有必要,我觉得是你的程序的问题。

论坛徽章:
5
荣誉会员
日期:2011-11-23 16:44:17CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-09-18 15:15:45未羊
日期:2014-02-25 14:37:19射手座
日期:2014-12-26 22:55:37
8 [报告]
发表于 2005-10-14 14:37 |只看该作者

多cpu环境下,多线程没有任何性能增益?

XML文件能有多大?会遇到IO瓶颈?\r\n看看三个线程之间是不是在互相等或者争用什么。

论坛徽章:
0
9 [报告]
发表于 2005-10-14 15:47 |只看该作者

多cpu环境下,多线程没有任何性能增益?

每个XML文件大约为8M, 使用xerces进行XML文件的SAX解析。 \r\n我也想不出会有什么I/O操作,也就是读个XML文件,然后拷贝到自己的map中,由于文件特别大,线程在处理中会占用很多cpu,主要进行赋值,字符串比较之类的调用。 \r\n我实在看不出各个线程之间存在什么等待或争用的东西,再仔细看了一下,各个线程之间唯一公用的,就是一些全局const string,这些全局string 常量是在解析xml文件时比较element的,这个也是后来为了改进性能,避免使用字符串常量而多次构造,析构而修改成全局对象的,而且在修改以前,直接使用常量字符串比较,多线程也照样是单线程处理性能的n倍。 其他都没有用到什么全局量,都是局部或线程中new的。 \r\n还有一个变量,在每个线程中创建的,它是:SAX2XMLReader* parser = XMLReaderFactory::createXMLReader(); \r\n这个对象是xml解析器创建的,它应该是动态创建的吧。我现在在网上查,看看是否xml解析器内部使用了锁等资源,或者是这里的createXMLReader()方法内部做了什么设定之类的,但查了一下没有查出什么有用的东西。

论坛徽章:
0
10 [报告]
发表于 2005-10-14 15:56 |只看该作者

多cpu环境下,多线程没有任何性能增益?

原帖由 \"Solaris12\" 发表:\n\r\n\r\nSolaris 10 可以装到x86上啊。\r\n\r\n参加周六的技术沙龙就有Opensolaris的源代码和安装盘。\r\n\r\n\r\n当然,简化你的测试程序很有必要,我觉得是你的程序的问题。
\r\n\r\n嗯,我是准备做一个简化的测试程序,分析一下究竟慢在哪里。 \r\n\r\n另:安装在x86上的内核行为与安装在sparc上的是一样的吗? \r\n我们的程序在sparc上编译通过,应该不能直接拿到x86的solaris上运行吧,而且即时建立了编译环境,重新编译后,运行效果也不一样的, x86的机器我们这边没有多cpu的,反映不出问题啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP