有個問題是:當你有一個功能發佈到生產環境後,發現服務器壓力驟增,這時該怎麼排查?程序員
首先服務器性能的指標無外乎是那幾個:CPU、內存和磁盤I\O。算法
要優化服務器性能也無外乎是幾個方面:優化代碼、優化數據庫和使用靜態數據。數據庫
能夠從優化的角度去排查,就能發現服務器壓力驟增的緣由。數組
優化代碼緩存
1.減小數據庫的訪問次數。數據庫鏈接是很重要且很代價昂貴的資源,儘可能避免每調用一次方法就讀取一次數據庫的狀況。別小看這一條,有的人寫的代碼在一個for循環中每次都讀取數據庫,這是不對的,正常應該是一次把全部數據取回來放到Java對象中再循環。服務器
2.合理正確地使用緩存,經過全局變量來保存一些設定,或是頁面級緩存、站點級別緩存來減小服務器壓力。若是是大內存服務器,好比96G內存的服務器,就能夠把一些重要數據放在內存中,利用NoSQL作成內存緩存。網絡
3.採用性能好的數據結構和算法。HASH類的性能最好,查找的複雜度是O(1)。二叉樹的查找複雜度是O(logn),排序是O(n*logn)。List和ArrayList自帶的排序速度接近O(n*longn),數組類的線性查找O(n),若是你用冒泡排序O(n*n),那麼你就不是優秀的程序員。StringBuilder性能好於String,不過提高得有限,不是本質的數量級別的提高。數據結構
4.及時關閉非託管資源。除了上面提到的數據庫鏈接,文件IO等也要注意。數據結構和算法
優化數據庫性能
1.儘量地使用SP,而不是讓SQL語句裸奔。
2.表結構設計要合理,起碼要遵照數據庫的三個範式。固然,有些場景稍微打破三個範式是能夠得到更高的訪問性能的,好比在B表中對A表中某個常查詢的、卻不會變更的字段的冗餘,就不須要每次聯表去查。
3.合理地設計索引,正確地使用索引。好比對常查詢的字段創建索引。
4.對於超級大表(千萬級別)最好採用分區表的方式存放,Oracle、SQL Server和MySQL都支持的。
使用靜態數據
1.使用靜態數據很重要,能夠提高速度兩個數量級(百倍),例如門戶網站、大型網站的首頁,引用由特定服務生成的靜態數據(JS、TXT、HTML等)速度會很快。
2.圖片、文件、數據庫服務器分流,能夠提高1個數量級(10倍)。
3.CDN(Content Delivery Network,內容分發網絡)。
"每一步選擇都是艱難,糾結,當心翼翼。"