Flink1.10內存模型

Flink1.10的內存管理髮生部分變化,筆者基於官方文檔對主要變更做了分析,將Flink1.10中內存設置等總結出本文。

Flink1.10內存模型

Flink內存模型
如上圖,最外層是Flink進程內存,即Flink相關進程的JVM內存,通常容器部署設置這個參數即可。內層的 Total Flink Memory是去除部分JVM元數據區等內存後的部分,通常獨立集羣設置這個參數即可。其次,Flink總內存分爲堆上內存和非堆內存。注意,非堆內存包括了直接內存和Flink Managed內存。Flink Managed內存在1.10之前是可配置使用堆內存或非堆內存的,1.10中其被固定爲使用Native內存。
此外,注意查看上圖中的虛線,JVM特定內存不屬於Flink總內存中。

Flink1.10內存設置

如下給出官方推進的3種內存設置方式,Flink各種部分內存大多數都有默認值,或默認比例值,因此只需要給出部分關鍵內存配置即可。

方式1

指定 taskmanager.memory.flink.size 參數,該參數表示Flink佔用的總內存,各部分的內存都基於此總內存按照比例等其他方法計算得出。

方式2

指定 taskmanager.memory.process.size,該參數區別於 taskmanager.memory.flink.size,少了JVM特定內存。

方式3

指定 taskmanager.memory.task.heap.size 和 taskmanager.memory.managed.size,即直接指定了堆內存和Flink Managed內存的大小。

Flink1.10內存驗證

筆者通過Flink1.10的下載包部署單機Flink獨立集羣對內存做了驗證。配置基於默認配置微調,主要調整爲註釋 taskmanager.memory.process.size,解除註釋 taskmanager.memory.flink.size,這符合前文所講,獨立集羣推進使用方式1設置內存。
按照此設置啓動之後,通過 ps -ef 命中查看TaskManager的JVM啓動參數如下。

-Xmx536870902(512MB) -Xms536870902(512MB)

-XX:MaxDirectMemorySize=268435458 (256MB)

-D taskmanager.memory.framework.off-heap.size=134217728b(128MB)框架非堆內存

-D taskmanager.memory.network.max=134217730b (128MB)網絡內存最大

-D taskmanager.memory.network.min=134217730b (128MB)網絡內存最小

-D taskmanager.memory.framework.heap.size=134217728b (128MB)框架堆內存

-D taskmanager.memory.managed.size=536870920b(512MB)Flink Managed內存

-D taskmanager.memory.task.heap.size=402653174b(384MB)用戶堆內存

-D taskmanager.memory.task.off-heap.size=0b (128MB)用戶非堆內存

如上,這些內存實際計算邏輯如下。
總內存 = 1280MB(1.10下載包的默認配置值)
網絡內存 = 總內存 * 0.1 = 128MB(默認比例,默認最大最小限制)
Flink Managed內存 = 總內存 * 0.4 = 512MB(默認比例)
框架堆內存 = 128MB(默認值)
框架堆下內存 = 128MB(默認值)
用戶堆下內存 = 0MB(默認值)
用戶堆內存 = 總內存 - 網絡內存 - Flink Managed內存 - 框架堆內存 - 框架堆下內存 - 用戶堆下內存 = 384MB

總體計算關係即爲如上,具體部分是默認值,以及默認比例,默認限制等,這些默認值會在後文中講Flink內存相關參數時給出。

Flink1.10內存參數

參數 參數類型 默認值 描述
taskmanager.memory.flink.size MemorySize None 總內存設置(不包括JVM特定內存)
taskmanager.memory.managed.fraction Float 0.4 Flink Managed內存比例(Native內存)
taskmanager.memory.managed.size MemorySize None Flink Managed內存(優先於比例)(Native內存)
taskmanager.memory.network.fraction Float 0.1 網絡緩衝區內存(直接內存)
taskmanager.memory.framework.off-heap.size MemorySize 128mb 框架堆下內存(直接內存)
taskmanager.memory.task.off-heap.size MemorySize 0 用戶堆下內存(直接內存)
taskmanager.memory.framework.heap.size MemorySize 128mb 框架堆內存
taskmanager.memory.task.heap.size MemorySize None 用戶堆內存
taskmanager.memory.jvm-metaspace.size MemorySize 256MB 總內存設置(不包括JVM特定內存)

其他

注意,對於流任務來說,Flink Managed內存並無用,可以設置很小即可。

筆者推薦

下面是針對流任務,機器可用內存在60G+情況配置。
taskmanager.memory.flink.size: 40960m(儘可能取整,方便內存認爲計算和管理)
taskmanager.memory.framework.heap.size: 512m
taskmanager.memory.framework.off-heap.size: 512m
taskmanager.memory.managed.size: 512m(流任務不需要設置太高)
taskmanager.memory.network.fraction: 0.1
taskmanager.memory.network.min: 1gb
taskmanager.memory.network.max: 2gb
taskmanager.memory.segment-size: 128kb(此參數根據具體情況調整)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章