Stories

Detail Return Return

Flink 內存模型和生產環境調優 - Stories Detail

Flink 自1.1版本起通過 FLIP-49 Unified Memory Configuration for TaskExecutors 和 FLIP-116 Unified Memory Configuration for Job Managers對 TaskManager 和 JobManager 的內存模型進行了重大重構,統一了內存配置方式,本文詳細介紹 Flink TaskManager 內存模型的各內存塊配置參數、生產環境中的優化策略,以及 Jemalloc 內存分配器的應用。Flink 內存模型結構圖
圖片
On-Heap [JVM 堆內存]1、Framework Heap Memory: Flink 框架本身使用的內存,即 TaskManager 本身所佔用的堆內存。 配置參數: taskmanager.memory.framework.heap.size=128MB,默認 128MB 2、Task Heap Memory: Task 執行用户代碼時所使用的堆內存。 配置參數: taskmanager.memory.task.heap.size。Off-Heap [JVM 堆外內存]1、DirectMemory1.1. Framework Off-Heap Memory: Flink框架本身所使用的內存,即TaskManager 本身所佔用的堆外內存。 配置參數: taskmanager.memory.framework.off-heap.size=128MB,默認 128MB 1.2. Task Off-Heap Memory: Task 執行用户代碼所使用的堆外內存。 配置參數: taskmanager.memory.task.off-heap.size=0,默認 01.3. Network Memory: 網絡數據交換所使用的堆外內存大小,如網絡數據交換。配置參數: taskmanager.memory.network.fraction=0.1 taskmanager.memory.network.min=64MB,taskmanager.memory.network.max=1GB 2、Managed Memory: Flink 管理的堆外內存,用於排序、哈希表、緩存中間結果及 RocksDB State Backend 的本地內存。 配置參數: taskmanager.memory.managed.fraction=0.4 taskmanager.memory.managed.size=xx3、JVM metaspace: 用於存儲類的元數據信息配置參數:taskmanager.memory.jvm-metaspace.size=128MB4、JVM over-head 執行開銷:JVM 執行時自身所需要的內容,包括線程堆棧、IO、 編譯緩存等所使用的內存。   配置參數:taskmanager.memory.jvm-overhead.min=192MB, taskmanager.memory.jvm-overhead.max=512MB, taskmanager.memory.jvm-overhead.fraction=0.1 總體內存1、總進程內存: Flink Java 應用程序(包括用户代碼)和 JVM 運行整個進程所消耗的總內存。總進程內存 = Flink 使用內存 + JVM metaspace + JVM Overhead配置參數: taskmanager.memory.process.size=xxx2、Flink 總內存: 僅 Flink Java 應用程序消耗的內存,包括用户代碼,但不包括 JVM 為其運行而分配的內存 Flink 使用內存 = 框架堆內外 + task 堆內外 + network + manage 配置參數:taskmanager.memory.flink.size=xxx對應調優策略內存調優是優化 Flink 作業性能的重要步驟,合理的內存配置可以減少 GC 壓力、提高吞吐量並避免作業失敗;相反如果對作業設置的內存不合理,可能導致內存資源浪費或任務出現問題。
圖片
1.Task Heap內存可以通過 Taskmanager 的 Full GC 時長和次數進行調整。頻繁 Full GC 則適當調整這塊內存,反之可以考慮調小這塊內存,通過 TM Process 內存調整,也可以使用 G1 垃圾回收器(-XX:+UseG1GC)Full GC 頻率。2.Managed Memory內存如果任務不存在窗口或者自定義state(基於rocksdb),表象為所有 Taskmanager 的這個 Metric 指標數據都是0%,這時候可以把該內存去掉,對應值設置為0。如果有基於 rocksdb 的狀態數據,可以設置 state.backend.rocksdb.memory.managed=true,交由Flink託管,如果對 rocksdb 熟悉,想自己進行精細化調優,則設置為 false,並調優 rocksdb 相關參數。通過自定義系統參數進行修改:-Dtaskmanager.memory.managed.size=xxMB3.Task Off-Heap內存此塊內存默認配置值是0,一般不需要用户手動去調整,如果用户的代碼程序裏用到了 DirectMemory,或者依賴了第三方框架例如 Pulsar, Netty,對 DirectMemory 有需求,那麼用户需要手動指定這塊內存的大小,不然容易出現的 java.lang.OutOfMemoryError: Direct buffer memory 問題通過自定義系統參數進行修改:-Dtaskmanager.memory.task.off-heap.size=xxMB4.Network內存Network 內存跟任務的整體並行度以及執行圖的複雜情況有關,如果任務並行度較大導致的這塊內存不夠,會報一下異常,這時候需要適當的提升網絡內存的大小。一般並行度較小或執行圖簡單的任務,可以把這塊內存調下。java.io.IOException: Insufficient number of network buffers: required xx, but only 0 available.  -Dtaskmanager.memory.network.min=xxMB-Dtaskmanager.memory.network.max=xxMB5.JVM Metaspace內存如果這塊內存大於 128MB,可以嘗試把這塊內存調到 128MB。因為大部分作業 128MB 足夠 Metaspace 使用。通過自定義系統參數進行修改:-Dtaskmanager.memory.jvm-metaspace.size=128M6.JVM Overhead內存如果使用rocksdb狀態後端並且有內存超用現象,可以適當調大這塊內存。通過自定義系統參數進行修改:-Dtaskmanager.memory.jvm-overhead.max=xxMB-Dtaskmanager.memory.jvm-overhead.min=xxMBJemalloc內存分配器jemalloc 是一種高效的內存分配器,廣泛用於替代標準 glibc 內存分配器,能夠減少內存碎片、提高分配效率並降低延遲,通過jemalloc內存分配器也能優化 Flink 的內存使用。在 Flink 的 YARN 部署環境中,通過指定-Dyarn.ship-archives和-Dcontainerized.taskmanager.env.LD_PRELOAD 的方式來使用 jemalloc,這種方式允許在 YARN 容器中分發和加載 jemalloc 庫,替代默認的 glibc 內存分配器,以優化 Flink TaskManager 的內存使用。那麼,使用 jemalloc 優化的又是哪塊內存呢?

更多大數據乾貨,歡迎關注我的微信公眾號—BigData共享

Add a new Comments

Some HTML is okay.