壓測商務程序:擷取全國範圍地區資訊,第一次從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擷取資料,減少與後端互動。