【发布时间】:2015-05-22 10:17:02
【问题描述】:
我们一直在对我们的 java Web 应用程序进行负载测试,并观察到 50 个用户的 CPU 使用率很高(这似乎不切实际)。 CPU 飙升至 80% 以上。在使用 java 飞行记录 (JFR) 对其进行分析时,我们看到上下文切换率为每秒 8400 次(如 java 任务控制上的热线程选项卡中所示)。分析 jfr 中的热线程,cpu 使用率似乎分布在应用程序线程中,每个线程使用的 cpu 不到 3%。
将用户负载增加到 100、150 或 200 个用户,我们看到 cpu 飙升至 90% 以上,吞吐量(每秒事务数)保持不变(如 50 个用户负载所见),而响应时间超过了可接受的阈值(3 秒)。将用户负载减少到 20 个用户显示 CPU 使用率平均超过 55%。由于我们的应用程序不是受 CPU 限制的应用程序,因此应用程序线程正在耗尽 CPU 肯定不是真的。 Code 选项卡组下的 Hot Packages 选项卡通过显示应用程序花费的大部分时间都在执行数据库查询来确认这一点。
我们使用 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 或应用程序如果是这个原因?
谢谢!
【问题讨论】:
标签: java linux multithreading