docker容器构建/运行优化

docker 容器构建/运行优化

学到新内容再补充更新

镜像选择

最小镜像:

gcr.io/distroless/static-debian11		#谷歌,运行单个应用程序,并且没有包含任何操作系统或调试工具
busybox
alpine

系统镜像:

rockylinux-minimal		93MB
almalinux-minimal		93.7MB
ubuntu			70.3MB
debian-slim			74.8MB

关于java

运行jvm优化

小于jdk8u131的版本,会以宿主机内存为准,设置最大jvm内存,所以用的远超容器配置的内存,后期会触发oom

java参数
-----------关于heap内存配置,根据程序配置,比较频繁的话可以把年轻代放大点,很多动态生成类或者大量字符串常量可以加大永久代-----------
-Xms内存大小				jvm总内存最小
-Xmx内存大小				jvm总内存最大
-XX:NewSize=内存大小		年轻代初始大小
-XX:MaxNewSize=内存大小		年轻代最大大小
-Xmn内存大小				年轻代的初始和最大固定1g
-XX:PermSize=内存大小		设置永久代初始大小(存放类信息、常量池等数据的区域)
-XX:MaxPermSize=内存大小	设置永久代最大大小
-XX:MetaspaceSize=内存		jdk7以后,永久代改为元空间,之前的永久代即使配置了也会失效,需要用此配置,默认的有点小,只用几十M来自,具体多少忘了
-XX:MaxMetaspaceSize=内存		元空间最大内存,默认无限制
-XX:NewRatio=1/2			比例方式设置年轻代与老年代大小,如:2或1/2(新分1,老分2)
-XX:SurvivorRation=6/1		比例设置eden和幸存区大小
-XshowSettings:vm 			显示jvm虚拟机内存
-version					显示版本,配合上面的参数可简短输出
-----------容器相关-----------
-XX:+UnlockExperimentalVMOptions 	解锁实验性选项。在JVM中有一些实验性的选项被隐藏起来,需要此选项开启才能用。在生产环境中使用这个选项时要谨慎,并且要仔细测试以确保稳定性和可靠性
-XX:+UseContainerSupport			启用容器支持。此选项会自动检测容器环境,并根据容器的限制自动调整JVM参数,如CPU和内存限制
-XX:MaxRAMFraction					旧版本使用。为1时,使用容器内最大内存,尽可能多用,只留少部分给其他程序;为2时,只用容器50%内存
-XX:MaxRAMPercentage=75				新版本可用,效果同上,75为75%
-XX:InitialRAMPercentage=25			25%作为初始堆大小
-XX:MaxDirectMemorySize				堆外内存,DirectByteBuffer使用过多时需配置,默认DirectByteBuffer等于-Xmx,也就是-Xmx*2的内存占用
-XX:+UseCGroupMemoryLimitForHeap	使用CGroup内存限制作为堆大小的限制。这可以确保JVM不会超出容器分配给它的内存限制,-Xmx会覆盖此项,高版本弃用,改为其他默认项开启了
-----------关于gc相关-----------
-XX:+UseParNewGC					新生代使用ParNew,老年代使用SerialOld
-XX:+UseConcMarkSweepGC				新生代使用ParNew,老年代优先使用CMS,备选方式为Serial Old。响应时间要短,停顿短使用这个垃圾收集器
-XX:+UseCMSCompactAtFullCollection	开启此值,在CMS收集后,进行内存碎片整理
-XX:CMSFullGCsBeforeCompaction=N	设定多少次CMS后,进行一次内存碎片整理
-XX:+CMSParallelRemarkEnabled		cms降低标记停顿
-XX:CMSInitiatingOccupancyFraction=N	N为0-100整数表示达到老年代的大小的百分比多少触发回收,默认68
-XX:MaxTenuringThreshold=N			如果一个对象一直存活,在from、to来回复制,如果from区中对象复制次数达到阈值(默认15次,CMS为6次,就直接复制到老年代
-XX:+UseG1GC						使G1垃圾收集器,有自适应的特性,可以根据应用程序的运行情况动态调整回收策略。G1垃圾收集器在大型堆和多核环境下表现良好,适合在容器中使用
-XX:MaxGCPauseMillis=100			设置最大垃圾回收停顿时间的目标值,单位为毫秒
-XX:InitiatingHeapOccupancyPercent=50 	设置触发并发标记周期的堆占用率阈值
-XX:G1HeapRegionSize=2m 			设置每个堆区域的大小,单位为字节。
-XX:ConcGCThreads=N					设置并发垃圾回收线程数,建议为容器配置的cpu毫核,不配置也会自适应为cpu总数
-XX:ParallelGCThreads=N				设置并行垃圾回收线程数。建议为容器配置的cpu毫核,不配置也会自适应为cpu总数
-XX:G1ReservePercent=N				设置作为保留空间的堆大小百分比。
-XX:G1MixedGCCountTarget=N			设置混合垃圾回收周期的目标次数。
-XX:+DisableExplicitGC				禁用显式垃圾回收调用。显式垃圾回收调用是通过System.gc()方法触发的,禁用它可以防止应用程序在不必要时进行垃圾回收
-XX:+ExplicitGCInvokesConcurrent	启用并发垃圾回收。并发垃圾回收允许应用程序线程与垃圾回收线程并发执行,从而减少停顿时间
-----------其他-----------
-XX:+AggressiveOpts					启用一组依赖于特定平台的高级性能优化选项。这些选项可能会提高应用程序的性能,但也可能导致不稳定或不可预测的行为
-XX:LargePageSizeInBytes=内存大小	设置大页面的大小。可以提高内存访问的效率
-XX:+UseFastAccessorMethods			启用快速访问器方法。可以提高对类的字段的访问速度,但可能会导致一些不稳定或不可预测的行为。较新版本好像已弃用此选项,11.0.19模拟实验时已不生效
-XX:+UseBiasedLocking				启用偏向锁定。可以减少无竞争情况下的同步操作开销。适用于大多数情况下只有一个线程访问同步块的场景
例:
JAVA_OPTS="-server -Xms2g -Xmx2g -Xss512k -Xmn512m -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:PermSize=128m -XX:MaxPermSize=512m -XX:LargePageSizeInBytes=128m -XX:+UnlockExperimentalVMOptions -XX:MaxRAMPercentage=75 -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=50 -XX:G1HeapRegionSize=2m -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=75 -XX:+UseCGroupMemoryLimitForHeap"
模拟gc

用8c14g虚拟机运行模拟oom的java程序,两个收集器都配置8核运行
不知道是不是真的表明G1可以最小化STW等待时间(毕竟不是开发,有疑惑),2次full gc,均快于ParNew+CMS,第二次也是快一倍速度

G1收集器full gc处理时间:
image

ParNew+CMS收集器full gc处理时间:
image

保留oom日志信息

Dockerfile运行时,java运行参数必须加上

-XX:+HeapDumpOnOutOfMemoryError		#dump oom日志到文件
-XX:HeapDumpPath=/opt 			#保存路径
-XX:OnOutOfMemoryError=脚本或命令	#oom时执行
例:
FROM java:8

ADD app.jar /opt/app.jar
JAVA_OPTS="-server -Xms2g -Xmx2g -Xss512k -Xmn512m -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:PermSize=128m -XX:MaxPermSize=512m -XX:LargePageSizeInBytes=128m -XX:+UnlockExperimentalVMOptions -XX:MaxRAMPercentage=75 -XX:MaxGCPauseMillis=100 -XX:InitiatingHeapOccupancyPercent=50 -XX:G1HeapRegionSize=2m -XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:+UseContainerSupport -XX:MaxRAMPercentage=75 -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/log -XX:OnOutOfMemoryError='find /opt/log -name \'*.hprof\' -exec mv {} {}.`date +"%Y%m%d%H%M%S"` \;'"
VOLUME ["/opt/log"]
ENTRYPOINT java ${JAVA_OPTS} -jar /opt/app.jar
posted @ 2023-07-14 17:25  suyanhj  阅读(261)  评论(0)    收藏  举报