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


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

  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。


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

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

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM