記一次CPU太高排查過程

存在的問題

上週忽然在部署一點很簡單的新業務以後,上線沒多久忽然OOM,大部分接口訪問超時,甚至有的直接失敗,剛開始覺得是查詢了什麼了大數據致使的,結果看了下CPU,300%。java

排查思路

最開始我先看了下日誌,以下:spring

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
### The error may exist in file [/Users/bingfeng/Documents/mochuCode/service-ecook/target/classes/mybatis/mapper/CollectionSortMapper.xml]
### The error may involve cn.ecook.core.mapper.CollectionSortMapper.selectTopSortCollectionWithDays
### The error occurred while handling results
### SQL: select sortid as id ,count(*) as `number` from `collection_sort_collection`          WHERE  createtime between concat(?, ' 00:00:00') and concat(?, ' 23:59:59')          group by sortid         order by `number` DESC LIMIT ?
### Cause: java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440)
    at com.sun.proxy.$Proxy97.selectList(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:223)
    at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:147)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:80)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:93)
    at com.sun.proxy.$Proxy166.selectTopSortCollectionWithDays(Unknown Source)

日誌當時只有這種報錯,最開始我覺得這就是簡單的索引越界異常,沒在乎,把這塊問題過掉了。apache

分析CPU高的進程

到這裏咱們就須要經過堆棧信息去進行分析,看究竟是哪裏的出現了問題,下面是具體的步驟:mybatis

  • 根據進程號查詢查看進程中各個線程的資源使用率
top -Hp 2159

這裏的CPU是恢復後的,當時的結果CPU前三個都是99%。
app

  • 將線程id轉換爲16進制大數據

    printf "%x\n" 2205

  • 打印堆棧信息ui

    jstack 2159 | grep -10 89d

經過下面的狀態,能夠發現,出現接口訪問慢的緣由是由於全部的線程阻塞致使的,再往下能夠發現致使這些問題的緣由是查詢SQL致使的。那麼咱們就把最新提交的代碼看看,哪裏進行了SQL查詢。
spa

問題定位

經過排查發現,有這麼一段代碼,這是SQL查詢結果的實體,就是由於使用了@Builder註解,沒有顯式的提供構造,才致使CPU一直飆升。線程

再使用Builder以後,必定要顯式的聲明構造方法日誌

反思

出現這種問題我以爲就兩個緣由:

  • 一、自測不到位;
  • 二、規範不夠(要是規範到位,實體類不可能出現沒有構造的狀況);
相關文章
相關標籤/搜索