網絡游戲開發(fā)實戰(zhàn):游戲服務器性能測試分析
今天遇到一個性能壓測的問題,也是很多同學做游戲服務器開發(fā)經常會遇到的,今天記錄一下分享給大家。
?
性能壓測遇到的問題
?
服務器硬件情況:
8核16G服務器, 帶寬1000M, redis假設在獨立的內網云服務上,通過內網連接;
性能壓測:
壓測功能接口1: 查詢當前服務器的時間戳,并返回給客戶端;
壓測功能接口2: 給定key, 查詢redis服務器hash表中的一個value,并返回客戶端;
壓測手段,并發(fā)2000次請求;
測試功能接口1結果: (并發(fā)2000,TPS 16000,RT 20ms)
測試功能接口2結果: (并發(fā)2000,TPS 6000, RT 3000ms)
壓測問題:
為什么并發(fā)2000,查詢一個redis 結果需要等待3秒, TPS 下降到6000,哪里的問題? 如何優(yōu)化?
?
附:
RT: Response Time, 從發(fā)送請求到獲得結果的響應時間,包括了Request Time, Response Time。
TPS: Transactions Per Second, 每秒處理的事務數。
?
性能分析之基本情況調查
?
遇到這類問題,我們首先要做問題分析,在處理問題之前,一定要了解清楚并發(fā)時候的服務端技術架構組成,以及相關信息,然后再對問題做出對應的判斷與調試。我思考了一下,先問了一些相關的問題如下:
?
問題1:?做并發(fā)測試時,服務器的架構是如何的?如何部署的?
首先就要搞清楚,當前服務器架構是多少個線程or進程, 如何并發(fā)的?能否發(fā)揮多核的優(yōu)勢。
目前服務端架構是基于Java技術,網絡請求基于Java的Netty, 邏輯處理接口采用多線程來進行處理。處理線程與Netty IO線程是分開的。目前IO線程為4個,處理線程為8個。
?
問題2:?目前極限測試的情況下各CPU以及硬件設備的占比情況如何? (CPU, 內存,IO, 網絡帶寬)
CPU: 目前CPU占用率約為20%;
內存: 目前內存的使用為1G左右, 內存穩(wěn)定;
磁盤文件IO: 測試的時候沒有文件讀寫等IO操作;
網卡占用: 目前回復的都是不是大量的數據,網絡帶寬占用很低;
?
問題3:?Redis服務器情況如何?
Redis服務器目前為獨立的,Redis服務器的資源占還很充足,目前未發(fā)現有太嚴重的性能問題。
?
問題4:?停掉并發(fā), 單獨響應redis的時間未多少?是否正常?
停掉并發(fā)后,客戶端向服務端發(fā)送一個redis 查詢的請求,大概響應時間為40ms左右。算上來回的網絡時間,是正常的。
?
問題5:?在服務器向Redis服務器做一次redis查詢多久?
這里在服務端代碼中打印,向Redis服務器查詢一次hget大約需要1ms左右。
?
為什么要問這些問題呢?這個是解決性能問題的關鍵的一些依據,根據這些依據我們來制定一些問題可能的方向。問題1了解服務端基本的架構與部署,能知道這個架構是否能充分的發(fā)揮目前硬件的性能。問題2,主要是了解服務器是否遇到了運行時的瓶頸,導致無法在提升并發(fā)性能。問題3,當前的性能測試與Redis有關系,排除掉Redis服務器的干擾。問題4,屏蔽掉并發(fā)后,看一下整個查詢鏈路邏輯中是否有異常。排除掉一個請求中代碼邏輯的問題。問題5, 測試服務端請求Redis的情況,徹底排除掉Redis的影響,因為本次的性能測試請求與Redis有關。
?
問題的分析與解決
?
經過上面的調查,我們總結了一下相關的情況,單次訪問Redis正常,從請求到返回耗時大約是40ms, 說明整個鏈路沒有大問題。
Redis查詢業(yè)務時間=客戶端發(fā)送請求到服務端時間+服務端查詢Redis結果的時間+服務端發(fā)送回應到客戶端時間。
過程中沒有大規(guī)模的內存創(chuàng)建與釋放,沒有IO操作, 內存與IO不會為性能的瓶頸。Redis服務器一切正常,Redis支持的高并發(fā)一般不會有太大的問題。硬件的CPU占用率等都很低,并沒有發(fā)揮出來完全的硬件,說明應該還有提升的可能。
?
假設單核情況下服務端處理業(yè)務,服務端向Redis服務器請求需要等待1ms的話,那么2000次并發(fā)就需要2秒。同時還需要接受客戶端的請求+發(fā)送數據到客戶端做網絡IO。問題中,總共8個CPU核心,CPU占用率20%左右,和我們數據分析出來的基本能對上。從上面分析,我們可能是開的線程不夠,導致處理redis的時候并發(fā)率上不來,是IO線程不夠還是Task 邏輯處理線程不夠呢?從簡單的查詢來推斷,應該是邏輯處理線程不夠。IO線程處理第一個網絡請求的時候沒有問題,說明IO線程數目是沒有問題的。
?
大概估摸計算以后,我就讓小伙伴加大邏輯處理線程與IO線程,然后對比,如圖:

今天的分享就到這里了,問題比較簡單,但是分析的思路值得推薦給大家,所以我就寫了這個文章,關注我,可以獲得更多游戲開發(fā)的文章與教程。