多線併發優化(tomcat)

先說下問題是怎麼來的吧。html

項目背景:如今正在作的是一個爬蟲項目,爬蟲主要爬取各大電商的商品數據,而後清洗進入索引庫,爲客戶提供搜索導購服務(說白了就是導購服務)。爬取這些數據的要求:實時性、準確性。重點是實時性,須要爬蟲保證天天至少爬取一遍這些數據,對商品庫進行更新。那麼問題就來了,爬蟲確定是多線程的,並且要求執行效率要特別高,就是要快。從第一個版本的純手工方式,到第二個版本的多線程調度和任務分配(主要是方便監控)。linux

問題表現:項目在本機跑起來100個線程毫無壓力,並且cpu利用率也特別好。因此就直接部署到了測試環境的服務器上,跑了一個晚上次日早上依賴發現內存溢出了,並且這個溢出之前沒怎麼見過,通常你們場景的內存溢出都是Java heap space或PermGen space ,而我此次遇到的是GC overhead limit exceeded,相信你們也不多遇到。(若是你們遇到前面兩種請參考java內存溢出的三種狀況和解決方案windows

解決思路:tomcat

    一、首先確定是百度咯,百度不行翻出去google咯,找一些資料看了下,官方也有說明。問題根本緣由是jvm gc行爲中超過98%以上的時間去釋放小於2%的堆空間時會報這個錯誤。服務器

    二、爲何本機能夠,到了測試服務器上不行了,而後一看服務器內存竟然4G,運維的兄弟太坑了,給分那麼點,我筆記本都是8g呢。後來先要求加內存到8G,可是仍是沒解決根本問題。多線程

    三、查看了下內存使用狀況,仍是溢出了,致使新的線程沒法建立,測試服務器使用線程池開了300個線程,不至於啊。因此只有修改tomcat的默認配置了,其實就加了2個參數,(linux就修改catalina.sh,windows固然是修改catalina.bat,加在文件的開頭)運維

HEAP_SIZE="6000M"
NEW_SIZE="4200M"jvm

      另外還多加了兩個參數 ,提供jconsole鏈接的,方便監控jvm,若是再出問題就得靠這玩意兒了。ide

SERVER_IP="192.168.16.12"
SERVER_PORT="1909"測試

            下圖是鏈接jconsole後監控的界面,你們會發現GC頻率並不高,可是很高效

相關文章
相關標籤/搜索