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