1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| Flink内存主要是三部分,NetworkBuffer和ManagerPool都是由Flink管理 ManagerPool也已经走向堆外内存,所以内存调优分为两部分 非堆内存NetWorkBuffer和ManagerPool调优 Flink系统中Heap内存调优
非堆内存 调整NetworkBuffer和ManagerPool的比例 NetworkBuffer: taskmanager.network.memory.fraction(默认0.1) taskmanager.network.memory.min(默认64M) taskmanager.network.memory.max(默认1G) 原则:默认是0.1或是小于0.1可以根据使用的情况进行调整 ManagerPool: taskmanager.memory.off-heap:true(默认是false) taskmanager.memory.fraction(默认是0.7) 原则:在流计算中建议调整成小于0.3 堆内存 Flink是运行在JVM上的,所以堆内存调优和传统JVM调优无差别 默认Flink使用的ParallelScavenge的垃圾回收器,可以改用G1垃圾回收器 启动参数 env.java.opts= -server -XX:+UseG1GC -XX:MaxGCPauseMillis=300 -XX:+PrintGCDetails G1的优势 无空间碎片 G1基于标记-整理算法,不会产生空间碎片,分配大对象时不会无法得到连续的空间而提前触发一次FULLGC 可控制的暂停时间 G1通过动态调整young代空间并根据回收代价和空间率选择部分回收Old代垃圾达到可预测的暂停时间 并行与并发 G1能更充分的利用CPU,多核环境下的硬件优势来缩短stop the world的停顿时间 G1参数 -XX:MaxGCPauseMillis:设置允许的最大GC停顿时间(GC Pause Time),默认是200ms -XX:G1HeapRegionSize:每个分区的大小,默认值是会根据整个堆区的大小计算出来,范围是1M~32M,取值是2的幂,计算的倾向是尽量有2048个分区数 -XX:MaxTenuringThreshold=n:晋升老年代的年龄阈值,默认值为15 -XX:InitiatingHeapOccupancyPercent: 一般会简写IHOP,默认是45%,这个占比跟并发周期的启动相关,当空间占比达到这个值时,会启动并发周期 如果经常出现FULLGC,可以调低该值,尽早的回收可以减少FULLGC的触发 但如果过低,则并发阶段会更加频繁,降低应用的吞吐 -XX:G1NewSizePercent:年轻代最小的堆空间占比,默认5% -XX:G1MaxNewSizePercent:年轻代最大的堆空间占比,默认60% -XX:CountGCThreads:并发执行的线程数,默认值接近整个应用线程数的1/4 -XX:-XX:G1HeapWastePercent:允许的浪费堆空间的占比,默认5%,如果并发标记可回收的空间小于5%,则不会触发MixedGC -XX:G1MixedGCCountTarget:一次全局并发标记之后,后续最多执行的MixedGC次数,默认值是8
|