Java 应用程序在 Kubernetes 如何配置内存,最大限度避免容器 OOMKilled - V2EX
Ayanokouji

Java 应用程序在 Kubernetes 如何配置内存,最大限度避免容器 OOMKilled

  •  
  •   Ayanokouji Jan 11, 2024 2760 views
    This topic created in 868 days ago, the information mentioned may be changed or developed.
    前提条件:jdk 支持以下参数配置
    -XX:+UseContainerSupport
    -XX:MaxRAMPercentage=25.0


    如何配置 jvm 的参数,最大限度的保证,jvm oom 的时候,可以将内存 dump 出来

    请教,都需要从哪些方面进行考虑和计算
    10 replies    2024-01-12 11:54:02 +08:00
    cheng6563
        1
    cheng6563  
       Jan 11, 2024
    我这是 pod 的内存限制设置的很大,只为容错用。Java 服务由-Xmx 控制内存使用。dump 你设置那几个 VM 选项就行了,记得给存放 dump 的卷设置容量限制。。。
    Ayanokouji
        2
    Ayanokouji  
    OP
       Jan 11, 2024
    @cheng6563 不考虑 dump 之后的参数。limit 设置的足够大,会不会造成资源浪费
    edwinyzhang
        3
    edwinyzhang  
       Jan 11, 2024
    @Ayanokouji 不会, request 设置太大会资源浪费。
    cctv6
        4
    cctv6  
       Jan 11, 2024   1
    感觉这个问题无解,要么牺牲掉一部份内存,要么放弃 dump 。
    如果限制容器使用 2G 内存,这个时候设置 MaxRAMPercentage=25.0 ,那么 JVM 它就只使用 0.5G ,浪费了 1.5G 。

    我感觉 oom dump 这个操作,是不适合放在容器里面执行的,一个原因是,dump 没控制好的情况下,会占用非常多的 CPU 资源,磁盘读写的压力也比较大。另外 dump 的时候也没办法处理请求,但是容器还是会接收请求,再加上重复的触发 dump ,就会有中断。而且有时候还没 dump 完,容器就因为健康检查被结束了,dump 了个寂寞。

    所以我选择 java 在容器中时,不要 dump 。发现有内存泄漏的时候,再单独跑实例去复现问题,再执行 dump 。

    还有个就是尽可能的测算出程序保证正常性能的情况下,到底需要多少内存,根据这个来指定值,应该是比较合理的方式。
    Ayanokouji
        5
    Ayanokouji  
    OP
       Jan 11, 2024
    @cdlnls 这个问题确实无解,只能寻求个所谓的最佳实践,还有可能应用会操作 direct memory 。但是 dump 还是得要的,看起来只能牺牲一些内存了,MaxRAMPercentage=25.0 是默认值,一般会设置 MaxRAMPercentage=70.0 左右。
    TaiShang
        6
    TaiShang  
       Jan 11, 2024
    可以看看 jemalloc,会有些优化的
    anubu
        7
    anubu  
       Jan 11, 2024   1
    这两天刚好在调 MaxRAMPercentage 这个参数,在 JVM 没有 OOM 时 Pods 频繁 OOMKilled ,一般都是 MaxRAMPercentage 配置过高,需要根据自己的场景简单压测一下,目前配置在 65 左右比较合适。

    limit 还是要限制一下,配置太大就没意义了,不好计算集群内存超配情况,也增加了不稳定性。超配太多争用的概率就高,驱逐就容易发生。驱逐还有滞后性,很多时候驱逐还没开始,因为节点内存不足,负载就拉上天了,然后就节点瘫了。
    paranoiagu
        8
    paranoiagu  
       Jan 11, 2024 via Android
    这边有 war 包的应用,发现非 jvm 需要 3-4G ,搞得 MaxRAMPercentage 设置 66.6 的话,pod 最大内存要 12G 才不会被杀。真不知道为什么要这么大内存
    ysiing
        9
    ysicing  
       Jan 11, 2024
    之前写过一个脚本,根据资源自动计算 jvm 相关值。这个是从 heroku 那里学到的。
    cloud107202
        10
    cloud107202  
       Jan 12, 2024
    @paranoiagu 可能是容器的 jdk 版本不认容器平台 CRI 的 cgroupV2. 要检查并升级 jdk 到支持 cgroupV2 的小版本
    About     Help     Advertise     Blog     API     FAQ     Solana     977 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 19:23 PVG 03:23 LAX 12:23 JFK 15:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86