Chinaunix

标题: 多cpu环境下,多线程没有任何性能增益? [打印本页]

作者: mailme365    时间: 2005-10-14 09:49
标题: 多cpu环境下,多线程没有任何性能增益?
我们是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都占用了,而且都满负荷的在解析文件了,为什么就一点提升都没有,实在弄不明白,这里的大虾帮忙分析一下看看,是什么原因吧。多谢。
作者: race    时间: 2005-10-14 09:57
标题: 多cpu环境下,多线程没有任何性能增益?
CPU干活不光是做那点,I/O开销也占点资源,多CPU也得有并行环境配合才能发挥多CPU功能。
作者: mailme365    时间: 2005-10-14 10:43
标题: 多cpu环境下,多线程没有任何性能增益?
对,但是如果I/o成为了瓶颈的话,多个进程解析也应该同样不会快的,但发现多进程解析,cpu同样占用75%, 速度就提升了3倍了。 而且我的线程那么独立,又没有全局内存的访问或者锁之类的等待开销,实在想不明白,为什么多线程和多进程差别会那么大? 到底cpu的耗用在干什么了?
作者: mailme365    时间: 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的线程数),怎么回事啊?
作者: Solaris12    时间: 2005-10-14 11:24
标题: 多cpu环境下,多线程没有任何性能增益?
[quote]原帖由 \"mailme365\"]我们是solaris 8, 4 cpu, 需要进行xml文件的解析工作。 发现如果是单线程的解析一个文件,花费40秒,采用3个线程,每个线程分别解析不同的xml文件,此时cpu占用始终保持在75%,感觉三个cpu都满负荷运作了,三个xml
作者: mailme365    时间: 2005-10-14 11:40
标题: 多cpu环境下,多线程没有任何性能增益?
多谢楼上的回答,但是我们这边没有solaris10的环境,目前工作站也不多,都在做开发使用的,我不能换成solaris10的。 \r\n我再做一个试验工程看看,弄的再简单一些,看看多线程处理的性能变化情况
作者: Solaris12    时间: 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当然,简化你的测试程序很有必要,我觉得是你的程序的问题。
作者: wolfop    时间: 2005-10-14 14:37
标题: 多cpu环境下,多线程没有任何性能增益?
XML文件能有多大?会遇到IO瓶颈?\r\n看看三个线程之间是不是在互相等或者争用什么。
作者: mailme365    时间: 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()方法内部做了什么设定之类的,但查了一下没有查出什么有用的东西。
作者: mailme365    时间: 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的,反映不出问题啊
作者: wolfop    时间: 2005-10-14 16:12
标题: 多cpu环境下,多线程没有任何性能增益?
你用了STL来支持的?STL和线程的配合问题,GOOGLE一下吧。
作者: mailme365    时间: 2005-10-14 17:48
标题: 多cpu环境下,多线程没有任何性能增益?
对,我是使用stl的, stl和线程配合有问题吗?\r\n我前几天搜索到过,说是stl的string在多线程的拷贝中会有比较大的开销,需要设置编译开关-xarch=v8,然后再编译,可以用cas来代替什么内部的lock之类的,但是首先我并不理解为何stl的string会有线程问题,再次,我这么修改了重新编译后,性能也没有任何改善。 \r\nwolfop能否详细说一下吗? 




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2