zoukankan      html  css  js  c++  java
  • connection pool exhausted

    1.发现问题

    生产环境发现有一些redis报错日志 connection pool exhausted。如果redis中没有数据 就直接回源 查DB。暂时不会有什么大问题。中文意思是连接池耗尽。
    

    2.追踪问题

    查看源码

    我们用的redis客户端类似于redigo 按照错误提示搜索到了一段代码(基于最新的redigo 源码版本分析)

       // Handle limit for p.Wait == false.
       if !p.Wait && p.MaxActive > 0 && p.active >= p.MaxActive {
       	p.mu.Unlock()
       	return nil, ErrPoolExhausted
       }
    

    源码解析

    这段代码的意思是 如果没有配置为等待模式。且配置了连接池的最大活跃个数 如果当前活跃个数大于配置的最大活跃 则返回连接池耗尽的错误。所以需要调大这个MaxActive参数。

    MaxIdle 参数

    除了MaxActive 之外还有一个MaxIdle参数。

       func (p *Pool) put(pc *poolConn, forceClose bool) error {
       	p.mu.Lock()
       	if !p.closed && !forceClose {
       		pc.t = nowFunc()
       		p.idle.pushFront(pc)
       		if p.idle.count > p.MaxIdle {
       			pc = p.idle.back
       			p.idle.popBack()
       		} else {
       			pc = nil
       		}
       	}
       	if pc != nil {
       		p.mu.Unlock()
       		pc.c.Close()
       		p.mu.Lock()
       		p.active--
       	}
       	if p.ch != nil && !p.closed {
       		p.ch <- struct{}{}
       	}
       	p.mu.Unlock()
       	return nil
       }
    

    连接池的具体实现是通过一个链表来实现的。如果发现连接池里面的空闲个数超过了MaxIdle,就会把尾部的连接删除 把最新的连接放到头部。类似将老的连接删掉,加入最新的。

    3.解决问题

    最终通过调大 MaxActive 和 MaxIdle 参数解决了连接池耗尽的问题

    4. docker环境实验源码

  • 相关阅读:
    review37
    review36
    review35
    linux 下 安装mysql
    安装yum
    hadoop mapreduce 计算平均气温的代码,绝对原创
    hadoop mapreduce 计算平均气温的代码,绝对原创
    Mysql命令大全
    Mysql命令大全
    约瑟夫问题
  • 原文地址:https://www.cnblogs.com/alin-qu/p/11603376.html
Copyright © 2011-2022 走看看