Linux-Docker容器内存优化

Linux-Docker容器内存优化 一、整体优化思路非常重要系统内存优化不是单点而是三层结构[ 应用层 JVM ] ↓ [ 容器层 Docker ] ↓ [ 系统层 Linux ] 优化必须三层一起做否则无效 二、Docker 容器内存优化1️⃣ 查看内存占用 Top N✔ Top10推荐docker stats --no-stream --format {{.Name}} {{.MemUsage}} \ | sort -k2 -h -r | head -n 10✔ 带百分比 Top10docker stats --no-stream --format table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}} \ | sort -k3 -h -r | head -n 112️⃣ 容器内存限制关键--memory1g --memory-swap1g 作用限制容器最大使用内存防止宿主机被打爆⚠️ 常见问题没限制 → JVM 无限吃内存限制太大 → 无意义限制太小 → OOM 推荐分级服务类型内存工具服务512M普通服务768M ~ 1G核心服务1G ~ 2G中间件独立调优☕ 三、JVM 内存优化核心1️⃣ Java 8不推荐但常见-Xms256m -Xmx768m -XX:MaxMetaspaceSize192m -XX:MaxDirectMemorySize256m 不换行JDK8 ENTRYPOINT [java,-Xms256m,-Xmx768m,-XX:UseContainerSupport,-XX:MaxRAMPercentage60,-XX:MaxMetaspaceSize192m,-XX:MaxDirectMemorySize256m,-Djava.security.egdfile:/dev/./urandom,-jar,app.jar]2️⃣ Java 17推荐-Xms256m -Xmx768m -XX:UseContainerSupport -XX:MaxMetaspaceSize192m -XX:MaxDirectMemorySize256m --add-opens java.base/java.langALL-UNNAMED --add-opens java.base/java.lang.reflectALL-UNNAMED 不换行JDK17 ENTRYPOINT [java,-Xms256m,-Xmx768m,-XX:UseContainerSupport,-XX:MaxRAMPercentage60,-XX:MaxMetaspaceSize192m,-XX:MaxDirectMemorySize256m,--add-opens,java.base/java.langALL-UNNAMED,--add-opens,java.base/java.lang.reflectALL-UNNAMED,-Djava.security.egdfile:/dev/./urandom,-jar,app.jar] 字节码多的换参数 ENTRYPOINT [java,-Xms512m,-Xmx1024m,-XX:UseContainerSupport,-XX:MaxRAMPercentage60,-XX:MaxMetaspaceSize300m,-XX:MaxDirectMemorySize512m,--add-opens,java.base/java.langALL-UNNAMED,--add-opens,java.base/java.lang.reflectALL-UNNAMED,-Djava.security.egdfile:/dev/./urandom,-jar,app.jar]❗ 注意MaxRAMPercentage仅 JDK10Java8 不支持会直接报错docker run 命令后要添加: --memory1g --memory-swap1g3️⃣ JVM Docker 配合原则JVM Xmx Metaspace DirectMemory ≤ Docker limit 推荐配置稳定版Docker: 1G JVM: 768M 四、Linux 内存机制优化1️⃣ 查看内存free -h2️⃣ 清理缓存临时sync; echo 3 /proc/sys/vm/drop_caches⚠️ 不建议频繁使用3️⃣ swappiness 优化echo vm.swappiness 10 /etc/sysctl.conf sysctl -p 含义60默认→ 过早使用 swap ❌10 → 只在必要时使用 ✔ 五、Swap 设置重点1️⃣ 创建 swap推荐放大盘dd if/dev/zero of/data/swapfile bs1G count162️⃣ 设置权限chmod 600 /data/swapfile3️⃣ 格式化 swapmkswap /data/swapfile4️⃣ 启用 swapswapon /data/swapfile5️⃣ 开机自动挂载echo /data/swapfile swap swap defaults 0 0 /etc/fstab6️⃣ 查看 swapfree -h swapon --show Swap 作用防止 JVM 瞬时 OOM防止 Docker 被 kill提供“缓冲区”⚠️ 注意swap ≠ 内存扩容swap 防崩溃缓冲 六、完整优化流程实战顺序✔ Step 1查内存docker stats --no-stream✔ Step 2定位 Top 容器sort -k2 -h -r✔ Step 3限制 Docker--memory1g✔ Step 4限制 JVM-Xmx768m✔ Step 5加 swap/data/swapfile✔ Step 6验证free -h docker stats 七、常见错误总结❌ 错误1只调 swap→ 没用❌ 错误2只调 Docker→ JVM 还是爆❌ 错误3只调 JVM→ 容器还是可能被 kill