目前的一个理论是线程过多,我们应该尝试减少并发执行线程的数量。只有一个主线程池,具有 3000 个线程,并且有一个与之配合的 WorkManager(这是 Java EE - Glassfish)。在任何给定时刻,大约有 620 个单独的网络 IO 操作需要同时进行(java.NIO 的使用也不是一个选项)。此外,还有大约 100 个没有涉及 IO 并且也在并行执行的操作。
这种结构不高效,我们想知道它是否真正造成了损害,或者只是糟糕的做法。原因是系统中的任何更改都相当昂贵(以人力投入为代价),因此我们需要一些问题的证明。
现在我们在思考线程上下文切换是否是原因,考虑到线程远远超过所需的并发操作。查看日志,我们看到平均每秒钟有 14 个不同的线程执行。如果考虑到存在两个CPU(见下文),那么是每个 CPU 上的 7 个线程。这听起来不像太多,但我们想要验证这一点。
所以 - 我们可以排除上下文切换或线程过多的问题吗?
一般细节:
- Java 1.5(是的,它很老),运行在CentOS 5、64位、Linux内核2.6.18-128.el5上
- 机器上只有一个Java进程,没有其他东西。
- 虚拟机下有两个CPU。
- 8GB RAM
- 我们不能在机器上运行分析器。
- 我们不能升级Java,也不能升级操作系统。
生产服务器工作量的50%:http://pastebin.com/GE2kGLkk
生产服务器工作量的34%: http://pastebin.com/V2PWq8CG
生产服务器工作量的25%: http://pastebin.com/0pxxK0Fu
CPU使用率似乎随着负载的减少而减少,但不是非常显著(从50%到25%的变化实际上并没有减少50%的CPU使用率)。负载平均值似乎与工作量无关。
还有一个问题:考虑到我们的测试服务器也是虚拟机,它的CPU测量结果是否会受到运行在同一主机上的其他虚拟机的影响(使上述测量结果无用)?
更新2 将线程的快照分为三部分附加(pastebin限制)
第1部分:http://pastebin.com/DvNzkB5z
Part 2: http://pastebin.com/72sC00rc 第二部分:{{链接1:http://pastebin.com/72sC00rc}}Part 3: http://pastebin.com/YTG9hgF5 第三部分:{{链接2:http://pastebin.com/YTG9hgF5}}