Apache Flink是否会缓存作业?重复运行速度更快原因及控制方法
Flink作业重复运行耗时差异原理与调整方案
首先明确:Flink默认不存在跨作业运行的业务结果缓存复用机制,你观测到的首次运行耗时比重跑高20%的现象,来自系统层、JVM层和框架层的多类预热效应和临时缓存。
耗时差异的核心原因
- JVM即时编译(JIT)优化:首次运行作业时,JVM默认以解释模式执行字节码,运行过程中调用频率高的热点代码会被JIT动态编译为本地机器码,执行效率大幅提升,该优化带来的性能提升通常在10%~30%区间,和你观测到的20%差异完全吻合。
- 操作系统页缓存:如果作业读取的数据源存储在磁盘(包括本地磁盘、分布式存储的本地副本),首次读取后数据会被加载到操作系统的页缓存中,第二次运行作业时不需要再发起磁盘IO,直接从内存读取数据,耗时明显降低。
- Flink框架局部缓存:同一作业多次提交时,Flink会复用Session集群/TaskManager进程内的Jar包缓存、类加载缓存、序列化器缓存等,不需要重复解析Jar包、加载业务类,减少了作业初始化阶段的开销。
- 状态复用(可选):如果作业开启了Checkpoint,且配置了作业重启自动恢复状态,重跑时会直接复用已持久化的状态数据,避免了状态初始化的开销。
调整方案(用于准确测量作业运行时长)
根据你的测试目标,可以选择对应的调整手段:
方案1:模拟冷启动场景,测量首次运行的真实耗时
- 强制JVM以解释模式执行:在Flink的
conf/flink-conf.yaml中添加JVM参数:
该参数会关闭JIT编译,完全模拟冷启动的执行效率,但和生产环境实际运行性能偏差较大,仅适合冷启动场景专项测试。env.java.opts: -Xint - 每次运行前清空操作系统页缓存:Linux环境下执行命令(需要root权限):
echo 3 > /proc/sys/vm/drop_caches - 每次测试前重启Flink集群:彻底清空框架层的各类缓存,避免Jar包、类加载器等缓存的复用。
- 测试前删除所有Checkpoint、Savepoint目录,关闭作业自动恢复配置,避免状态复用。
方案2:测量作业稳定运行的性能基准
更符合生产环境实际性能的测试方式为排除预热效应,取稳定运行的性能结果:
- 正式测试前先执行3~5次预热运行,等JIT编译完成、各类缓存加载完成后,再取后续连续3次运行的平均耗时作为最终测试结果。
- 测试过程中保证集群资源独占,避免其他任务的资源抢占影响测试准确性。
性能测试最佳实践
如果你需要得到可复现、准确的性能指标,建议使用Per-Job集群模式运行测试作业,每次测试前统一重启集群、清空系统页缓存、清理所有临时文件和状态数据,固定集群资源配置和并发参数,最终取多次稳定运行的平均值作为基准指标。
内容的提问来源于stack exchange,提问作者nanobot
相关产品推荐
相关产品推荐

