2
我有一個Spring
應用程序,最近已經從測試轉移到生產環境。大部分時間CPU使用率爲2-3%。但有時(每天1或2次)它突然達到400%(有4個cpus),然後我的應用程序崩潰。發生問題時,我無法觀察到任何異常情況(例如,額外的流量)。春天的應用程序消耗所有的CPU,然後崩潰
有關我的應用程序的某些信息,
- 它由Android的客戶端叫一些REST端點。
- 它在
Service
之一中有3ScheduledTask
s。他們做了一些HttpUrlConnection
。 - 我的流量並不是很大,例如每分鐘300-400個請求,並且它大部分是穩定的,即在網絡呼叫中沒有觀察到峯值。
- 此流量的CPU使用率達到最大值%3,但問題發生的時間除外。以下是過去24小時CPU利用率的可視化:我的服務器有4個核心cpu,12 GB RAM和300 GB全SSD磁盤。 Linux的版本4.4.0-93泛型(buildd @ lgw01-03)(gcc版本5.4.0 20160609(Ubuntu的5.4.0-6ubuntu1〜16.04.4))
- 內存設置:
-d64 -Xms6g -Xmx10g -XX:MaxPermSize=512m
- 我用
sysstat
爲日誌記錄。我正在觀察CPU和RAM的使用情況,不僅針對整個系統,而且針對我的應用程序。我還想指出,內存使用峯值達到最高%60。
An example from CPU logs GC日誌和線程轉儲: 我以2分鐘的間隔記錄了GC以及線程轉儲(jstack)。正常時間,碰撞前和碰撞時沒有顯示差異。 - 日誌之間:20:30 - 06:26
- 服務器崩潰停機時間:06:26
- GC Analysis
- Thread dumps (線程轉儲1(05:40)..線程轉儲14(06: 24)) (其他線程轉儲在05:40之前)
- GC分析評論:「97.14%的時間是由於分配失敗造成的,但是它的時間是21:12:22,在9小時之前崩潰。
- 最後的錯誤日誌文件中
2017-10-09 06:26:19.393 ERROR 5986 --- [ XNIO-2 task-1] t.o.m.w.rest.errors.ExceptionTranslator : An unexpected error occurred: I/O error while reading input message; nested exception is java.io.InterruptedIOException: XNIO000808: I/O operation was interrupted
2017-10-09 06:26:19.396 ERROR 5986 --- [ XNIO-2 task-25] io.undertow.request : UT005022: Exception generating error page /error
我無法找到問題的原因。有什麼建議嗎?任何形式的幫助表示讚賞。
由於錯誤消息「I/O操作被中斷」,我的第一個猜測是,我的應用正在嘗試讀取或寫入某個文件,但是某些文件中斷了它。就像,該文件被訪問它或類似的東西被移動/刪除。很難說沒有任何代碼。 – Korashen
@Korashen IO問題不會導致CPU達到400%。因此,IO異常更可能是一個結果,而不是一個原因......該項目非常大,而且這個問題似乎並不是源於特定的一段代碼。相反,它似乎是一個GC問題。 – ram
可能,可能不是。我也會排除無盡的遞歸,因爲它會導致不同的類型或錯誤消息,並且只有一個CPU核心以100%運行。那麼,只是爲了排除它,並把它寫出來...... – Korashen