linux服務CPU過高,以及scala代碼優化

背景:公司的消息系統的保持長鏈接的服務(scala編寫)。在IDC的機器(12C24G)上一直運行着,一直存在CPU過高,老員工寫的2小時重啓,重啓缺失能解決問題。最近服務要上阿里雲,使用4C8G的實例。不一會CPU使用率就到了600%,負載最高達到了16。所以解決CPU過高迫在眉睫。

定位問題:jvm上運行的服務導致CPU過高網上多數寫的很清楚了。本項目是scala編寫,所以適用,三板斧:

1、top查看CPU過高進程號(PID)

2、top -H -p PID 查看CPU使用率高的線程號(TID),接着轉換十六進制 printf %x TID

3、jstack PID | grep 十六進制TID -A90

定位scala中map的findEntry方法導致的。定位代碼此處的map是存放所有用戶的鏈接信息。scala的Actor併發模型下訪問此map。應該是map環鏈問題了。

解決:

源代碼: var channelMap = Map[String, (ChannelHandlerContext, ActorRef)]() 注:查資料其value的類型是scala元組

優化使用java的支持併發的map,當時元組讓我糾結了好一會,因爲用的java類ConcurrentHashMap還想着把元組轉成java對象才能傳參。後來測試實則直接可以用,可以看出scala對java兼容。優化後代碼:

var channeMap = ConcurrentHashMap[String, (ChannelHandlerContext, ActorRef)]()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章