gpt4 book ai didi

java - 为什么当我增加 CPU 核心数时,使用 Freemarker 的 Spring Web 应用程序会变慢?

转载 作者:行者123 更新时间:2023-12-02 20:12:24 25 4
gpt4 key购买 nike

我正在使用 Freemarker 开发一个 Spring Web 应用程序,当我增加服务器上的 CPU 核心数量时,我遇到了性能/可扩展性问题。

在生产中,我们的服务器具有以下配置:

  • 英特尔至强 E5-2690
  • 8 个物理核心
  • 2.9GHz 至 3.8GHz(采用 Turbo Boost)
  • 启用超线程

我们购买了新服务器来替换具有以下配置的旧服务器:

  • 英特尔至强金牌 6254
  • 18 个物理核心
  • 3.4GHz 至 4GHz(带 Turbo Boost)
  • 禁用超线程

问题是:在具有 18 个物理核心的新服务器中,当我们向服务器加载 500 个 jmeter 线程时,我们的 Web 应用程序比具有 16 个核心(8 个物理 + 超线程)的旧服务器慢。

因此,我们使用 Yourkit 来分析我们的应用程序,并观察到当 freemarker 处理模板并写入输出时,大多数 tomcat ajp 线程在尝试获取 tomcat SynchronizedQueue(或 SynchronizedStack)上的锁时被阻止:

Thread blocked on this stack

问题是:为什么要放置这些锁以及我们如何避免或限制它们对性能的影响?

版本:

  • Tomcat 9.0.14
  • Spring 4.3.22
  • Freemarker 2.3.28

最佳答案

我找到了 2 个解决方案来减少我的网络应用程序上明显阻塞的线程:

  • 我通过调用 setAutoFlush(false) 禁用了 freemarker 自动刷新 ( see more )
  • 我优化了处理 freemarker 模板的方式。在此之前,我的 processTemplate 方法是:
public void processTemplate(Template template, Map<String, Object> model, Writer writer) throws TemplateException, IOException {
model.put(AbstractTemplateView.SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE, new RequestContext(request, response, servletContext, model));
template.process(model, writer);
}

每次处理模板时,都会初始化一个新的 RequestContext:调用构造函数时会放置一个锁。

现在,RequestContext 仅在我的 FreemarkerProcessor 的构造函数上的每个请求上初始化一次:

public FreeMarkerProcessor(HttpServletRequest request, HttpServletResponse response, ServletContext servletContext, freemarker.template.Configuration freemarkerConfiguration) {
this.freemarkerConfiguration = freemarkerConfiguration;
requestContext = new RequestContext(request, response, servletContext, new HashMap<>());
}

public void processTemplate(Template template, Map<String, Object> model, Writer writer) throws TemplateException, IOException {
requestContext.getModel().clear();
requestContext.getModel().putAll(model);
model.put(AbstractTemplateView.SPRING_MACRO_REQUEST_CONTEXT_ATTRIBUTE, requestContext);
template.process(model, writer);
}

关于java - 为什么当我增加 CPU 核心数时,使用 Freemarker 的 Spring Web 应用程序会变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59321055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com