![Java 应用程序在虚拟服务器(KVM)中运行缓慢](https://linux22.com/image/676400/Java%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%9C%A8%E8%99%9A%E6%8B%9F%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88KVM%EF%BC%89%E4%B8%AD%E8%BF%90%E8%A1%8C%E7%BC%93%E6%85%A2.png)
我有一个 Java Web 应用程序,它从 JAR 运行,启动嵌入式 Tomcat 并使用 Spring Boot。
问题是它在 KVM 虚拟客户机中运行时运行非常慢。同一 JDK 中的同一应用程序(Java(TM) SE Runtime Environment (build 1.8.0_72-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode
)在裸机上启动需要 8 秒,但在虚拟化系统中启动则需要 40 秒。两个操作系统都是 Ubuntu 15.10(内核 4.2.0-27-generic)。这不仅是启动问题,应用程序对每个 HTTP 请求的响应也非常缓慢。
我尝试更改有关 SecureRandom 的 Java 设置,但没有任何改变。
-Djava.security.egd=file:///dev/urandom
虚拟客户中的 SecureRandom 和随机熵: https://security.stackexchange.com/questions/14386/what-do-i-need-to-configure-to-make-sure-my-software-uses-dev-urandom
https://stackoverflow.com/questions/137212/how-to-solve-performance-problem-with-java-securerandom
但它对我没有帮助。你还有其他建议吗?该怎么办?谢谢。
我的虚拟主机是一台新服务器,拥有充足的 RAM、SSD……所以我很确定没有硬件问题。我还运行了其他 KVM 虚拟客户端,完全没有问题。只有 Java 应用程序运行缓慢。
答案1
如果您的应用程序正在使用 SecureRandom,您可能需要安装一个随机熵生成器,haveged
以便初始种子具有足够的熵。
虚拟机在收集熵方面存在问题。
虚拟服务器在模拟环境中运行,几乎无法访问“真实”硬件。传统计算机从硬件中获取的随机数据不会在模拟的虚拟硬件中发生,因此熵的主要来源不存在。
这至少有望在第一次使用时提高性能。