我在AWS Fargate服务上的docker容器中启动我们的Spring Boot应用程序,因此一旦CPU消耗达到100%以上,容器就会停止docker OOM--错误杀手
原因:OutofMemoryError:由于内存使用,容器被杀死
在指标上,我们可以看到CPU变得超过100%。似乎经过一段时间的分析,我们发现CPU消耗代码,但我的问题是,CPU如何能超过100%?
是否可以说JVM只使用100%?
这将为堆分配1/2的docker内存。我应该使用类似的CPU吗?我读过一篇文章https://blogs.oracle.com/java-platform-group/java-se-support-for-docker-cpu-and-memory-limits,但它告诉我们
在Java SE8U131和JDK9中,JVM对于Docker CPU限制是透明的Docker感知的。这意味着,如果-xx:paralllelgcthreads或-xx:cicompilercount未指定为命令行选项,JVM将应用Docker CPU限制作为JVM在系统上看到的CPU数量。然后,JVM将调整GC线程和JIT编译器线程的数量,就像它在裸机系统上运行一样,将CPU数量设置为Docker CPU限制。
Docker命令用于启动
docker run -d .... -e JAVA_OPTS='-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:+PrintFlagsFinal -XshowSettings:vm' -m=512 -c=256 ...
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-1~deb9u1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
启动过程中应用程序的一些附加信息
VM settings:
Max. Heap Size (Estimated): 123.75M
Ergonomics Machine Class: client
Using VM: OpenJDK 64-Bit Server VM
ParallelGCThreads = 0
CICompilerCount := 2
CICompilerCountPerCPU = true
我找到了我问题的答案。在https://bugs.openjdk.java.net/browse/jdk-8146115中修正了标识要使用的处理器数量的行为
CPU数量
使用number_of_cpus()和cpu_sets()的组合来确定进程可用的处理器数量,并适当地调整JVMs OS::active_processor_count。number_of_cpus()将根据cpu_quota()和cpu_perio()计算,使用以下公式:number_of_cpus()=cpu_quota()/cpu_perio()。如果已经为容器设置了cpu_shares,则将根据cpu_shares()/1024计算number_of_cpus()。1024是在基于云的容器管理软件中计算相对cpu使用量的默认和标准单位。
还要添加一个新的VM标志(-xx:ActiveProcessorCount=xx),它允许重写CPU的数量。即使未启用UseContainerSupport,此标志也将被启用。
因此,在AWS上,通常在任务定义级别设置cpu_shares。在jvm修复之前,它的计算是错误的。
在java8版本<191:cpu_shares()/1024=256/1024=被标识为2
val version = System.getProperty("java.version")
val runtime = Runtime.getRuntime()
val processors = runtime.availableProcessors()
logger.info("========================== JVM Info ==========================")
logger.info("Java version is: {}", version)
logger.info("Available processors: {}", processors)
示例输出
"Java version is: 1.8.0_212"
"Available processors: 1"
我希望它能帮助别人,因为我在任何地方都找不到答案(spring-issues-tracker、AWS支持等)
问题内容: 我准备开始进行一些Android开发,并且需要选择一种语言。我知道Python,但必须学习Java。我想从在Android上使用Python的那些人中了解局限性。另外,相对于Java有什么好处吗? 问题答案: 我最近出于类似原因对此进行了调查。我的结论是,我无法使用Python开发本机外观的应用程序,这正是我当时想要的。特别: Python无法从Java UI类接收回调,因此您不能使用
我知道运行后台服务有一些限制,我可以通过使用服务方法来克服这些限制。 我的怀疑是;我应该对所有android版本使用这个方法吗?由于调用此方法将显示一个通知,如果可能的话,我希望在Oreo之前的版本中避免它。 因此,为了避免在pre-Oreo设备中显示通知,我可以使用下面的代码片段吗?它在奥利奥之前和之后的后台工作吗? null
问题内容: 我增加了Macbook Pro的最大文件限制,以便Elasticsearch可以处理更多文件,但是不起作用。 我运行命令’ulimit -a’,它说“打开文件”是100,000。我可以运行一个简单的shell脚本,如下所示: 而且我能够创建很多文件(在杀死脚本之前已超过60,000)。 但是,使用Java代码在“ / tmp”目录的空子目录中创建RandomAccessFiles,在得
问题内容: 我想以编程方式限制Java中的上传或下载操作。我假设我需要做的就是检查上传进行的速度并按以下方式进行相应插入: 上面的代码能用吗?如果没有,还有更好的方法吗?是否有描述理论的教程? 问题答案: 令牌桶算法是一种限制上传或下载带宽的方法。您应该阅读本文:它解释了此算法的用法。 使用番石榴RateLimiter: 如Guava文档中所述: 重要的是要注意,所请求的许可数量永远不会影响请求本
这是一个非常简单的问题,比如说我想上传很多文件到Git本地回购,然后把它推送到GitHub上的远程回购。我想使用github桌面应用程序,上传可能需要一段时间,所以在尝试做任何我想知道的事情之前:你提交到本地存储库的大小和你推送到远程存储库的大小有限制吗? 因此,如果限制对我来说太小,我就不会浪费时间等待它上传。
问题内容: 我想开始我与JVM OPTS应用:。当应用程序启动时,我通过键入来检查内存使用情况,发现vmsize超过600512 kB!比我的设置大得多。我想知道如何限制进程的jvm内存使用量。 问题答案: 您无法控制要控制的内容 ,只能控制Java Heap,它不能控制JVM 对 本机内存 的使用,JVM的使用根据实现而完全不同。 从下面的文章中感谢内存(了解JVM如何在Windows和Linu