performance - spring boot api rest webservice中的性能问题
问题描述
在我们的组织中,我们已经开始通过 web 服务与 api rest 进行集成,但我们遇到了一个罕见的性能问题。
数据:我们有一个虚拟机 (VMWare) 4 核/8Gb 内存。足够的远程存储。Ubuntu 服务器 18.04 openjdk 11.0.7 2020-04-14 JAVA_OPTS='-Djava.awt.headless=true -Xms512m -Xmx2048m -XX:MaxPermSize=256m'
mysql:见 5.7.30-0ubuntu0.18.04.1(它在本地运行,但应用程序通过主机名连接)。
APP:Spring boot 2.1.3 (tomcat & spring data jpa & hikari & hibernate) 所有参数默认。
top - 15:09:15 up 2 days, 14:21, 1 user, load average: 0.03, 0.01, 0.00
Tasks: 189 total, 1 running, 100 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8168140 total, 148740 free, 7590936 used, 428464 buff/cache
KiB Swap: 2097148 total, 1352428 free, 744720 used. 332048 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2383 app 20 0 41920 3944 3220 R 0.7 0.0 0:00.53 top
2698 app 20 0 5835612 402424 15312 S 0.7 4.9 23:13.92 java
1786 mysql 20 0 2680528 321892 8108 S 0.3 3.9 20:38.32 mysqld
2677 app 20 0 5850152 441440 15824 S 0.3 5.4 28:01.41 java <------
2769 app 20 0 5868308 977.2m 16868 S 0.3 12.3 49:25.72 java
ps -eaf | grep java
app 2677 2676 0 Jul07 ? 00:28:01 java -Dserver.port=4560 -jar app-ws-1.0.0-SNAPSHOT.jar <------
app 2698 2696 0 Jul07 ? 00:23:14 java -Dserver.port=4561 -jar app-ws-1.0.0-SNAPSHOT.jar
app 2769 2768 1 Jul07 ? 00:49:26 java -jar app-gui-1.0.0-SNAPSHOT.jar
我们有 2 个 web 服务,一个是功能性的 (2677),另一个在测试中 (2698) 和一个 web 应用程序 (2768)。
我们第一个有问题。处理调用时,第一个调用需要>30s,导致调用系统超时,但后续调用处理正常<5s。
通话次数最少,最多 10 次。每天,从不并发。如果几个小时没有调用 (>5h),也会发生超时。
我们检查了代码,我们检查了 WMware/Ubuntu(暂停选项),但在监控中我们没有看到任何东西。
我们被告知这可能是 JVM 和 GC 问题,但我个人不太了解,而且我还没有看到内存分析器的任何内容。
后来,我们在应用程序本身中实现了每 10 分钟一次的虚拟调用 (localhost) 以“预热机器”,但即便如此,第一次调用仍然需要 30 秒以上,其余的则不需要。虚拟呼叫只回答正常。
我们不知道原因可能是什么,也不知道如何放弃选择,因为它是一个高效的环境,它不允许很多变化。
解决方案
推荐阅读
- python - ValueError:检查时出错:预期 conv2d_1_input 的形状为 (28, 28, 1) 但得到的数组的形状为 (58000, 28, 28)
- jenkins-pipeline - 在 groovy 中创建自定义步骤
- reactjs - 使用 FirebaseUI + React Router 成功登录时重定向
- gurobi - 错误:求解器日志:无法识别的标志或缺少参数:-AMPL
- c - 为什么当我们尝试在 C 编程中将 malloc 用于多个字符串时, malloc 有效,但 calloc 无效?
- html - 在角度 4 中切换三个 div
- c++ - 在 C++ 中找出具有无限范数的相对误差
- tensorflow - GradientDescentOptimizer 的输入是什么?
- ios - iOS Swift MKLocalSearchRequest
- swift - 防止用户垂直录制