jedis连接池爆满导致的服务不可用

生产环境was线程数300,jedis连接池连接数100.

在业务高峰期,查看日志发现大量could not get a resource from a pool的异常,抓取javacore文件发现was线程大量进入parked状态,查看jedis源码发现连接池底层使用common-pool实现,而common-pool其中有这样一段代码:

if (p == null) {    if (borrowMaxWaitMillis < 0) {        p = idleObjects.takeFirst();    } else {        p = idleObjects.pollFirst(borrowMaxWaitMillis,                TimeUnit.MILLISECONDS);    }}新来的线程会从jedis自己实现的LinkedBlockingQueue中拿链接,如果连接池没有空闲链接并且已键连接数已达上限,那么
public E pollFirst(long timeout, TimeUnit unit)    throws InterruptedException {    long nanos = unit.toNanos(timeout);    lock.lockInterruptibly();    try {        E x;        while ( (x = unlinkFirst()) == null) {            if (nanos <= 0) {                return null;            }            nanos = notEmpty.awaitNanos(nanos);        }        return x;    } finally {        lock.unlock();    }}当前线程也就是was线程就会parked等待notEmpty信号,导致大量请求进不来堵死,首先我们考虑参数配置不合理,业务高峰期热点数据在redis中,大量的redis访问,我们改成300was链接,200redis链接,情况明显好转,但是在高峰期仍有部分请求时间超长,was线程parked的现象出现,更改jedis连接池参数,把maxWaitMillis参数调小,从最初的2000毫秒调到500,在业务高峰期,服务器资源紧张,新来的请求如果获取不到资源,立即报错返回,保证现有业务的正常运行算是一种权衡的办法。
时间: 2024-08-02 02:40:25

jedis连接池爆满导致的服务不可用的相关文章

DBCP 1.4 BUG 导致连接池爆满解决方案

dubbo 项目用的 commons-dbcp-1.4  和  commons-pool-1.5.4 实现连接池,导致数据库经常爆满,经过调试,发现了个 dbcp的bug: dbcp 源码: BasicDataSource.java 创建datasource的方法: protected synchronized DataSource createDataSource() throws SQLException { if (closed) { throw new SQLException("Dat

Java与redis交互、Jedis连接池JedisPool

Java与redis交互比较常用的是Jedis. 先导入jar包: commons-pool2-2.3.jar jedis-2.7.0.jar 基本使用: public class RedisTest1 { public static void main(String[] args) { Jedis jedis = new Jedis("localhost",6379); jedis.set("username","chichung"); jed

Jedis连接池(实际项目可用)

POM依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <slf4j.version>1.7.25</slf4j.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <

jedis连接池详解(Redis)

原子性(atomicity): 一个事务是一个不可分割的最小工作单位,事务中包括的诸操作要么都做,要么都不做. Redis所有单个命令的执行都是原子性的,这与它的单线程机制有关: Redis命令的原子性使得我们不用考虑并发问题,可以方便的利用原子性自增操作INCR实现简单计数器功能; 单机模式: package com.ljq.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import

Jedis连接池的使用

所需jar:jedis-2.1.0.jar和commons-pool-1.5.4.jar Jedis操作步骤如下: 1->获取Jedis实例需要从JedisPool中获取: 2->用完Jedis实例需要返还给JedisPool: 3->如果Jedis在使用过程中出错,则也需要还给JedisPool: 代码如下: package com.ljq.utils; import redis.clients.jedis.Jedis; import redis.clients.jedis.Jedis

Jedis连接池的使用(转)

http://www.cnblogs.com/linjiqin/archive/2013/06/14/3135248.html 所需jar:jedis-2.1.0.jar和commons-pool-1.5.4.jar Jedis操作步骤如下:1->获取Jedis实例需要从JedisPool中获取:2->用完Jedis实例需要返还给JedisPool:3->如果Jedis在使用过程中出错,则也需要还给JedisPool: [java] view plaincopy package com.

线程太多导致socket连接池爆满,进程启动不了

Issue: 某部机上跟其它机器的连接有问题,ping可以通,telnet端口不通,可以其它机器可以连接到该机器上的进程. java应用启动不起来,产生以下错误. java.net.SocketException: No buffer space available (maximum connections reached?): listen failed at java.net.PlainSocketImpl.socketListen(Native Method) at java.net.Pl

Jedis(连接池)常见操作

Jedis的最为常见的操作.主要包括常用的列表(list).集合(set).有序集合(sorted set).哈希表(hash)等数据结构,以及其他特性支持. 参考资料:http://hello-nick-xu.iteye.com/blog/search?query=Jedis <一>. 使用list: 可以使用列表模拟队列(queue).堆栈(stack),并且支持双向的操作(L或者R). 1. 右边入队: Java代码   jedis.rpush("userList",

Jedis连接池

原文地址:https://www.cnblogs.com/djlindex/p/11602882.html