現(xiàn)象
通過CAT埋點,發(fā)現(xiàn)在35~36分鐘時候,出現(xiàn)JVM的GC耗時異常

通過跳板機登錄機器,找到GC日志進行查看,如下圖

在顯示的最后一行中,我們看到其中user=0,sys=0,real=4.31s,表示JVM經歷了長達4s多的STW,也即在這段時間內,該機器是無法對外提供服務的,請求到達該機器,最終只能超時返回。
排查
根據經驗,這種 real > user + sys 的情況,大概率是內存的swap和密集型的IO造成的,可以順著這個思路進行排查,這時候就突顯了系統(tǒng)監(jiān)控的重要性了,通過查看IO監(jiān)控

我們可以發(fā)現(xiàn),在對應的時間上確實存在大量的IO操作。
為什么頻繁IO會引起長時間GC
在發(fā)生GC時,需要把相關數(shù)據寫入GC日志,在寫入期間,因為write()系統(tǒng)調用導致了暫停。這種日志的寫操作,即使在異步、緩存IO或非阻塞IO模式下,還是有可能因為系統(tǒng)機制(比如頁面緩存的回寫),導致長時間的阻塞。

如何減輕因為IO造成的影響?
可以將Java日志文件移動到一個單獨的或高性能的磁盤驅動器(例如SSD, tmpfs)