事故過程
昨天我做的乙個需求上預發布,剛上,準備讓測試同學驗證一下,就發現列表頁刷不出來,很快,cpu飆公升,報警郵件發個不停。
我當時沒有懷疑是我做的功能的問題,因為我做的這個功能在測試環境已經驗證過了。
但是後來leader匯出堆疊日誌,把導致cpu飆公升的方法發出來,發現就是我寫的乙個功能,當時的感覺是驚呆了。
事故分析
我拿到堆疊日誌,是如下乙個bin檔案
匯入到mat中(eclipse 的乙個外掛程式 memory analyzer).
下圖是堆疊報告的乙個概覽。
biggest objects by retained size: 這項顯示的是,堆疊日誌中物件的大小分部。這裡我直接點選了leak suspects, 檢視mat給我們生成的乙個洩露報告。actions下面有四項:
histogram:這項顯示的是每個類物件的數量列表
dominator tree: 列出最大的物件和它們儲存的東西
top consumers:按照類和包分類列印出「最昂貴」的物件。
duplicate classes:檢測被多個類load的類
reports下面有兩項:
leak suspects:包括乙個洩露懷疑和系統概覽。
top components: 列出了大小超過1%的大物件報告
可以清晰的看到mat 認為的錯誤點。
根據這個提示 我們找到**
可以看到錯誤的**出現在方法的最後一行。如果兩個if條件都不滿足,程式就到達最後一行,相當於下面**。
我測試了一下,上訴**對應的sql語句是:@test
public void test2()
select * from t;
相當於把整張表查出來了。在預發布環境,這張表有65萬條資料。測試環境 只有1800條資料。所以在測試環境不會發現問題,在預發布環境,一下子把整張表查詢出來,cpu自然會飆公升了。
解決方法
將這個方法改成下面這樣
事故總結
1. 首先是對mybatis plus 的 list() 方法要有足夠的認識
2. 單元測試要做好,每寫乙個方法最好都有對應的單元測試。如果這個方法有對應的單元測試用例,列印出對應的sql,這個問題就能在開發階段就解決
3. 壓力測試要做好。很多問題在測試環境不會出錯,但是一到預發布,正式就出錯了。就是因為壓力測試沒有做好。測試環境資料量小,很多寫法不會出現問題,但是預發布、正式環境,資料量大,使用者量也大,就會出現各種問題。
4. **qc也可以更加仔細一點。
分享我寫的CPU測試程式,看看你的CPU強勁嗎?
你是否很想知道自己的cpu到底效能如何?你是否覺得那些測試軟體太麻煩了?你是否覺得如果有免費的測試軟體就太好了?這個程式可以測試cpu整數效能 浮點數效能 快取記憶體效能和多工處理效能 還有什麼好想的呢?完全免費,綠色免安裝,簡單明瞭 記得測完之後把資料放上來,提供給大家作個比對 戀花蝶email ...
我寫的Javascript VBScript函式,
function selectbyval sel,val ooption document.createelement option sel.options.add ooption ooption.innertext all ooption.value var c val.split for b 0...
CPU的常見故障及處理方法
故障1 cpu溫度過高導致經常宕機 故障現象 電腦在啟動後,執行一段時間就會慢下來,而且經常出現無故宕機和自動重新啟動的現象。處理方法 cpu在排除了病毒和使用不當的原因後,應 檢查一下cpu和記憶體。cpu的效能是引起宕機的乙個常見原因 如果cpu的溫度過高就會導致宕機或重啟現象,可考慮更 換個好...