大家好,我是程序員魚皮。
之前我帶大家做的 項目 ,用戶可以在線制作、分享、使用代碼生成器~
![]()
這次的系列教程中,我專門用了 4 個小時的直播,給大家帶來了一場極致的 性能優化 “盛宴”。
很多同學由于沒有實習或工作經歷,可能沒有接觸過性能優化,但這卻是能區分程序員水平的重要技能。
為什么這么說?
舉個例子:
優秀的程序員,能用 1 臺機器滿足 10000 個用戶的使用需求,如果滿足不了,首先想到的是繼續去優化。
而一般的程序員,用 1 臺機器可能只能滿足 1000 個用戶的使用需求,如果滿足不了,就要加機器、加資源。現實往往是沒有資源給你加。
怎么區分一個程序員有沒有性能優化經驗呢?
就先問大家一個問題吧:一臺部署了 Tomcat 的服務器,每秒最多能處理多少個請求?
下面給大家簡單分享下我直播中的性能優化過程,答案也將在最后揭曉。
性能優化實踐
要優化的是一個后端查詢接口,功能是查詢出主頁要展示的分頁數據列表,邏輯很簡單,就是數據庫分頁查詢而已。
如下圖:
![]()
首先我們往數據庫里插入 10 萬條數據,然后打開瀏覽器控制臺,觀察 10 次請求的響應耗時,平均是 700 毫秒:
![]()
1)首先,我嘗試優化了數據查詢的 SQL 語句,讓它只查詢需要返回給前端的數據,減少數據量。
優化后的接口平均耗時是 500 多毫秒,大概響應時長縮短了 1 / 4:
![]()
使用 JMeter 進行壓力測試,每秒啟動 1000 個線程,總共啟動 1 萬個線程發送請求,在異常率 0% 的前提下,測試結果得到的 qps 為 20,這顯然不是一個很好的成績。
![]()
2)進一步優化,使用性能更高的 Redis 分布式緩存。將分頁查詢結果作為 JSON 字符串寫入緩存,再次查詢的時候直接讀取就行。
結果響應時長直接縮短到了平均 20 毫秒!縮短了 25 倍!
第一個請求是加載緩存的,所以較慢。
有緩存的情況下,壓力測試得到的 qps 是 114.6,提升了 5 倍多!
![]()
可見緩存還是猛啊,讀多寫少、更新頻率低、訪問頻率高的數據,非常適合使用緩存。
還能進一步優化么?
3)當然能!使用比分布式緩存更快的本地緩存,直接從當前服務器內存讀取數據,更快~
用瀏覽器控制臺測試響應時長,幾乎沒有變化(因為我測試過程中,Redis 也是本地啟動的):
![]()
進行壓力測試,發現 qps 略有提升,大概 10% 左右吧:
![]()
本地緩存按道理來說已經是最快的讀取方式了,難道這就已經優化到極限了么?
當然沒有!
4)雖然 I / O 難以繼續優化了,但我們可以優化程序的計算邏輯、節約 CPU 資源。
比如我修改緩存的數據類型,不再寫入 JSON 格式的緩存了,直接用 JDK 原生的序列化方式去保存對象,這樣讀取的時候也不需要把 JSON 轉為對象。
優化這個邏輯后,響應時長大幅度減少!平均 8 毫秒左右:
![]()
沒想到吧,看似不起眼的 JSON 轉換操作,這么影響性能?
壓力測試的結果更恐怖了,吞吐量接近 16000,直接提升了 100 多倍!
![]()
真是不測不知道,一測嚇一跳。
問題來了,還能繼續優化么?
當然可以!
5)除了業務邏輯層,我們還可以優化請求層。比如修改 Tomcat 服務器的配置,增大工作線程數和最大線程連接數。
稍微改 2 行配置,吞吐量就提高了 1 / 5 左右,接近 19000!相比最開始的 qps 20 提升了近千倍!
![]()
這。。這次到極限了么?
我怎么知道啊!肯定還是需要自己測試這個極限到底在哪里!
如何測試呢?
6)我們可以編寫一個沒有任何業務邏輯,直接返回 "ok" 字符串的空接口。
每秒啟動 10 萬個線程來測試,得到的 qps 為 36000+,又提高了整整一倍!
![]()
ok,沒有任何邏輯的接口 qps 是這個數,那么你再怎么優化業務邏輯,性能的極限也不會超過這個值。
那么,還有辦法繼續優化么?
當然可以!
7)因為這只是 Tomcat 服務器 + Spring MVC 框架的極限,如果我們用別的技術呢?
![]()
這里我就拋磚引玉,大家感興趣的話,可以找個項目中的查詢接口、用我上面提到的方法優化下。
回到最開始的問題 “一臺部署了 Tomcat 的服務器,每秒最多能處理多少個請求?”
其實這個答案是 無解 ,因為缺少了最重要的測試條件、測試環境和測試基準,比如是在幾核幾 G、帶寬多少的機器上測試呢?不同的測試環境,測試結果肯定不同。性能優化效果一定要以實際測試結果為準,下次遇到這種問題的時候,別被面試官唬住了哦~
以上就是本期分享,時間有限文章就只能講這么多了,大家如果對這個項目、這次的性能優化完整教程感興趣,歡迎 學習。
這個項目視頻教程接近 40 小時,文字教程十幾萬字,我付出了大量的頭發精力,也保證絕對是一個很能打的項目~
![]()
點擊下方關注魚皮,獲取免費編程學習路線、簡歷模板、面試題解、AI 知識庫、項目教程、交流群。
一些對大家有用的資源:
100+ 編程學習路線 / 實戰項目 / 求職指導
100+ 簡歷模板
300+ 企業面試題庫 mianshiya.com
500+ AI 資源大全
1 對 1 模擬面試
動畫學算法教程
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.