我们正在开发一个基于spring boot技术的微服务架构的系统。
一切都很好,我们喜欢它,但我们担心每个服务消耗的资源。
我们的系统分布在8-12个微服务中,每个服务至少使用大约550MB的RAM。
我们试图通过系统变量限制资源,但性能严重下降,因此在物理上限制资源不是一种选择。
mem_limit: 200m
memswap_limit: 400m对此,我想知道:
使用spring boot实现的服务消耗这么多内存是正常的吗?我们能做些什么来优化它吗?
配置:
我们目前使用CentOS 7.5作为运行docker的主机操作系统。
openjdk:11
发布于 2019-09-03 16:55:14
这很正常。我们遇到了同样的问题。经过研究,我提出了以下解决方案:
Strikt内存限制导致以前没有错误的地方出现更多错误(容器和java堆空间中严格的内存限制)
基本的想法是为服务提供更多的内存,而不是你在内存中实际可用的内存。要处理最终可能导致内存问题的峰值,您可以在主机系统上使用swap。在我看来,在docker容器中不需要一些交换内存限制。当内存非常满时,主机系统的内核将管理这一点。
稍后,假设您有32 of和16 of交换空间。您可以分配内存限制(docker和jvm堆空间),总和将大于32 be,但小于32GB+16GB (为安全起见)。这种过度配置仅用于处理服务的负载高峰。这些限制仅用于在出现问题时快速失败,并且只有一个服务失败,而不是整个系统失败。
您可以调整一个交换值,以防止过多的交换,并且如果您将-XX:MaxHeapFreeRatio从默认的70降低,您可以告诉jvm更快地将分配的堆空间释放回操作系统。
但从长远来看,您需要一些东西来监控所有服务的内存使用情况("prometheus grafana“?)并重新分配内存限制以适应您的物理限制。
https://stackoverflow.com/questions/57767028
复制相似问题