首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为高CPU/内存工作负载优化Spring后端

为高CPU/内存工作负载优化Spring后端
EN

Stack Overflow用户
提问于 2021-08-10 23:11:14
回答 2查看 2K关注 0票数 1

我正在运行一个Spring应用程序,它充当前端Javascript应用程序的后端。前端作为静态资源提供给客户端,后端为来自它的API请求提供服务。该应用程序最初设计为在前提下运行,但应该以允许移植到云本机解决方案的方式构建。

我希望后端做一些繁重的ETL工作,这将是沉重的内存和CPU方面。同时,它不需要扩展来处理许多并发请求--它只需要为启动和管理作业的请求提供服务,与之接口的单个用户将调用这些请求。

对于这种类型的部署,我可以调整哪些参数来进行微调?

当前的想法:

  • server.tomcat.max-threads减少到一位数,以最小化请求线程池的占用空间,因为我不希望并发处理多个线程池。
  • 对数据库连接池执行相同的操作
  • 启动JAR时微调XmsXmx

对于如何确保Java应用程序在系统上占用尽可能大的占用空间,以及我可以调整的Spring特定参数,我将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-15 08:21:29

如果您有长期运行的后台任务,我将卸载到螺纹池,并将最大线程数设置为系统中的CPU数量。还可以在执行器的队列上设置最大容量,这样就不会让过多的挂起的工作使其过载。

卸载到不同的线程将确保容器的线程仍然可用,并且不会导致完全没有响应的系统。

您对最大堆大小和连接池的建议是有效的。

票数 3
EN

Stack Overflow用户

发布于 2021-08-19 18:08:51

通常,对于任何基于Java的应用程序来说,开放化技术都是simialr,因为您的是一种ETL类型的处理,其中吞吐量比单个请求延迟更重要。

如果任务是典型的ETL,那么与IO密集型的提取和加载相比,转换通常更密集。因此,我的第一个建议是对应用程序进行分析,以了解典型的CPU/Mem使用模式。如果它在IO中花费更多的时间,那么您可以使用比CPU内核更多的处理线程,所以您可以对其进行调优。还请记住,如果内存压力过大,那么垃圾收集器也会花费大量的CPU,所以最大内存设置也很重要。您可以在应用程序中启用GC日志记录,作为像这样的工具来轻松地分析GC模式。您可以尝试使用ParallelGC算法,这些算法更适合高吞吐量,而代价是稍高的暂停时间。通常,如果要在提取和加载阶段与大量数据交互,通常会使用流/缓冲技术来减少内存占用。一个例子是在处理大型结果集时使用游标,同时与数据库交互。类似地,如果加载阶段涉及到与大型文件的交互,则可以使用并行处理。然后,所有这些都需要实验来验证。

另外,Spring生态系统中还有一个项目- Spring,它使用了许多这样的优化技术,适用于ETL类型的作业的批处理。您可以阅读一些关于这里的技术。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68734350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档