Netflix使用ZGC实现低延迟

由于并发垃圾收集的显着优势,Netflix 在 JDK 21 及更高版本上默认从 G1 切换到分代 ZGC。

超过一半的关键流视频服务现在都在带有 Generational ZGC 的 JDK 21 上运行。

GC 暂停是尾延迟的重要来源,使用ZGC 暂停通常低于一毫秒。

与 G1 相比,ZGC 改善了平均延迟和 P99 延迟,且 CPU 利用率相同或更高。

使用大页面的JVM设置:

  • 将堆最小值和最大值设置为相等大小
  • 配置 -XX:+UseTransparentHugePages -XX:+AlwaysPreTouch
  • 使用以下透明_hugepage 配置:

echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo advise | sudo tee /sys/kernel/mm/transparent_hugepage/shmem_enabled
echo defer | sudo tee /sys/kernel/mm/transparent_hugepage/defrag
echo 1 | sudo tee /sys/kernel/mm/transparent_hugepage/khugepaged/defrag

哪些工作负载不适合ZGC?
没有最好的垃圾收集器。根据垃圾收集器的目标,每个垃圾收集器都要在收集吞吐量、应用延迟和资源利用率之间进行权衡。

对于使用 G1 和 ZGC 时表现更好的工作负载,我们发现G1往往更注重吞吐量,分配率非常高,而且长时间运行的任务会在不可预测的时间段内保留对象。

默认切换到 ZGC 为应用程序所有者提供了一个绝佳的机会,让他们可以考虑选择垃圾回收器:

  • 一些批处理/预计算案例默认使用 G1,而其实并行收集器的吞吐量会更好。
  • 在一个大型预计算工作负载中,我们发现使用了ZGC 以后,与 G1 相比,应用程序吞吐量提高了 6-8%,批处理时间缩短了一个小时。