最近閱讀了《大型網站技術架構————核心原理與案例分析》,總結了其中的網站應用服務器性能優化的部分。
應用服務器的性能優化大致上能夠從一下四個方向入手:html
應用服務器性能優化(一)——緩存
網站性能優化第必定律:優化考慮使用緩存優化性能
緩存的本質是一個內存Hash表,網站應用中,數據緩存以一對Key,Value的形式存儲在內存Hash表中。緩存主要用來存放那些讀寫比很高、不多變化的數據。git
二八定律:80%的訪問落在20%的數據上。
使用緩存須要注意的問題:程序員
分佈式緩存架構
分佈式緩存有兩種架構方式,一種是以JBoss Cache爲表明的須要更新同步的分佈式緩存,另外一種是以Memchached爲表明的不互相通訊的分佈式緩存。github
應用服務器性能優化(二)——異步操做
使用消息隊列將調用異步化,可改善網站的擴展性和網站的性能。
在不使用消息隊列的狀況下,用戶的請求數據直接寫入數據庫,在高併發地狀況下,會對數據庫形成巨大的壓力,同時使得響應延遲加重。
在使用消息隊列後,用戶請求的數據發送給消息隊列後當即返回,再由消息隊列的消費者進程(一般狀況下,該進程一般獨立部署在專門的服務器集羣上)從消息隊列獲取數據,異步寫入數據庫。web
注意使用消息隊列,因爲數據寫入消息隊列後當即返回給用戶,數據在後續的業務校驗寫數據庫等操做可能失敗,所以在使用消息隊列進行業務異步處理後,須要適當修改業務流程進行配合。數據庫
任何能夠晚點作的事,都應該晚點再作。編程
應用服務器性能優化(三)——集羣
應用服務器性能優化(四)——代碼優化
因爲網站應用程序通常都被web服務器容器管理,用戶請求的多線程也一般被web容器管理,但不論是web容器管理的線程仍是應用程序本身建立的線程,一臺服務器上啓動多少線程合適呢?假設服務器上執行的都是相同類型任務,針對該類任務啓動的線程數有個簡化的估算方式可供參考:canvas
啓動進程數=[任務執行時間/(任務執行時間-IO等待時間)]xCPU內核數
最佳啓動線程數和cpu內核數量成正比,和io等待時間成正比。緩存
多線程編程須要注意線程安全問題。
編程上解決線程安全的主要手段有如下幾點:安全
資源複用主要有兩種模式單例和對象池。
單例模式的應用:目前web開發中主要使用貧血模式,從Service到Dao都是些無狀態對象,無需重複構建,天然而然用單例模式。
對象池:複用對象實例。在實踐中,應用程序的數據庫鏈接基本都使用鏈接池的方式。數據庫鏈接對象建立好之後,將鏈接對象放入對象池容器中,應用程序要鏈接的時候,就從對象池中獲取一個空閒的鏈接使用,使用完畢再將該對象歸還到對象池中便可,不須要建立新的鏈接。
靈活組合使用各類數據結構。
JVM分代垃圾回收機制,將應用程序可用的堆空間分爲年輕代和年老代,又將年輕代分爲Eden區,From區和To區。
若是Old Generation空間用完,就會觸發Full GC,就是所謂的全量回收,全量回收會對系統性能產生較大影響,所以應根據系統業務特色和對象生命週期,合理設置Young Generation和Old Generation大小,儘可能減小Full GC。
《大型網站技術架構————核心原理與案例分析》是一本很是不錯的書籍,對經驗不夠豐富的程序員來講,是從總體上認識如何去構建起一個大型網站的很是好的科普型書籍,在這裏安利一波。
參考文獻:《大型網站技術架構————核心原理與案例分析》(李智慧 著)