我们一直在对Java Web应用进行负载测试,发现在50个用户下CPU使用率很高(这似乎不太实际)。CPU占用率高达80%以上。通过使用Java Flight Recording (JFR)进行性能分析,我们发现上下文切换率为每秒8400次(在Java Mission Control的Hot threads选项卡中可见)。通过分析jfr中的热线程,似乎观察到CPU使用率分布在应用程序线程之间,每个线程使用的CPU不到3%。
将用户负载增加到100、150或200个时,我们发现CPU占用率超过90%,吞吐量(每秒事务数)保持不变(在50个用户负载下可见),而响应时间超过了可接受的阈值值(3秒)。将用户负载减少到20个时,CPU使用率平均超过55%。显然,应用程序线程并未占用CPU,因为我们的应用程序不是CPU密集型应用程序。代码选项卡组下的热包选项卡通过显示大部分时间应用程序在执行数据库查询来证实这一点。
我们使用Glassfish 3.1.2.2作为应用服务器,其中最大线程池配置为100。我们的操作系统是Oracle Linux Server 6.4,Linux内核版本为2.6.39-400.214.4.el6uek.x86_64。我尝试执行Linux命令“watch -n0.5 pidstat -w -I -p”和“watch -n.5 grep ctxt /proc/ /status”来查看操作系统级别的自愿和非自愿线程上下文切换情况,但它们并没有给出任何结果。
怀疑高的上下文切换可能是导致CPU升高的原因,您是否有关于如何确认线程上下文切换是高CPU使用率的原因以及如果是原因的话,调整JVM或应用程序的指导方针?谢谢!
将用户负载增加到100、150或200个时,我们发现CPU占用率超过90%,吞吐量(每秒事务数)保持不变(在50个用户负载下可见),而响应时间超过了可接受的阈值值(3秒)。将用户负载减少到20个时,CPU使用率平均超过55%。显然,应用程序线程并未占用CPU,因为我们的应用程序不是CPU密集型应用程序。代码选项卡组下的热包选项卡通过显示大部分时间应用程序在执行数据库查询来证实这一点。
我们使用Glassfish 3.1.2.2作为应用服务器,其中最大线程池配置为100。我们的操作系统是Oracle Linux Server 6.4,Linux内核版本为2.6.39-400.214.4.el6uek.x86_64。我尝试执行Linux命令“watch -n0.5 pidstat -w -I -p”和“watch -n.5 grep ctxt /proc/ /status”来查看操作系统级别的自愿和非自愿线程上下文切换情况,但它们并没有给出任何结果。
怀疑高的上下文切换可能是导致CPU升高的原因,您是否有关于如何确认线程上下文切换是高CPU使用率的原因以及如果是原因的话,调整JVM或应用程序的指导方针?谢谢!