压测业务流程:获取全国范围地区信息,第一次从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获取数据,减少与后端交互。 

 

Logo

更多推荐