And*_*sne 5 java linux multithreading
我们一直在对 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 密集型应用程序。代码选项卡组下的热包选项卡通过显示应用程序花费的大部分时间都在执行数据库查询来确认这一点。
我们使用 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 或应用程序(如果是这样)原因?
谢谢!
您可以使用性能计数器来计算操作中上下文切换的次数。为此,请使用应用程序 perf.
命令应该是perf stats -e cs <command>. 这是一个例子:
[breno@debra ~]$ sudo perf stat -e cs ls > /dev/null
Performance counter stats for 'ls':
0 cs (context switch)
0.001932855 seconds time elapsed
[breno@debra ~]$ sudo perf stat -e cs ls -R > /dev/null
Performance counter stats for 'ls -R':
3,130 cs (context switch)
3.537120431 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)