java大數據量調優

從整體上來看,對於大型網站,好比門戶網站,在面對大量用戶訪問、高併發請求方面,基本的解決方案集中在這樣幾個環節:
1.首先須要解決網絡帶寬和Web請求的高併發,須要合理的加大服務器和帶寬的投入,而且須要充分的利用系統中軟件、硬件的緩存機制,將能緩存的內容都進行緩存存儲,減小計算層和存儲層的壓力。html

2.其次須要對業務服務器和業務支撐服務器進行合理的分層,而且採用並行計算和分佈式算法對大量計算進行處理,而且在開發的過程當中須要採用Java SDK中併發包(Concurrency)進行編碼實現。算法

3.存儲層須要採用分佈式文件服務器和列式的存儲服務器進行構建,支撐海量數據的存放和讀取,而且還要對關係型數據進行深層次的配置參數優化。sql

4.咱們還須要清楚的認識到,未來根據系統運行的狀態以及平臺中不一樣的業務場景按部就班的進行調整和優化。數據庫

對於大型系統來講,採用的技術是涉及面很是廣,從硬件到軟件、編程語言、數據庫、WebServer、防火牆等各個領域都有了很高的要求。在面對大量用戶訪問、高併發請求方面,基本的解決方案集中在這樣幾個環節:將會使用高性能的服務器、高性能的數據庫、高效率的編程語言、還有高性能的Web容器。可是除了這幾個方面,還無法根本解決面臨的高負載和高併發問題,因此須要將計算和負載的壓力分載到每一個計算機上,使用不一樣的服務器集羣機組進行分佈式和並行計算,面對所產生的壓力。apache

具體每一個環節的一些經常使用手段:編程

1、應用服務器負載均衡 
一、鏈路負載均衡 
  經過DNS解析域名時,將客戶端的訪問解析成不一樣的IP,分配到不一樣的入口,同時儘量保證所訪問的入口是全部入口中可能較快的一個。 
二、軟件負載均衡 
  訪問時生成頁面的任務會被分配給其中一臺服務器完成,這個過程要保證公正、公平、平均。軟件四層交換咱們可使用Linux上經常使用的LVS來解決,LVS就是Linux Virtual Server。 
三、硬件負載均衡 設計模式

  第四層交換使用第三層和第四層信息包的報頭信息,根據應用區間識別業務流,將整個區間段的業務流分配到合適的應用服務器進行處理。在第四層交換中的應用區間則由源端和終端IP地址、TCP和UDP端口共同決定。在硬件四層交換產品領域,有一些知名的產品能夠選擇,好比Alteon、F5等。數組

最新:CDN加速技術。CDN的全稱是內容分發網絡。其目的是經過在現有的Internet中增長一層新的網絡架構,將網站的內容發佈到最接近用戶的網絡「邊緣」,使用戶能夠就近取得所需的內容,提升用戶訪問網站的響應速度。瀏覽器

2、圖片服務器分離緩存

對於Web服務器來講,不論是Apache、IIS仍是其餘容器,圖片是最消耗資源的,因而咱們有必要將圖片與頁面進行分離,這是基本上大型網站都會採用的策略,他們都有獨立的、甚至不少臺的圖片服務器。這樣的架構能夠下降提供頁面訪問請求的服務器系統壓力,而且能夠保證系統不會由於圖片問題而崩潰。在應用服務器和圖片服務器上,能夠進行不一樣的配置優化,好比apache在配置ContentType的時候能夠儘可能少支持、儘量少的LoadModule,保證更高的系統消耗和執行效率。


3、頁面優化 
一、減小請求次數 
  經過合併CSS和Javascript文件來減小請求次數或是將資源文件分佈在多個域名下來繞過瀏覽器併發加載的限制。 
二、壓縮CSS和Javascript代碼。 
  經過對文件代碼內容刪除換行和空格來減小代碼存儲空間。 
三、優化圖片 
  經過對圖片進行截取和縮放大小來優化圖片,加快圖片加載速度。 
四、HTML靜態化 
  利用FreeMarker將數據庫數據靜態化成html文件來提升訪問速度。適用場合:對於含有不要求實時性的內容的網頁可以使用,如網站首頁,各模塊首頁的新聞,公告等等。 

4、Java設計優化 
一、設計模式 
  單例模式、代理模式、享元模式、裝飾者模式、觀察者模式。 
二、緩存 
  如:使用Ehcache能夠結合AOP,作業務層的方法緩存,以類名、方法名、參數名做爲key,結果對象做爲value。適用場合:對數據不常常更新,查詢方式比較固定。 
