簡單地來看一個瀏覽器用戶訪問的流程: 瀏覽器->服務器->返回結果顯示
這麼簡單地看,可能想獲得的優化手段不多,常見的可能就是優化sql,加快數據庫處理;加個緩存,加快返回;使用靜態文件,減小動態計算。
細分開來看每個步驟: css
1 瀏覽器發起一個請求,若是本地有緩存會請求本地緩存文件,沒有緩存會請求服務器。因此這裏就有一個優化點:須要把經常使用的css和js文件獨立成獨立的靜態文件,一次加載之後,後面直接加載本地緩存。另外IE瀏覽器內核在請求圖片下載時會限制一次只能同時從同一個域名下載兩個文件,這裏又有優化點,分散圖片存儲的域名。使用靜態文件,減小計算的同時增長本地緩存的使用,減小請求。靜態化是常見的一種優化手段。 mysql
2 瀏覽器真實發起請求服務器時,首先被請求到的是服務器的操做系統層,那麼服務器的操做系統對外界鏈接的響應能力,就是你須要瞭解的東西了。好比linux的內核參數的調整如何影響最大鏈接數,簡單的一個例子就是在一個默認最大文件句柄數只有1024的服務器上,超過這個壓力的時候,你如何優化你的程序,也都沒有意義。入口只有那麼窄,你得把口給擴開。熟悉服務器的性能,調優系統內核也是一個必要的手段。 linux
3 系統層再把鏈接交給你的server作處理的時候,server的配置這個時候也至關重要。好比apache的最大鏈接數,tomcat的最大鏈接數。對server的配置調優很影響性能。好比tomcat在處理靜態文件上的能力比apache要差不少,因此在apache+tomcat的負載均衡就能很好地進行動靜請求的分離,提升響應速度。又好比tomcat新版本里的NIO技術又比普通IO性能好上很多。對server的瞭解,要保持跟蹤最新動態。 ajax
4 server再把數據交給你的程序處理的時候,就到了考驗你編程能力的時候了。你得對你的程序的執行效率很是清楚。必須保證每一個響應都在儘可能短的時間內執行成功。還有比較常見的一些對不常更新的數據使用內存緩存來加快訪問。內存永遠是最快的。這方面的優化也有很是很是多的事情能夠去作,並且跟你的編程息息相關。 算法
5 程序處理的時候,數據庫鏈接池的使用,鏈接池大小的配置,鏈接池性能的優化,sql語句的優化,等等均可能影響你的程序的效率,這些地方永遠是值得關注的。固然,優秀的算法在這個地方是少不了的。一個好的業務邏輯設計,可能極大提高你的程序性能。對數據庫操做的調優也是一個永遠的話題。 sql
6 數據傳遞到數據庫進行保存和查詢的時候,你就必須對你的數據庫的使用有所瞭解,知道數據庫自己的哪些配置能夠優化從而帶來性能的提高。一個簡單的例子就是在內存足夠大的時候,增大mysql的內存緩存就能夠極大提高它的響應速度。 數據庫
7 如今server把數據返回給用戶了,那麼返回的數據的大小又一樣影響着結果的顯示速度。儘可能減少數據的大小,好比開啓apache的gzip就能極大壓縮常見的靜態文件,能夠保證用戶更快完出數據的下載,同時節省你的服務器使用帶寬,老闆必定會很高興的。 apache
8 用戶下次訪問的時候,一樣面臨一個優化的方式:是利用上次跟服務器創建好的鏈接再次通信呢?仍是重現跟服務器創建鏈接?這就是在server端作配置要考慮的一個問題,在低併發下,保持跟用戶創建的socket鏈接,而且讓用戶經過這個鏈接來屢次訪問,能夠提升速度。可是在高併發下,大量這種創建好的鏈接就意味着其餘用戶失去了進來的機會。因此這個是須要權衡的。通常狀況下最好能夠預估一下一個用戶可能在多長的時間裏連續發起多少個請求,而後能夠把用戶斷開,把資源用來服務其餘用戶。 編程
9 ajax技術也是在減小大請求,使用更小的局部數據更新來代替整個頁面的刷新,加快用戶的響應速度,結合靜態化能完美改善性能。 瀏覽器
這是對一個用戶的訪問的時候的考慮,而後就要考慮多用戶狀況的問題(有些是上面提到過的):
1 操做系統對多用戶訪問時的一些限制的優化
2 server的併發量的優化
3 多用戶併發下,更多地要仔細考慮程序在數據操做的併發上的問題。好比對象的鎖,數據庫的鎖,事務,等待處理的數據的排隊方式等等。你須要知道讀寫分離的好處,應該隔離不一樣操做間的等待。另外併發帶來的鎖等待問題須要極大地關注,每每不是在內存就是在數據庫裏,發生着大量併發鎖等待,致使你的程序緩慢。
4 對數據庫的鎖的機制必須深刻了解,好比mysql不一樣引擎的帶來的鎖表和行級鎖對性能的影響。同時要在本身的邏輯處理上要控制好不一樣用戶同時操做的問題,時刻要繃緊這個弦。多數據集羣,讀寫分離等等機制也是須要深刻了解的。