分不多。我就这么多了 希望大家帮我解释下下面的问题
服务器配置
SUSE Linux version 2.6.16.54-0.2.3
Intel(R) Xeon(R) CPU X3320  @ 2.50GHz 4核 4cpu
内存8g内存
jre1.6
测试数据如下:
调整线程池大小,固定为3个线程,低资源线程设置为4,并发4254 总请求382822 错误 0
调整线程池大小,固定为4个线程,低资源线程设置为4,并发5942 总请求534840 错误 0
调整线程池大小,固定为8个线程,低资源线程设置为8,并发5691 总请求512161 错误 0
调整j线程池大小,固定为12个线程,低资源线程设置为12,并发5450 总请求490521 错误 0
调整线程池大小,固定为16个线程,低资源线程设置为16,并发5253 总请求472810 错误 0
调整线程池大小,固定为32个线程,低资源线程设置为16,并发5073 总请求456646 错误 0
调整线程池大小,固定为32个线程,低资源线程设置为32,并发5176总请求465908 错误 0
调整线程池大小,固定为64个线程,低资源线程设置为16,并发5341 总请求480707 错误0
调整线程池大小,固定为64个线程,低资源线程设置为32,并发5095 总请求458544 错误0
调整线程池大小,固定为64个线程,低资源线程设置为64,并发5184 总请求466520 错误0
调整线程池大小,固定为128个线程,低资源线程设置为16,并发5098 总请求458865 错误0
调整线程池大小,固定为128个线程,低资源线程设置为32,并发5116 总请求460485 错误0
调整线程池大小,固定为128个线程,低资源线程设置为64,并发5184 总请求466535 错误0
调整线程池大小,固定为128个线程,低资源线程设置为128,并发5013 总请求477587 错误0
调整线程池大小,固定为200个线程,低资源线程设置为64,并发5097 总请求458745 错误0怎么线程越少 并发性越高呢
3线程与4线程差别巨大,让我怀疑java进程不论开多少线程,都只使用一个cpu..top查看每个cpu都60%的使用率,很是奇怪。谁能解释下。。

解决方案 »

  1.   

    我觉得是和cpu个数有关系的。如果线程数大于cpu个数,性能就几乎不会再有提高了。
      

  2.   

    IBM有篇文章简述线程数,CPU数量(核心)对性能的影响曲线
    不过是一年前看到的,刚去找了找没找到...我仅就我记得的一部分说下IBM根据大量实际任务中的数据画了个曲线图(所统计的程序都是能尽可能多的利用cpu核心的程序)
    在4个核心以内的机器上运行,程序性能几乎与核心数成正比
    而在4-8个核心的机器上,其性能虽然也随核心数量增长而增长,但增长幅度一步步减弱
    直到8个核心及以后,即便再增加核心,性能几乎不会再增长.(一般的程序比这更糟糕)------(以上这部分我记得比较清,下边的比较模糊)-------
    原因是同步等等因素的存在,导致cup核心数量在增长到一定程度后,多线程已经无法完全把cpu的性能发挥出来了
    后来,文章说了一些规则以及一些新的关于锁的算法等等,却依然只说有一定的帮助,但效果不是很明显...------(这部分是个人意见)------
    然后再来说说线程数量的问题
    不同的操作系统所允许一个进程的线程数量不同
    而靠增加线程数量是比较好的完全利用上cpu资源的手段
    但是假设是只有一个核心的cpu,一个程序开单线程就可以完全耗尽cpu资源,那么它开双线程就无法获得性能的提升,甚至由于启动一个线程的开销,性能还会有下降.
    那么,是不是有多少个核心就只开多少线程就是最佳效果,倒也不至于...因为现在的cpu资源,普通程序,单靠一个线程很难利用完...那就可以再多开几个互不影响的线程来压榨cpu,具体多开的比例是多少,可以看看单线程对cpu的利用率以及实际情况而定...
    不过,再来看看IBM的那个曲线图,恐怕也就8个线程的样子(这还得你优化的好),再往后提升就不大了...
    但是,是不是就只能开这么多,那肯定不是
    比如你开启某个服务,给很多人用,你是只允许每次8个人同时使用来获得最优整体性能,还是牺牲一部分整体性能来服务更多的人?只是个人见解...如有错误还请包涵指正
      

  3.   

    程序 --> 操作系统 --> CPU没有用到多核是操作系统的错, VM 不管这个
      

  4.   

    谢谢大家 
    最后优化的结果
    线程池开到3,低资源线程3,然后分配这三个线程,一个接收请求,2个处理请求
    并且jvm 内存只需要256m,young 64m,CMS gc,另外-XX:SurvivorRatio=3这个参数很重要,gc线程11系统达到7159.9/s的承受能力了