Spark應用程序處理的大數據多是運行於JVM上的,經常要面對GC優化問題。下面給出由於Linux系統原因導致的GC耗時異常的處理方式:
打開Spark的GC日志,在spark-env.sh文件中的SPARK_JAVA_OPTS參數上添加 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
如果每次GC回收的量基本相同,但是在某一時間點,耗時異常大,這種情況下,有兩種可能:
1、GC收集對象所在內存被swap了
2、GC線程進入IO等待狀態,因為系統IO繁忙
這兩種情況可以由GC日志的/user/sys/real的值得pattern來識別,如果為Low user time,high system time,long GC pause說明數據內存被swap了,如果是Low user time,low system time,long GC pause說明GC線程進入IO等待狀態。
處理方式:
對於情況1,確保JVM內存不被swap,可以啟動參數-XX:+AlwaysPreTouch執行sysctl -w vm.swappiness=0 禁用swap
對於情況2,均勻系統IO負載,可以通過執行
sysctl -w vm.dirty_writeback_cenisecs=500
sysctl -w vm.dirty_expire_centisecs=500來實現