一次Docker中Redis連接暴增的問題排查實戰記錄_docker

來源:腳本之家  責任編輯:小易  

query取得iframe中元素的幾種方法在iframe子頁面獲取父頁面元素代碼如下:$(www.anxorj.tw防采集請勿采集本網。

周六生產服務器出現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連接暴增,首先從自身應用程序出發去尋找問題,比如我這邊發現的連接池設置過大,加上默認的預熱機制等。還有盡可能的看代碼層面在創建連接是否會被多次觸發,如果有就必須要改正,F在都是通過注入的方式創建實例,要看該地方是存在被多次調用。

2、修改redis服務器配置,比如連接空閑超時時間。包括也可也看下最大連接數多少,默認值。

到此這篇關于Docker中Redis連接暴增的問題排查的文章就介紹到這了,更多相關Docker中Redis連接暴增問題排查內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

與memcached一樣,為了保證效率,數據都是緩存在內存中。 區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步內容來自www.anxorj.tw請勿采集。


  • 本文相關:
  • 如何用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啟動失。簎nit 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.anxorj.tw All Rights Reserved
    陕西快乐10分下载