摘要:一發生故障今天發現服務查詢一直卡住,就看了一下服務器當時就愣住了就這一個服務就把占滿了,再看了下端口號出現了大量的。
一、發生故障
今天發現服務查詢一直卡住,就看了一下服務器:
當時就愣住了就這一個服務就把CPU占滿了,再看了下端口號:
出現了大量的CLOSE_WAIT。看到這里我就只有一個想法:程序代碼有問題或者是配置的問題
二、排查為此我先重啟了服務并加上參數用jconsole查看服務狀況:
-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=10000
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
再打印GC日志:
-verbose:gc
-Xloggc:/usr/app/ydjAgent/gc_log
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
啟動參數太長了我又把它添加到環境變量里:
vim /etc/profile
export JAVA_OPTS="-Xms1024m -Xmx4096m -Djava.rmi.server.hostname=120.0.0.1 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10000 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -verbose:gc -Xloggc:/usr/app/ydjAgent/gc_log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"
根據jconsole概覽和GC日志可以看的出,是因為系統頻繁進行GC導致的:
一般情況下,young gc頻繁是正常的,full gc如果非常頻繁,一般情況下有問題的就是接口查詢中的集合的數據,存起來了,一直沒刪除,導致gc沒有及時回收。
然后將堆信息dump下來后用Eclipse memory analyze分析了一下,發現char[]數組和byte[]數組占了大部分內存。
綜上分析后查明,因為業務需要統計一個月內的所有訂單中的商品以及品牌排行,因為原有表的設計的主鍵id是UUID,服務在啟動的時候只給了最大4G內存,即使是只查詢訂單id,都占了很大一部分空間,更別說后面查詢出來的訂單信息會占用更大的內存空間,而因為這樣,數據庫的壓力和應用的壓力也會很大,應用一直處于FULL GC狀態,把cpu占滿。
三、解決辦法因為該應用和數據庫是在同一個服務器上,所以就先把應用部署到另一個服務器上然后用nginx通過內網將請求轉發,把內存設置8G,緩解原來服務器的CPU壓力,即便如此,在數據訪問的時候還是對數據庫造成了很大的壓力。因為我代碼寫的太爛了哈哈。。事發之后先向老板做了匯報,老板表示理解。。給我時間去重新設計原有的架構。。。不說了寫代碼去。。。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74324.html
摘要:年月日本文是關于記錄某次游戲服務端的性能優化此處涉及的技術包括引擎隨著游戲導入人數逐漸增加單個集合的文檔數已經超過經常有玩家反饋說卡特別是在服務器遷移后從核降到核卡頓更嚴重了遂開始排查問題確認服務器壓力首先使用命令查看總體情況此時占用不高 Last-Modified: 2019年6月13日11:08:19 本文是關于記錄某次游戲服務端的性能優化, 此處涉及的技術包括: MongoDB...
摘要:年月日本文是關于記錄某次游戲服務端的性能優化此處涉及的技術包括引擎隨著游戲導入人數逐漸增加單個集合的文檔數已經超過經常有玩家反饋說卡特別是在服務器遷移后從核降到核卡頓更嚴重了遂開始排查問題確認服務器壓力首先使用命令查看總體情況此時占用不高 Last-Modified: 2019年6月13日11:08:19 本文是關于記錄某次游戲服務端的性能優化, 此處涉及的技術包括: MongoDB...
摘要:當然,如果你的核心數夠多,到個線程的并行度不滿足的話,也可以自定義一個線程池來執行,不過這樣的話,要注意自己維護這個線程池的初始化,釋放等等操作了。 事情起源于一個bug排查,一個AsyncTask的子類,執行的時候發現onPreExecute方法執行了,doInBackground卻遲遲沒有被調用。懂AsyncTask一些表面原理的都知道,onPreExecute方法是在主線程執行,...
閱讀 533·2023-04-26 01:39
閱讀 4485·2021-11-16 11:45
閱讀 2610·2021-09-27 13:37
閱讀 882·2021-09-01 10:50
閱讀 3579·2021-08-16 10:50
閱讀 2217·2019-08-30 15:55
閱讀 2979·2019-08-30 15:55
閱讀 2259·2019-08-30 14:07