2017-10-09 54 views
2

我有一個Spring應用程序,最近已經從測試轉移到生產環境。大部分時間CPU使用率爲2-3%。但有時(每天1或2次)它突然達到400%(有4個cpus),然後我的應用程序崩潰。發生問題時,我無法觀察到任何異常情況(例如,額外的流量)。春天的應用程序消耗所有的CPU,然後崩潰

有關我的應用程序的某些信息,

  • 它由Android的客戶端叫一些REST端點。
  • 它在Service之一中有3 ScheduledTask 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

我無法找到問題的原因。有什麼建議嗎?任何形式的幫助表示讚賞。

+0

由於錯誤消息「I/O操作被中斷」,我的第一個猜測是,我的應用正在嘗試讀取或寫入某個文件,但是某些文件中斷了它。就像,該文件被訪問它或類似的東西被移動/刪除。很難說沒有任何代碼。 – Korashen

+0

@Korashen IO問題不會導致CPU達到400%。因此,IO異常更可能是一個結果,而不是一個原因......該項目非常大,而且這個問題似乎並不是源於特定的一段代碼。相反,它似乎是一個GC問題。 – ram

+1

可能,可能不是。我也會排除無盡的遞歸,因爲它會導致不同的類型或錯誤消息,並且只有一個CPU核心以100%運行。那麼,只是爲了排除它,並把它寫出來...... – Korashen

回答

2

正如無價的評論指出的那樣,這個問題不是來自垃圾收集。原因是完全不同的。花了大約一個星期才弄明白,所以我寫了這裏,以防其他人面臨同樣的問題。

首先,我沒有在問題中包含(因爲我沒有認爲它很重要),所以我使用了JHipster,它最近換成了Undertow作爲應用程序服務器。

在深入細節之後,我觀察到消耗CPU的線程爲XNIO線程。我曾在幾個網站上看到一些使用由XNIO供電的應用程序服務器的人也遇到同樣的問題。由於Undertow使用XNIO,因此我將Undertow更改爲Tomcat,問題得到解決。