網站應用程式伺服器效能最佳化方案總結

來源:互聯網
上載者:User

標籤:auto   攻擊   就會   簡化   legend   架構   hash表   mon   擷取資料   

最近閱讀了《大型網站技術架構————核心原理與案例分析》,總結了其中的網站應用程式伺服器效能最佳化的部分。
應用伺服器的效能最佳化大體上可以從一下四個方向入手:

  1. 使用緩衝
  2. 使用非同步
  3. 進行伺服器叢集
  4. 進行代碼最佳化
應用伺服器效能最佳化(一)——緩衝
一、使用緩衝最佳化網站效能
網站效能最佳化第一定律:最佳化考慮使用緩衝最佳化效能

緩衝的本質是一個記憶體Hash表,網站應用程式中,資料緩衝以一對Key,Value的形式儲存在記憶體Hash表中。緩衝主要用來存放那些讀寫比很高、很少變化的資料。

二八定律:80%的訪問落在20%的資料上。

使用緩衝需要注意的問題

  1. 把頻繁修改的資料放入緩衝。容易出現資料寫入緩衝後,應用還來不及讀取緩衝,資料就已經失效的情形,徒增系統負擔。一般來說,資料的讀寫比在2:1以上,緩衝才有意義。
  2. 沒有熱點的訪問。 緩衝使用的記憶體資源非常寶貴,只能將最新訪問的資料緩衝起來,而把曆史資料清理出緩衝。即緩衝資源應該留給20%的熱點資料。
  3. 資料不一致與髒讀。 一般會對緩衝設定失效時間,超過失效時間,就要從資料庫重新載入。因此應用要忍受一定時間的資料不一致。另一種策略是資料更新時立即更新緩衝,不過這也會帶來更多的系統開銷和事務一致性的問題。
  4. 緩衝可用性。 業務發展到一定階段時,緩衝會承擔大部分資料訪問的壓力,資料庫已經習慣了有緩衝的日子,所以當快取服務器崩潰時,資料庫會因為完全不能承受如此大的壓力而宕機,進而導致整個網站不可用。這種情況被稱作緩衝雪崩,發生這種故障,甚至不能簡單地重啟快取服務器和資料庫伺服器來恢複網站訪問。 解決方式:1、緩衝熱備(當某台伺服器宕機時,將緩衝訪問切換到熱備伺服器上。);2、快取服務器叢集
  5. 緩衝預熱。 緩衝中存放的是熱點資料,熱點資料是緩衝系統用LRU對不斷訪問的資料篩選出來的,這個過程需要較長的時間。新啟動的緩衝系統沒有任何資料,此時系統的效能和資料庫負載都不太好。因此可以選擇在啟動緩衝是就把熱點資料預先載入好。
  6. 緩衝穿透。 因為不恰當的業務或惡意攻擊,持續高並發地訪問某一個不存在的資料,如果緩衝不儲存該資料,就會有大量的請求壓力落在資料庫上。簡單的解決方式是把請求的不存在的資料也放進緩衝,其value是null。
二、分布式緩衝
分布式緩衝架構

分布式緩衝有兩種架構方式,一種是以JBoss Cache為代表的需要更新同步的分布式緩衝,另一種是以Memchached為代表的不互相通訊的分布式緩衝。

應用伺服器效能最佳化(二)——非同步作業
使用訊息佇列“削峰”

使用訊息佇列將調用非同步化,可改善網站的擴充性和網站的效能。
在不使用訊息佇列的情況下,使用者的請求資料直接寫入資料庫,在高並發地情況下,會對資料庫造成巨大的壓力,同時使得響應延遲加劇。
在使用訊息佇列後,使用者請求的資料發送給訊息佇列後立即返回,再由訊息佇列的消費者進程(通常情況下,該進程通常獨立部署在專門的伺服器叢集上)從訊息佇列擷取資料,非同步寫入資料庫。

注意使用訊息佇列,由於資料寫入訊息佇列後立即返回給使用者,資料在後續的業務校正寫資料庫等操作可能失敗,因此在使用訊息佇列進行業務非同步處理後,需要適當修改商務程序進行配合。

任何可以晚點做的事,都應該晚點再做。

應用伺服器效能最佳化(三)——叢集
  • 使用負載平衡技術為一個應用構建一個由多台伺服器組成的伺服器叢集
應用伺服器效能最佳化(四)——代碼最佳化
一、多線程

由於網站應用程式程式一般都被web伺服器容器管理,使用者請求的多線程也通常被web容器管理,但不管是web容器管理的線程還是應用程式自己建立的線程,一台伺服器上啟動多少線程合適呢?假設伺服器上執行的都是相同類型任務,針對該類任務啟動的線程數有個簡化的估算方式可供參考:

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

最佳啟動線程數和cpu核心數量成正比,和io等待時間成正比。

多線程編程需要注意安全執行緒問題。
編程上解決安全執行緒的主要手段有以下幾點:

  1. 把對象設計為無狀態對象。
  2. 使用局部對象。
  3. 並發訪問資源時使用鎖。
二、 資源複用

資源複用主要有兩種模式單例對象池
單例模式的應用:目前web開發中主要使用貧血模式,從Service到Dao都是些無狀態對象,無需重複構建,自然而然用單例模式。
對象池:複用對象執行個體。在實踐中,應用程式的資料庫連接基本都使用串連池的方式。資料庫連接對象建立好以後,將連線物件放入對象池容器中,應用程式要串連的時候,就從對象池中擷取一個閒置串連使用,使用完畢再將該對象歸還到對象池中即可,不需要建立新的串連。

三、 資料結構

靈活組合使用各種資料結構。

四、 記憶體回收

JVM分代記憶體回收機制,將應用程式可用的堆空間分為年輕代和年老代,又將年輕代分為Eden區,From區和To區。
如果Old Generation空間用完,就會觸發Full GC,就是所謂的全量回收,全量回收會對系統效能產生較大影響,因此應根據系統業務特點和對象生命週期,合理設定Young Generation和Old Generation大小,盡量減少Full GC。

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

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

 

 

 

 

 

 

 

網站應用程式伺服器效能最佳化方案總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.