服務器壓力大的解決方案


有個問題是:當你有一個功能發布到生產環境后,發現服務器壓力驟增,這時該怎么排查?

首先服務器性能的指標無外乎是那幾個: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,內容分發網絡)。

 

"每一步選擇都是艱難,糾結,小心翼翼。"


免責聲明!

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



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