首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jvmkill无法在Paketo Java Buildpack创建的映像中杀死JVM

jvmkill无法在Paketo Java Buildpack创建的映像中杀死JVM
EN

Stack Overflow用户
提问于 2021-06-02 20:24:31
回答 1查看 408关注 0票数 1

我在一个使用官方spring引导gradle插件创建的容器中有一个spring引导应用程序v2.4.3,这个插件使用buildpakcs来创建。

其中一个层是jvmkill:

代码语言:javascript
复制
[creator]     Adding layer 'paketo-buildpacks/bellsoft-liberica:jvmkill'

这是非常好的,它正确地为jvmkill添加了jvmkill的jvm。

代码语言:javascript
复制
Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -Xmx387804K -XX:MaxMetaspaceSize=148771K -XX:ReservedCodeCacheSize=240M -Xss1M (Total Memory: 1G, Thread Count: 250, Loaded Class Count: 23852, Headroom: 0%)                                                                                                                                           
Adding 129 container CA certificates to JVM truststore                                                                                                                               
Picked up JAVA_TOOL_OPTIONS: -Djava.security.properties=/layers/paketo-buildpacks_bellsoft-liberica/java-security-properties/java-security.properties -agentpath:/layers/paketo-buildpacks_bellsoft-liberica/jvmkill/jvmkill-1.16.0-RELEASE.so=printHeapHistogram=1 -XX:ActiveProcessorCount=2 -XX:MaxDirectMemorySize=10M -Xmx387804K -XX:MaxMetaspaceSize=148771K -XX:ReservedCodeCacheSize=240M -Xss1M                                                                                                                         
   .   ____          _            __ _ _                                                                                                                                              
  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \                                                                                                                                             
 ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \                                                                                                                                            
  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )                                                                                                                                           
   '  |____| .__|_| |_|_| |_\__, | / / / /                                                                                                                                            
  =========|_|==============|___/=/_/_/_/                                                                                                                                             
  :: Spring Boot ::                (v2.4.3)

该应用程序运行在Kubernetes (AWS EKS),但当我得到一个OOM

代码语言:javascript
复制
java.lang.OutOfMemoryError: Java heap space

jvmkill启动,打印堆转储并发送杀死信号。

代码语言:javascript
复制
Heap                                                                                                                                                                                 
  def new generation   total 116736K, used 90606K [0x00000000e8400000, 0x00000000f02a0000, 0x00000000f02a0000)                                                                        
   eden space 103808K,  87% used [0x00000000e8400000, 0x00000000edc7bae0, 0x00000000ee960000)                                                                                         
   from space 12928K,   0% used [0x00000000ef600000, 0x00000000ef600000, 0x00000000f02a0000)                                                                                          
   to   space 12928K,   0% used [0x00000000ee960000, 0x00000000ee960000, 0x00000000ef600000)                                                                                          
  tenured generation   total 259456K, used 249951K [0x00000000f02a0000, 0x0000000100000000, 0x0000000100000000)                                                                       
    the space 259456K,  96% used [0x00000000f02a0000, 0x00000000ff6b7f18, 0x00000000ff6b8000, 0x0000000100000000)                                                                     
  Metaspace       used 74292K, capacity 76000K, committed 76824K, reserved 208160K                                                                                                    
   class space    used 8689K, capacity 9350K, committed 9600K, reserved 140576K                                                                                                       
 jvmkill killing current process                          ```

但是jvm从来没有被杀死。检查容器,我注意到应用程序运行的PID 1不能从容器内被杀死(或发出信号)。

代码语言:javascript
复制
cnb@myhost-6968d47f4b-2cnlj:/$ ps -fea
UID        PID  PPID  C STIME TTY          TIME CMD
cnb          1     0  6 19:49 ?        00:00:54 java org.springframework.boot.loader.JarLauncher
cnb        121     0  0 20:02 pts/0    00:00:00 bash
cnb        131   121  0 20:02 pts/0    00:00:00 ps -fea

由于所有这些都是由java自己构建的,我希望它知道PID 1不能被杀死,并以不同的方式启动应用程序来正常工作。

是否有什么东西是我缺少或需要配置的内置包jvmkill,以进行开箱即用?

解决方案:

如果我直接使用

  1. 运行映像,我可以使用docker run --init向jvm进程发送信号(我的应用程序使用PID 7运行)。对Kubernetes无效。

代码语言:javascript
复制
cnb          1  4.0  0.0   1120     4 ?        Ss   20:10   0:00 /sbin/docker-init -- java etc...
cnb          7  4.0  0.0  18372  1580 ?        S    20:10   0:00 java etc...

我可以在我的requirements.规范中使用

  1. ,使它与PID一起运行,而不是1,但是由于安全性遵从性,很难证明它是正确的。

  1. ,我可以添加jvm标志-XX:+ExitOnOutOfMemoryError,但是没有jvmkill显示的很好的堆转储,加上jvmkill线程创建失败的覆盖率。
EN

回答 1

Stack Overflow用户

发布于 2021-06-02 22:20:09

考虑到https://github.com/airlift/jvmkill#using-inside-docker-containers中提到的解决方法,您需要一些其他的东西来实现pid 1。Kubernetes没有--init的等价物,但是如果在映像中包含tini,则可以通过容器命令手动使用它。您也可以使用类似的sh

另外,请记住,这只会保护您免受Java级别堆大小限制的影响。如果达到了实际的容器内存限制,那么您的进程就会立即终止,没有机会捕获它并做任何事情。

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

https://stackoverflow.com/questions/67812085

复制
相关文章

相似问题

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