Kai*_*ash 5 performance jvm memory-management
我正在运行一些性能测试来确定响应时间和处理各种cpu/ram/os配置的并发性的能力.我遇到的一个有趣的发现是,看起来单个jvm在使用4个内核时比在2个内核中表现更好(这并不奇怪),但是在第4个内核之外添加更多内核并不会带来任何显着的改进.但是,添加另一个带有负载均衡器(相同硬件)的jvm实例会带来显着的改进.
看起来单个进程在其可以使用的核心数量上受到限制,可能是由于进程可以一次生成的操作系统线程数量的限制.这是一个64位环境.
我正在使用tomcat并尝试更改"maxThreads"属性,但这并没有对我想要处理的并发数量产生影响.
还有其他原因可以解释一下吗?
一般来说,Java 应用程序会尝试将每个活动线程安排在单独的核心上。这包括 GC 线程。如果应用程序一开始就不受 CPU 限制,那么添加更多内核不会产生任何影响,因为线程会被某些东西阻塞。
对于 Web 应用程序,事情会变得稍微复杂一些。如果线程正在等待其他内容(例如数据库连接池中的数据库),则增加线程池的大小不会产生任何影响。您需要仔细查看负载均衡器和 Tomcat 配置。如果这些没有正确调整,很容易出现您所描述的行为。
我不会太担心 JVM 所拥有的线程数量受到限制。我经常在我们的生产系统中的每个 JVM 中看到超过 600 个线程。我们使用8核机器,请求的持续时间很短,因此大多数线程都处于I/O等待状态。