1. 程式人生 > >大併發壓測下,redis連線異常Read timed out排查優化

大併發壓測下,redis連線異常Read timed out排查優化

壓測業務流程:獲取全國範圍地區資訊,第一次從mysql獲取資訊,獲取到資訊後hset到redis,後面的獲取資訊都走redis獲取並返回介面資料。

問題:20併發壓測獲取全國範圍地區資訊, 應用報錯,getList:merchant:area:listerror,redis連線異常Read timed out(10併發正常),應用丟擲錯誤:

redis.clients.jedis.exceptions.JedisConnectionException:Could not get a resource from the pool。其實這裡是幾個問題引起的,先調節redis最大連線數

排查定位:

伺服器資源利用率正常,記憶體,磁碟等比較充足

redis連線相關配置正常,redis.pool.maxIdle=300,redis.pool.maxTotal=600。

redis連線數正常,netstat -nap|grep redis |wc -l,100多個活動連線。

redis -info檢視redis資訊連線正常,正常連線100多個。

redis -monitor獲取資料正常,get和hget資料均正常。

檢視redis日誌,如下問題:

WARNING overcommit_memory is set to 0! Backgroundsave may fail under low memory condition. To fix this issue add'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run thecommand 'sysctl vm.overcommit_memory=1' for this to take effect.

優化:vim /etc/sysctl.conf,增加vm.overcommit_memory=1,然後sysctl -p 使配置檔案生效

備註:核心引數vm.overcommit_memory代表記憶體分配策略,取值為0、1、2:

0, 表示核心將檢查是否有足夠的可用記憶體供應用程序使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,並把錯誤返回給應用程序。
1, 表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
2, 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體

若經過如上引數優化後,問題依然存在問題,參考連線:http://www.cnblogs.com/qlong8807/p/5149007.html

其他優化:由於本身業務返回資料量較大,最終採取優化方案為:前端把呼叫資料單獨寫死在js裡面,走CDN獲取資料,減少與後端互動。