三、緩衝 
  如:JDK的IO包中BufferedWriter 
四、多線程 
  適用場合:羣發郵件,大批量處理圖片,寫日誌。典型的消費者生產者模式 
五、對象池 
  如:數據庫鏈接池C3P0、線程池Executors、Apache的對象池Jakarta Commons Pool 
六、分佈式緩存 
  分佈式緩存框架Terracotta,可實現分佈式session、EhCachc等共享。 

5、Java程序編碼優化 
一、String 
  String的replace、substring方法會有內存泄露問題,用StringTokenizer取代split方法,charAt方法代替startsWith、endsWith方法,StringBuilder取代String並初始化預估的capacity。 
二、List 
  查詢優先使用ArrayList,插入刪除優先使用LinkedList。若是插入數據在數組最後一位,則ArrayList性能好於LinkedList。

  遍歷實現了RandomAccess接口的集合性能由高到低依次排序:索引下標>迭代器>加強for 
三、Map 
  map對象裏key值的hashCode方法決定集合的性能。 
四、優化集合訪問代碼 
  建立集合對象時,初始化預估的capacity可提升性能。儘可能使用內部元素來取代方法調用。 
五、NIO 
  使用MappedByteBuffer來取代傳統IO來進行文件讀寫。 
六、引用 
  在適當時候緩存能夠用弱引用或是軟引用來實現,如:WeakHashMap。 
七、異常 
  儘可能避免在循環體內使用異常捕獲。 
八、位運算代替乘除運算

6、數據庫優化 
一、分表 
  經過對記錄ID取模或時間維度的規則進行分表。 
二、分區 
  Oracle數據庫支持分區,能夠根據某個列的數據規則進行分區。 
三、中間表 
  將原數據根據想獲得的目標數據進行一系列的處理作出一套中間表,直接從中間表中進行查詢,經過定時調度定時更新中間表。適用場合:對數據內容實時性要求不高,如:數據分析。 
四、歷史歸檔 
  可根據時間整理出不多用到的數據集抽到歷史表中,數據表只留經常使用數據,能夠利用對象序列化反序列化來實現。適用場合:對歷史數據極少訪問。 
五、列式存儲 
  MySQL開源數據倉庫Infobright,對高壓縮比數據存儲,查詢速度可提升5~60倍,免費版不支持DML語句,不支持高併發,只能支持10多個併發查詢,可經過load導入csv數據文件。適用場合:對數據不常常更新而且實時性要求不高,如:數據分析。 
六、查詢緩存 
  MySQL Query Cache,Oracle Result Cache,可經過修改數據庫配置文件來實現查詢緩存,sql語句做爲key,結果做爲value的緩存方式,當數據表發生改變時相應的cache就會失效。適用場合:對數據不常常更新,查詢方式比較固定。注:支持錶鏈接,但不支持函數 
七、建索引 
  對於使用較複雜的sql,對大數據量表查詢時候,可採用建索引的方式,將涉及到的查詢條件字段,可提升查詢速度。 
八、sql優化 
  sql語句中,select後儘可能明確字段名來代替*來減小查詢列。儘可能少使用in關鍵字,可經過left join和exists關鍵字取代。 
九、存儲過程 
  存儲過程只需編譯一次,適用場合:當對數據庫進行復雜操做時。如:多表的查詢,計算,更新。 
十、數據庫服務器集羣,讀寫分離。 

7、JVM調優。 
一、肯定堆內存大小(-Xmx、-Xms)。 
二、合理分配新生代和老年代(-XX:NewRatio、-Xmn、-XX:SurvivorRatio)。 
三、肯定永久區大小(-XX:Permsize、-XX:MaxPermSize)。 
四、選擇垃圾收集器(CMS、G1等)、對垃圾收集器合理設置。 
五、禁用顯示GC(-XX:+DisableExplicitGC)。 
六、禁用類元數據回收(-Xnoclassgc)。 
七、禁用類驗證(-Xverify:none)。 
八、JVM增長內存參數-Xms256M -Xmx1024M  -XX:MaxNewSize=512m -XX:MaxPermSize=512m 

7、需求上解決:若是性能瓶頸的模塊的需求是無關緊要,能夠考慮屏蔽掉此需求。 

8、性能調優工具 1.JMeter、LoadRunner:性能測試、壓力測試。 2.JConsole、JProfiler:監控堆信息、線程、永久區使用狀況、類加載狀況等。 3.Visual VM:故障診斷、性能監控。

相關文章
相關標籤/搜索