我正在使用 tomcat 将 pdf 转换为 png。我使用 Jmeter 对应用程序进行负载/吞吐量测试,该应用程序使用的是具有 16 个超线程核心的 Intel(R) Xeon(R) CPU X5550 @ 2.67GHz 服务器。Tomcat6 分配了 2GB 的堆内存,并且连接器设置为处理 1000 个并发连接。在负载测试期间,我发现随着用户数量的增加,响应时间会降低,这是正常的。但是,平均负载非常低(16 核机器约为 1),CPU 使用率约为 60%。我通过 JMX 使用 jconsole 监控 tomcat 实例,发现内存使用率不是问题。为了保持较低的响应时间,我在 8 个不同的端口上创建了大约 8 个 tomcat 实例,并在负载测试期间使用负载平衡器平衡所有 8 个端口之间的负载。这次我发现服务器能够处理更多的并发连接,而不会降低响应时间。平均负载也高达 7。因此,当仅设置一个实例时,tomcat 似乎没有有效地使用 CPU(我甚至尝试在不同的端口上创建多个连接器)。
看来我们需要在一台机器上运行多个 tomcat 实例才能发挥最大性能。这种设置并不是最佳选择,因为在服务器池中创建多个实例并进行维护会很麻烦。
我的问题是,是否可以通过这种方式配置 tomcat,使得单个实例在较高平均负载的情况下使用尽可能多的 CPU?
如果您对设置有任何疑问,请发表评论。
我将非常感激任何帮助/指点。
答案1
我觉得应用程序存在瓶颈。我猜它只使用一个线程来转换 pdf。
Tomcat 并行运行 servlet,但当 servlet 调用单线程库时,您的 Web 应用程序将变成单线程应用程序。您必须修改应用程序以使用更多线程。
一个不太好的解决方法是运行与核心数量相同的 Tomcat 实例,并对它们进行负载平衡(正如您在问题中提到的那样)。