jedis异常:Could not get a resource from the pool

前几天公司后端系统出现了故障,致使app多个功能没法使用,查看日志,发现日志出现较多的redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool的异常信息,显而易见,jedis/redis出现了问题。由于是connection的相关的问题,因此看了一下jedis和链接数相关的配置项,maxIdle和maxTotal都是200,jedis的封装也在finally中释放了connection,因此初步猜想问题发生在redis服务端redis

1.jedis机器-->ping-->redis机器,毫秒级的响应时间----网络畅通后端

2.使用netstat -apn |grep redis-server链接数为20多个--网络链接数正常网络

3.free  -m内存使用率60%---(表面上)内存够用app

4.df     -h磁盘使用率15%---磁盘空间充足this

5.使用redis-cli,执行info命令,client部分:日志

#Clientsserver

connected_clients:18进程

client_longest_output_list:0内存

client_biggest_input_buf:0get

blocked_clients:0

clients数量也正常

6.使用redis-cli,执行ping命令,异常信息出来了:

(error)MISCONF Redis is configured to save RDB snapshots, but is currently

not able to persist on disk. Commands that may modify the data set

are disabled. Please check Redis logs for details about the error.

而后查看redis日志,出现了

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

 

问题已经很清晰了,bgsave会fork一个子进程,由于vm.overcommit_memory = 0,因此申请的内存大小和父进程的同样,因为redis已经使用了60%的内存空间,因此fork失败

解决办法:

/etc/sysctl.conf 添加 vm.overcommit_memory=1

sysctl  vm.overcommit_memory=1

做者:hhhh2 连接:http://www.jianshu.com/p/bb552ccc43b9 來源:简书 著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。
相关文章
相关标签/搜索