標籤:連接埠 關係 left join web伺服器 res 享元模式 設計最佳化 寫日誌 pool
從總體上來看,對於大型網站,比如門戶網站,在面對大量使用者訪問、高並發請求方面,基本的解決方案集中在這樣幾個環節:
1.首先需要解決網路頻寬和Web請求的高並發,需要合理的加大伺服器和頻寬的投入,並且需要充分的利用系統中軟體、硬體的緩衝機制,將能緩衝的內容都進行緩衝儲存,減少計算層和儲存層的壓力。
2.其次需要對商務服務器和業務支撐伺服器進行合理的分層,並且採用並行計算和分布式演算法對大量計算進行處理,並且在開發的過程中需要採用Java SDK中並發包(Concurrency)進行編碼實現。
3.儲存層需要採用分布式檔案伺服器和列式的儲存伺服器進行構建,支撐海量資料的存放和讀取,並且還要對關係型資料進行深層次的配置參數最佳化。
4.我們還需要清楚的認識到,將來根據系統啟動並執行狀態以及平台中不同的業務情境循序漸進的進行調整和最佳化。
對於大型系統來說,採用的技術是涉及面非常廣,從硬體到軟體、程式設計語言、資料庫、WebServer、防火牆等各個領域都有了很高的要求。在面對大量使用者訪問、高並發請求方面,基本的解決方案集中在這樣幾個環節:將會使用高效能的伺服器、高效能的資料庫、高效率的程式設計語言、還有高效能的Web容器。但是除了這幾個方面,還沒法根本解決面臨的高負載和高並發問題,所以需要將計算和負載的壓力分載到每個電腦上,使用不同的伺服器叢集機組進行分布式和並行計算,面對所產生的壓力。
具體每個環節的一些常用手段:
一、應用伺服器負載平衡
1、鏈路負載平衡
通過DNS解析網域名稱時,將用戶端的訪問解析成不同的IP,分配到不同的入口,同時儘可能保證所訪問的入口是所有入口中可能較快的一個。
2、軟體負載平衡
訪問時產生頁面的任務會被分配給其中一台伺服器完成,這個過程要保證公正、公平、平均。軟體四層交換我們可以使用Linux上常用的LVS來解決,LVS就是Linux Virtual Server。
3、硬體負載平衡
第四層交換使用第三層和第四層資訊包的前序資訊,根據應用區間識別業務流,將整個區間段的業務流分配到合適的應用伺服器進行處理。在第四層交換中的應用區間則由源端和終端IP地址、TCP和UDP連接埠共同決定。在硬體四層交換產品領域,有一些知名的產品可以選擇,比如Alteon、F5等。
最新:CDN加速技術。CDN的全稱是內容分髮網絡。其目的是通過在現有的Internet中增加一層新的網路架構,將網站的內容發布到最接近使用者的網路“邊緣”,使使用者可以就近取得所需的內容,提高使用者訪問網站的響應速度。
二、圖片伺服器分離
對於Web伺服器來說,不管是Apache、IIS還是其他容器,圖片是最消耗資源的,於是我們有必要將圖片與頁面進行分離,這是基本上大型網站都會採用的策略,他們都有獨立的、甚至很多台的圖片伺服器。這樣的架構可以降低提供頁面訪問請求的伺服器系統壓力,並且可以保證系統不會因為圖片問題而崩潰。在應用伺服器和圖片伺服器上,可以進行不同的配置最佳化,比如apache在配置ContentType的時候可以盡量少支援、儘可能少的LoadModule,保證更高的系統消耗和執行效率。
三、頁面最佳化
1、減少請求次數
通過合并CSS和Javascript檔案來減少請求次數或是將資源檔分布在多個網域名稱下來繞過瀏覽器並發載入的限制。
2、壓縮CSS和Javascript代碼。
通過對檔案代碼內容刪除換行和空格來減少代碼儲存空間。
3、最佳化圖片
通過對圖片進行截取和縮放大小來最佳化圖片,加快圖片載入速度。
4、HTML靜態化
利用FreeMarker將資料庫資料靜態化成html檔案來提高訪問速度。適用場合:對於含有不要求即時性的內容的網頁可使用,如網站首頁,各模組首頁的新聞,公告等等。
四、Java設計最佳化
1、設計模式
單例模式、代理模式、享元模式、裝飾者模式、觀察者模式。
2、緩衝
如:使用Ehcache可以結合AOP,做業務層的方法緩衝,以類名、方法名、參數名作為key,結果對象作為value。適用場合:對資料不經常更新,查詢方式比較固定。
3、緩衝
如:JDK的IO包中BufferedWriter
4、多線程
適用場合:群發郵件,大批量處理圖片,寫日誌。典型的消費者生產者模式
5、對象池
如:資料庫連接池C3P0、線程池Executors、Apache的對象池Jakarta Commons Pool
6、分布式緩衝
分布式緩衝架構Terracotta,可實現分布式session、EhCachc等共用。
五、Java程式編碼最佳化
1、String
String的replace、substring方法會有記憶體泄露問題,用StringTokenizer取代split方法,charAt方法代替startsWith、endsWith方法,StringBuilder取代String並初始化預估的capacity。
2、List
查詢優先使用ArrayList,插入刪除優先使用LinkedList。如果插入資料在數組最後一位,則ArrayList效能好於LinkedList。
遍曆實現了RandomAccess介面的集合效能由高到低依次排序:索引下標>迭代器>增強for
3、Map
map對象裡key值的hashCode方法決定集合的效能。
4、最佳化集合存取碼
建立集合對象時,初始化預估的capacity可提高效能。盡量使用內部元素來取代方法調用。
5、NIO
使用MappedByteBuffer來取代傳統IO來進行檔案讀寫。
6、引用
在適當時候緩衝可以用弱引用或是軟引用來實現,如:WeakHashMap。
7、異常
盡量避免在迴圈體內使用異常捕獲。
8、位元運算代替乘除運算
六、資料庫最佳化
1、分表
通過對記錄ID模數或時間維度的規則進行分表。
2、分區
Oracle資料庫支援分區,可以根據某個列的資料規則進行分區。
3、中間表
將原資料根據想得到的目標資料進行一系列的處理做出一套中間表,直接從中間表中進行查詢,通過定時調度定時更新中間表。適用場合:對資料內容即時性要求不高,如:資料分析。
4、曆史歸檔
可根據時間整理出很少用到的資料集抽到曆史表中,資料表只留常用資料,可以利用對象序列化還原序列化來實現。適用場合:對曆史資料極少訪問。
5、列式儲存
MySQL開來源資料倉庫Infobright,對高壓縮比資料存放區,查詢速度可提高5~60倍,免費版不支援DML語句,不支援高並發,只能支援10多個並發查詢,可通過load匯入csv資料檔案。適用場合:對資料不經常更新並且即時性要求不高,如:資料分析。
6、查詢快取
MySQL Query Cache,Oracle Result Cache,可通過修改資料庫設定檔來實現查詢快取,sql語句作為key,結果作為value的緩衝方式,當資料表發生改變時相應的cache就會失效。適用場合:對資料不經常更新,查詢方式比較固定。註:支援表串連,但不支援函數
7、建索引
對於使用較複雜的sql,對大資料量表查詢時候,可採用建索引的方式,將涉及到的查詢條件欄位,可提高查詢速度。
8、sql最佳化
sql語句中,select後盡量明確欄位名來代替*來減少查詢列。盡量少使用in關鍵字,可通過left join和exists關鍵字取代。
9、預存程序
預存程序只需編譯一次,適用場合:當對資料庫進行複雜操作時。如:多表的查詢,計算,更新。
10、資料庫伺服器叢集,讀寫分離。
七、JVM調優。
1、確定堆記憶體大小(-Xmx、-Xms)。
2、合理分配新生代和老年代(-XX:NewRatio、-Xmn、-XX:SurvivorRatio)。
3、確定永久區大小(-XX:Permsize、-XX:MaxPermSize)。
4、選擇垃圾收集器(CMS、G1等)、對垃圾收集器合理設定。
5、禁用顯示GC(-XX:+DisableExplicitGC)。
6、禁用類別中繼資料回收(-Xnoclassgc)。
7、禁用類驗證(-Xverify:none)。
8、JVM增加記憶體參數-Xms256M -Xmx1024M -XX:MaxNewSize=512m -XX:MaxPermSize=512m
七、需求上解決:如果效能瓶頸的模組的需求是可有可無,可以考慮屏蔽掉此需求。
八、效能調優工具
1.JMeter、LoadRunner:效能測試、壓力測試。
2.JConsole、JProfiler:監控堆資訊、線程、永久區使用方式、類載入情況等。
3.Visual VM:故障診斷、效能監控。
java大資料處理調優