作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Freemarker 开发一个 Spring Web 应用程序,当我增加服务器上的 CPU 核心数量时,我遇到了性能/可扩展性问题。
在生产中,我们的服务器具有以下配置:
我们购买了新服务器来替换具有以下配置的旧服务器:
问题是:在具有 18 个物理核心的新服务器中,当我们向服务器加载 500 个 jmeter 线程时,我们的 Web 应用程序比具有 16 个核心(8 个物理 + 超线程)的旧服务器慢。
因此,我们使用 Yourkit 来分析我们的应用程序,并观察到当 freemarker 处理模板并写入输出时,大多数 tomcat ajp 线程在尝试获取 tomcat SynchronizedQueue(或 SynchronizedStack)上的锁时被阻止:
问题是:为什么要放置这些锁以及我们如何避免或限制它们对性能的影响?
版本:
最佳答案
我找到了 2 个解决方案来减少我的网络应用程序上明显阻塞的线程:
setAutoFlush(false)
禁用了 freemarker 自动刷新 ( see more )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/
我是一名优秀的程序员,十分优秀!