網站應用服務器性能優化方案總結

最近閱讀了《大型網站技術架構————核心原理與案例分析》,總結了其中的網站應用服務器性能優化的部分。
應用服務器的性能優化大致上能夠從一下四個方向入手:html

  1. 使用緩存
  2. 使用異步
  3. 進行服務器集羣
  4. 進行代碼優化

應用服務器性能優化(一)——緩存


1、使用緩存優化網站性能

網站性能優化第必定律:優化考慮使用緩存優化性能

緩存的本質是一個內存Hash表,網站應用中,數據緩存以一對Key,Value的形式存儲在內存Hash表中。緩存主要用來存放那些讀寫比很高、不多變化的數據。git

二八定律:80%的訪問落在20%的數據上。

使用緩存須要注意的問題程序員

  1. 把頻繁修改的數據放入緩存。容易出現數據寫入緩存後,應用還來不及讀取緩存,數據就已經失效的情形,徒增系統負擔。通常來講,數據的讀寫比在2:1以上,緩存纔有意義。
  2. 沒有熱點的訪問。 緩存使用的內存資源很是寶貴,只能將最新訪問的數據緩存起來,而把歷史數據清理出緩存。即緩存資源應該留給20%的熱點數據。
  3. 數據不一致與髒讀。 通常會對緩存設置失效時間,超過失效時間,就要從數據庫從新加載。所以應用要忍受必定時間的數據不一致。另外一種策略是數據更新時當即更新緩存,不過這也會帶來更多的系統開銷和事務一致性的問題。
  4. 緩存可用性。 業務發展到必定階段時,緩存會承擔大部分數據訪問的壓力,數據庫已經習慣了有緩存的日子,因此當緩存服務器崩潰時,數據庫會由於徹底不能承受如此大的壓力而宕機,進而致使整個網站不可用。這種狀況被稱做緩存雪崩,發生這種故障,甚至不能簡單地重啓緩存服務器和數據庫服務器來恢復網站訪問。 解決方式:一、緩存熱備(當某臺服務器宕機時,將緩存訪問切換到熱備服務器上。);二、緩存服務器集羣
  5. 緩存預熱。 緩存中存放的是熱點數據,熱點數據是緩存系統用LRU對不斷訪問的數據篩選出來的,這個過程須要較長的時間。新啓動的緩存系統沒有任何數據,此時系統的性能和數據庫負載都不太好。所以能夠選擇在啓動緩存是就把熱點數據預加載好。
  6. 緩存穿透。 由於不恰當的業務或惡意攻擊,持續高併發地訪問某一個不存在的數據,若是緩存不保存該數據,就會有大量的請求壓力落在數據庫上。簡單的解決方式是把請求的不存在的數據也放進緩存,其value是null。

2、分佈式緩存

分佈式緩存架構

分佈式緩存有兩種架構方式,一種是以JBoss Cache爲表明的須要更新同步的分佈式緩存,另外一種是以Memchached爲表明的不互相通訊的分佈式緩存。github

應用服務器性能優化(二)——異步操做


使用消息隊列「削峯」

使用消息隊列將調用異步化,可改善網站的擴展性和網站的性能。
在不使用消息隊列的狀況下,用戶的請求數據直接寫入數據庫,在高併發地狀況下,會對數據庫形成巨大的壓力,同時使得響應延遲加重。
在使用消息隊列後,用戶請求的數據發送給消息隊列後當即返回,再由消息隊列的消費者進程(一般狀況下,該進程一般獨立部署在專門的服務器集羣上)從消息隊列獲取數據,異步寫入數據庫。web

注意使用消息隊列,因爲數據寫入消息隊列後當即返回給用戶,數據在後續的業務校驗寫數據庫等操做可能失敗,所以在使用消息隊列進行業務異步處理後,須要適當修改業務流程進行配合。數據庫

任何能夠晚點作的事,都應該晚點再作。編程

應用服務器性能優化(三)——集羣


  • 使用負載均衡技術爲一個應用構建一個由多臺服務器組成的服務器集羣

應用服務器性能優化(四)——代碼優化


1、多線程

因爲網站應用程序通常都被web服務器容器管理,用戶請求的多線程也一般被web容器管理,但不論是web容器管理的線程仍是應用程序本身建立的線程,一臺服務器上啓動多少線程合適呢?假設服務器上執行的都是相同類型任務,針對該類任務啓動的線程數有個簡化的估算方式可供參考:canvas

啓動進程數=[任務執行時間/(任務執行時間-IO等待時間)]xCPU內核數

最佳啓動線程數和cpu內核數量成正比,和io等待時間成正比。緩存

多線程編程須要注意線程安全問題。
編程上解決線程安全的主要手段有如下幾點:安全

  1. 把對象設計爲無狀態對象。
  2. 使用局部對象。
  3. 併發訪問資源時使用鎖。

2、 資源複用

資源複用主要有兩種模式單例對象池
單例模式的應用:目前web開發中主要使用貧血模式,從Service到Dao都是些無狀態對象,無需重複構建,天然而然用單例模式。
對象池:複用對象實例。在實踐中,應用程序的數據庫鏈接基本都使用鏈接池的方式。數據庫鏈接對象建立好之後,將鏈接對象放入對象池容器中,應用程序要鏈接的時候,就從對象池中獲取一個空閒的鏈接使用,使用完畢再將該對象歸還到對象池中便可,不須要建立新的鏈接。

3、 數據結構

靈活組合使用各類數據結構。

4、 垃圾回收

JVM分代垃圾回收機制,將應用程序可用的堆空間分爲年輕代和年老代,又將年輕代分爲Eden區,From區和To區。
若是Old Generation空間用完,就會觸發Full GC,就是所謂的全量回收,全量回收會對系統性能產生較大影響,所以應根據系統業務特色和對象生命週期,合理設置Young Generation和Old Generation大小,儘可能減小Full GC。


《大型網站技術架構————核心原理與案例分析》是一本很是不錯的書籍,對經驗不夠豐富的程序員來講,是從總體上認識如何去構建起一個大型網站的很是好的科普型書籍,在這裏安利一波。

參考文獻:《大型網站技術架構————核心原理與案例分析》(李智慧 著)

相關文章
相關標籤/搜索