一次Docker中Redis连接暴增的问题排查实战记录_docker

来源:脚本之家  责任编辑:小易  

query取得iframe中元素的几种方法在iframe子页面获取父页面元素代码如下:$(www.zgxue.com防采集请勿采集本网。

周六生产服务器出现redis服务器不可用状态,错误信息为:

开这么多连接数有个毛用。。。,Mysql的最大连接数在一般开个几百个就好了,可以进行测试,最大连接数不是越多越好!!! 自己看看SQL语句的优化吧!连接数占满肯定是SQL语

状态不可用,等待后台检查程序恢复方可使用。Unexpected end of stream; expected type 'Status'

Supervisor主要是为了用于一个容器内多个进程的情景。Docker启动时有--restart=always参数可以用来确保进程崩溃(容器停掉)后重新启动。

如下图所示,下图6300就是我们redis服务器运行的端口。

有两种途径: docker run 的时候指定密码(没找到如何指定) docker run之后使用exec登录进去修改配置文件(没找到配置文件在哪,可能需要自己写一个配置文件然后启动的时候带

头一次碰到此类问题,心想难道是redis挂掉了,随即通过telnet ip+端口。发现运行正常,然后就想着进入redis看下目前连接情况。一看发现竟然高达1903条这么多。

/.conf --name my -server /usr/local/etc//.conf 这个镜像启动的时候就默认运行redis-server了。无法通过docker run -it redis修改。试图docker

然后想着应该是代码创建redis连接过多导致的,查看代码。

利用Docker的Host网络模式启动redis: 启动命令: docker run -v /usr/local/redis.conf:/etc/redis.conf --net="host" --name myredis -d redis:2.8.19 性能测试命令: redis-ben

发现redis创建只有这一个地方有,这里也是服务注册时才执行。也就是应用程序启动时才被执行一次。然后整个项目查找,没有其他地方再有调用redis初始化。

util clean test* docker rm -f test-redis1 test-redis1 ③ ps (简洁显示 docker ps -a 的 test1 test3 test2 test1 test3 test2 ⑥ rsol (也是restart,和rs区别在于只会重启运行中容器

心有不甘,难道是每次在redis读写数据时都会创建连接吗?会和读写频繁有关系吗?总感觉不会啊,随即创建测试代码进行测试一番。

Docker file 为了开发的需要,我们将会让Redis和Node在同一个容器中运行。为此,我们将 /src 这句会告诉docker一旦容器已经启动,在执行CMD属性指定的东西之前,要做一次 cd

在本地搭建了一个redis环境,测试之前先看看接数多少,目前看只有1个,也就是目前的cmd连接客户端,这个属于正常的了。

.gitignore Dockerfile php.ini php-dev.ini php-fpm.conf redis/ Dockerfile docker-com 只要事先写好配置文件就行,最后在 docker-compose.yml 文件中,将配置文件扔进去,这个

开始测试,运行程序。代码是创建一个连接对象,并一共测试1000次写,和1000次读。

container. 译者信息 假设你正在假设一个Redis Server或Java Webservice的Docker镜像 而不能简单的查看Docker提供的信息。 你可以负责把应用放到容器中,但你是否应该同

不管我怎么测试连接都是6个,那么也就是说我们程序最多创建了5个连接,当然主要有线程池在里面。

Docker 对自己到底有多大的用处,因此翻译 Docker 个人用例 这篇文章中来介绍 Docke 一次运行环境、在云主机上还配置一次运行环境。全面部署 Docker (Docker here and

所以基本的存储读取这块代码肯定是没问题。

需要修改依赖的数据库数据或者清空变动 memcache、Redis 中的缓存数据。Docker 相较于传统的虚拟机,更轻量与方便。可以很容易的将这些数据分离到不同的镜像中,根据不

但代码这块也没算完全放弃排查,因为生产服务器通过docker运行着大约6个应用程序。都是连接的同一个redis,会不会是其他应用程序导致的?

然后就想直接通过redis 连接列表里的中随便一个端口来查询对应的进程信息就可以知道是哪些应用程序了。

Linux 中通过查询网络端口号显示进程信息。

netstat -atunlp | grep 60852

首先看这端口对应的IP,比如这里第一个是172.17.0.1。熟悉docker的同学应该知道这个ip是docker网关IP。我们容器中的程序都是通过这个网关IP来和我们宿主主机来通讯的。我们通过ifconfig就能发现docker这个网关IP,第二个172.17.0.3:6379这个一看就是redis的容器IP,

这样一看确实无法找到具体对应哪个容器中的程序和我们建立连接的。

有一个最笨的办法就是挨个进入容器里面。即docker exec –it test /bin/bash 然后查看当前容器的网络连接情况。这样非常麻烦,并且需要安装很多组件才能执行一系列命令。

另外一个办法lsof命令,如果没有则需要安装。我们可以通过进程去找所有网络连接情况。

比如我们刚发现我们的进程主要是docker,他的pid是582251。

lsof -i |grep 582251或者 lsof -i -p 582251

结果如下图,右边其实出现了具体IP,这个IP就是docker容器具体的IP地址。

现在知道所有IP和端口了,我们将命令执行结果下载下来。

首先找到自己每个容器对应的IP。

docker inspect name |grep IPAddress //name 容器名称或者id

找到每个ip后然后根据刚下载的所有网络连接信息进行统计,看哪个IP连接最多,最多的一个肯定有问题。

然后我就找到这个IP对应的容器部署的程序,然后看redis配置。发现线程池设为200。

另外我通过github,发现CSRedisCore还有个预热机制,也就是preheat,他默认值就是5个预热连接。

我们线程池设置的是200加上本身有个预热机制5个连接,我不知道是不是会创建200*5=1000个。这个有时间再好好研究下源代码,目前只是猜测。

我现在已经将redis修改为poolsize=5, preheat=false。线程池5个,并且关闭预热机制。

修改我们连接配置,并重启应用服务器和redis服务器(为了彻底清除已建立的连接)后发现连接数有减少,但没有很多。后来查询发现,是redis的idle空闲时长太长,导致连接池维持太多连接,没有被释放。

我们设置下超时为30s

执行CONFIG SET timeout 30 (单位是秒,此种方式只是临时修改,针对当前运行有效。长效记得修改redis配置文件)

然后再看下连接数多少,这样一下子就减少了很多。

总结:

1、 redis连接暴增,首先从自身应用程序出发去寻找问题,比如我这边发现的连接池设置过大,加上默认的预热机制等。还有尽可能的看代码层面在创建连接是否会被多次触发,如果有就必须要改正。现在都是通过注入的方式创建实例,要看该地方是存在被多次调用。

2、修改redis服务器配置,比如连接空闲超时时间。包括也可也看下最大连接数多少,默认值。

到此这篇关于Docker中Redis连接暴增的问题排查的文章就介绍到这了,更多相关Docker中Redis连接暴增问题排查内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

与memcached一样,为了保证效率,数据都是缓存在内存中。 区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 如何用docker部署redis cluster的方法
  • docker安装官方redis镜像并启用密码认证
  • 详解docker搭建redis集群的环境搭建
  • linux环境部署及docker安装redis的方法
  • docker创建redis镜像的方法
  • 基于docker搭建redis一主两从三哨兵的实现
  • docker下redis的主从配置教程详解
  • docker安装常用组件(mysql,redis)的方法
  • docker安装redis 5.0.7并挂载外部配置和数据问题
  • docker django无法访问redis容器的解决方法
  • docker中使用mongodb数据库详解(在局域网访问)
  • 在docker中利用tomcat快速部署web应用的方法示例
  • docker部署flask应用的实现步骤
  • 如何使用celery和docker处理django中的定期任务
  • docker 镜像加速centos7详细介绍
  • docker容器挂载宿主主机目录的操作方法
  • docker实现同ip网段联通的实现
  • docker 如何搭建私有仓库(ubuntu 14.04,docker版本1.6.4)详细介
  • 分享ubuntu19无法安装docker源问题
  • 轻松安装docker并运行docker swarm模式
  • 如何用Docker自动配置Redis主从或者MySQL主从
  • 如何访问docker里的redis
  • 如何使用Docker实现Redis 3.0集群的一键部署交付
  • 如何使用Docker实现Redis 3.0集群的一键部署交付
  • 如何使用Docker安装Redis\Zookeeper\Mysql
  • Docker里面运行Redis和Django,需要用Supervisor守护吗
  • redis docker 镜像怎么设置密码
  • 如何修改docker中部署的代码
  • Docker 中 NAT 和 HOST 的区别
  • 有没有觉得docker原生命令不是很方便
  • 基于 Docker 开发 NodeJS 应用
  • Docker搭建自己的PHP开发环境
  • 为什么不需要在 Docker 容器中运行 sshd
  • 开发者可以使用Docker做什么
  • Docker的主要作用是什么?
  • 群辉安装docker windows下有哪些软件
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全dockerhyper-vvmwarevirtualboxxenserverkvmqemuopenvzxencloudstackopenstack云计算技术云其它首页服务器云和虚拟化如何用docker部署redis cluster的方法docker安装官方redis镜像并启用密码认证详解docker搭建redis集群的环境搭建linux环境部署及docker安装redis的方法docker创建redis镜像的方法基于docker搭建redis一主两从三哨兵的实现docker下redis的主从配置教程详解docker安装常用组件(mysql,redis)的方法docker安装redis 5.0.7并挂载外部配置和数据问题docker django无法访问redis容器的解决方法docker中使用mongodb数据库详解(在局域网访问)在docker中利用tomcat快速部署web应用的方法示例docker部署flask应用的实现步骤如何使用celery和docker处理django中的定期任务docker 镜像加速centos7详细介绍docker容器挂载宿主主机目录的操作方法docker实现同ip网段联通的实现docker 如何搭建私有仓库(ubuntu 14.04,docker版本1.6.4)详细介分享ubuntu19无法安装docker源问题轻松安装docker并运行docker swarm模式docker 给运行中的容器设置端口映docker 清理命令集锦docker获取镜像报错docker: erroubuntu14.04+docker的安装及使用docker.service启动失败:unit ndocker容器如何优雅的终止详解浅谈docker-compose网络设置之necentos7 安装docker 解决启动不了详解docker国内镜像拉取和镜像加docker如何固定ip设置的方法docker使用编写dockerfile启动node.js应用详解基于docker-swarm搭建持续集成集群服详解使用docker搭建java web运行环境docker下安装elasticsearch和kibana的示例详解docker中dockerfile指令创建镜像基于docker快速搭建elk的方法docker中iptables规则在iptables重启后丢docker 的健康检测机制docker容器启动时初始化mysql数据库的方法基于dockerfile创建zabbix监控体系代码实
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved