Netflix使用ZGC實現低延遲

banq發表於2024-03-10

由於併發垃圾收集的顯著優勢,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%,批處理時間縮短了一個小時。

相關文章