mongo连接数满问题处理

记一次mongo服务端无法建立更多连接造成的客户端无法访问mongo集群的故障分析及解决

一. 问题:

程序无法连接mongo集群

现象:

2017-09-05T01:29:08.765+0000 I NETWORK  [thread2] connection refused because too many open connections: 819

二. 排查及解决

1. 本地测试访问mongo主机及端口

telnet 192.168.1.100 20000

正常访问,端口存在

2. 登陆mongo主机查看进程和端口是否存在。

查看进程

ps -ef | grep mongo

查看端口

netstat -ntlp

确认进程和端口都正常运行

3. 查看日志

tail -f /data/mongodb/log/mongos.log

从log文件中可以看出connection refused because too many open connections: 819,不能建立更多的连接造成,mongo服务端主动拒绝,造成客户端无法访问。于是想到系统允许进程打开的的最大文件具柄数的限制。

三. 分析解决

1. 查看系统默认的最大文件句柄数,系统默认是1024

# ulimit -n
1024参数:命令参数-a      显示所有限制-c      core文件大小的上限-d      进程数据段大小的上限-f      shell所能创建的文件大小的上限-m     驻留内存大小的上限-s      堆栈大小的上限-t      每秒可占用的CPU时间上限-p     管道大小-n     打开文件数的上限-u     进程数的上限-v     虚拟内存的上限

2. 查看当前进程打开了多少句柄数

# lsof -n|awk ‘{print $2}‘|sort|uniq -c|sort -nr|more
14505 2684
13937 2781
12992 2492
11616 2361
10486 2583
#其中第一列是打开的句柄数,第二列是进程ID。

根据进程PID查看进程名

# ps -ef | grep 2684
mongodb   2684     1  0 04:19 ?        00:00:38 mongod -f /data/mongodb/config/shard2.conf

3. 什么是ulimit -n

网上很多人说,ulimit -n限制用户单个进程的问价打开最大数量。严格来说,这个说法其实是错误的。看看ulimit官方描述:

Provides control over the resources available to the shell and to processes started by  it,  on  systems that allow such control. The -H and -S options specify that the hard or soft limit is set for the given resource. A hard limit cannot be increased once it is set; a soft limit may  be  increased  up  to  the value of the hard limit. If neither -H nor -S is specified, both the soft and hard limits are set. The value of limit can be a number in the unit specified for the resource or one of the special values hard, soft,  or  unlimited,  which  stand  for  the  current hard limit, the current soft limit, and no limit,  respectively.If limit is omitted, the current value of the soft limit  of  the  resource  is  printed,  unless  the  -H  option is given.  When more than one resource is specified, the limit name and unit are  printed before the value.

人家从来就没说过是限制用户的单个进程的最大文件打开数量,看看红色部分,是限制当前shell以及该shell启动的进程打开的文件数量。为什么会给人限制单个线程的最大文件数量的错觉,因为很多情况下,在一个shell环境里,虽然可能会有多个进程,但是非常耗费文件句柄的进程不会很多,只是其中某个进程非常耗费文件句柄,比如服务器上运行着一个tomcat,那么就是java进程要占用大多数文件句柄。此时ulimit设置的最大文件数和java进程耗费的最大文件数基本是对应的,所以会给人这样的一个错觉。

还有,很多文章称ulimit -n 只允许设置得越来越小,比如先执行了ulimit -n 1000,在执行ulimit -n 1001,就会报"cannot modify limit: Operation not permitted"错误。这个其实也是不准确的说法。首先要搞清楚,任何用户都可以执行ulimit,但root用户和非root用户是非常不一样的。

注: 非root用户只能越设置越小,不能越设置越大,root用户不受限制

4. 到底最大文件数被什么限制了?too many open files错误到底可以通过什么参数控制?

shell级限制 
通过ulimit -n修改,如执行命令ulimit -n 1000, 当前session会话生效,则表示将当前shell的当前用户所有进程能打开的最大文件数量设置为1000.

用户级限制  
ulimit -n是设置当前shell的当前用户所有进程能打开的最大文件数量,但是一个用户可能会同时通过多个shell连接到系统,所以还有一个针对用户的限制,通过修改 /etc/security/limits.conf实现,例如,往limits.conf输入以下内容:
root soft nofile 1000 
root hard nofile 1200
soft nofile表示软限制,hard nofile表示硬限制,软限制要小于等于硬限制。上面两行语句表示,root用户的软限制为1000,硬限制为1200,即表示root用户能打开的最大文件数量为1000,不管它开启多少个shell。

系统级限制

# cat /proc/sys/fs/file-max
1637385

ulimit修改后生效周期

修改后立即生效,重新登录进来后失效,因为被重置为limits.conf里的设定值。

修改了limits.conf需要重启系统?

重新登录进来就生效了。

5. 文件/proc/sys/fs/file-max

网上说,ulimit -n 和limits.conf里最大文件数设定不能超过/proc/sys/fs/file-max的值,这也是搞笑了,/proc/sys/fs/file-max是系统给出的建议值,系统会计算资源给出一个和合理值,一般跟内存有关系,内存越大,改值越大,但是仅仅是一个建议值,limits.conf的设定完全可以超过/proc/sys/fs/file-max。

6. 修改limit限制

#  在文件末尾添加,永久生效
# vim /etc/security/limits.conf
mongodb                soft    nofile  100000
mongodb                hard    nofile  100000

# 切换到mongodb用户下查看
# ulimit -n
100000

重启mongo后,故障恢复!

四. 总结

  • /proc/sys/fs/file-max限制不了/etc/security/limits.conf
  • 只有root用户才有权限修改/etc/security/limits.conf
  • 对于非root用户, /etc/security/limits.conf会限制ulimit -n,但是限制不了root用户
  • 对于非root用户,ulimit -n只能越设置越小,root用户则无限制
  • 任何用户对ulimit -n的修改只在当前环境有效,退出后失效,重新登录新来后,ulimit -n由limits.conf决定
  • 如果limits.conf没有做设定,则默认值是1024
  • 当前环境的用户所有进程能打开的最大文件数量由ulimit -n决定
时间: 2024-10-12 05:14:49

mongo连接数满问题处理的相关文章

RDS MySQL 连接数满情况的处理

RDS MySQL 连接数满情况的处理 RDS MySQL 连接数满有2种情况 1. 空闲连接过多 原因: 应用使用长连接模式 - 对于长连接模式(比如Java应用),应用侧应该配置连接池.连接池的初始连接数设置过高,应用启动后建立多个到RDS实例空闲连接.如果出现连接数满(too many connections)不能连接的问题,请检查连接池是否启用了复用连接功能. 应用使用短连接模式 - 对于短连接模式(比如PHP应用),出现大量的空闲连接说明应用没有在查询执行完毕后显式的关闭连接.用户应该

解决Oracle 11gR2 空闲连接过多,导致连接数满的问题

今天又遇到了11gR2连接数满的问题,以前也遇到过,因为应用那边没有深入检查,没有找到具体原因,暂且认为是这个版本Oracle的BUG吧. 上次的处理办法是用Shell脚本定时在系统中kill  v$session.status='INACTIVE'的连接,但是这次现场没有在操作系统中部署脚本的权限,只好在数据库中做处理,幸好我们对这个 数据库有完全的权限.这次使用了profile+JOB定时alter system kill 'sid,seral#' immediate的方式.具体脚本如下:

Tomcat优化记录_数据源最大连接数_linux系统openfile最大限制

近日在维护项目WEB服务时遇到一些问题,解决并记录如下: 1.接口服务mamwebservice由于被频繁大量调用,易出现大量并发请求时,JNDI连接数满,导致此服务宕掉,停止服务: 使用开源监控工具probe,监控此服务相关数据源实时连接数,这样可以第一时间知道服务是否正常(此probe可百度下载,置于tomcat/webapps下,同时配置tomcat manager admin用户即可使用) 修改 tomcat/conf/server.xml 增加下方蓝色参数 修改其最大连接数(tomca

致DBA:为什么你经常犯错,是因为你做的功课不够

专职做DBA已经6年多的事件了,看同行.同事犯了太多的错误,自己也犯了非常多的错误.一路走来,感触非常深.然而绝大多数的错误其实都是很低级的错误.有的是因为不了解某个引擎的特性导致:有的是因为对线上环境不了解导致:有的是因为经验不足导致:一路上,跌跌撞撞,从小公司DBA,到腾讯高级DBA,再到现在的金融数据库DBA. 不由得想起5年前的我,刚进入DBA行业,缺乏经验,经常犯错误,不是我不够努力,更多的是初来咋到的我根本不知道应该在哪方面下功夫.本文就是基于这方面的考虑,根据自己在DBA这个职业上

lr测试结果分析

根据业务的运行情况入手,以突出问题为主线,定位瓶颈,进行调优:执行后再验证性能,未达到性能需求继续找突出问题,分步调优.本分析以error为主线,找error的产生原因,定位到了瓶颈,针对瓶颈做调优.性能分析包含系统架构的各方面.各环节. ⑴.Analysis Summary 场景的大概情况. 现象: Transaction Summary 部分显示: Average表明事务的平均响应时间.响应最慢的事务:check_itinerary: Fail表示事务失败的个数.失败较多的事务:check_

[转载]腾讯专家:论高级DBA的自我修养

作者介绍: 张秀云:2007年开始从事运维方面的工作,经历过网络管理员.linux运维工程师.DBA.分布式存储运维等多个IT职位.对linux运维.mysql数据库.分布式存储有丰富的经验.2012年加盟腾讯,目前在腾讯负责腾讯云数据库平台和分布式存储运维平台的运维规划工作. 微信:feihongwuhen 前言 专职做DBA已经6年多的事件了,看同行.同事犯了太多的错误,自己也犯了非常多的错误.一路走来,感触非常深.然而绝大多数的错误其实都是很低级的错误. 有的是因为不了解某个引擎的特性导致

邮件协议(SMTP)性能测试总结(Foxmail邮箱)

先介绍一下邮件协议SMTP的工作机制(连接和发送过程),用wireshark工具抓包进行分析,如下: SMTP协议的工作机制(连接和发送过程): 1.建立TCP连接,并将邮件服务器地址给客户端: 2.客户端发送EHLO命令以标识发件人自己的身份,然后客户端登录邮件服务器: 3.客户端先标示电子邮件的发件人发送MAIL命令,服务器端以OK作为响应,表明准备接收: 4.客户端发送RCPT 命令,以标识该电子邮件的计划接收人,可以有多个RCPT行, 服务器端以OK作为响应,表示愿意为收件人接收邮件:

c#与oracle数据库连接池

c#与oracle数据库连接池 在做一个项目,中间要使用webservice和oracle数据库.我在服务端做了用户身份认证,也就是使用session传递用户的登陆信息.在测试时,当用户少的时候,没有问题,但是当大量用户同时访问时,就报错,起初以为是自己的oracle连接部分有问题,几经确认,终于发现了是连接池的问题. 以下是从别人的博客中摘抄的,不敢造次,收录如下: "连接根据连接字符串以及用户标识来建立池连接.因此,如果使用网站上的基本身份验证或 Windows 身份验证以及集成的安全登录,

缺少索引导致的服务器和MYSQL故障。

故障现象: 网站访问缓慢. 数据库RDS: CPU满,连接数满,其他值都是空闲. apache服务器:CPU正常,IO正常,流量报警,内存爆满. 解决思路: 一.没遇到过此情况,一脸懵逼. 二.请教大神寻求思路. 根据现行表明有可能是: 1.慢查询,表锁 2.CC攻击或者蜘蛛抓取导致大量的小查询(可能没有索引)       一.查看数据库,有没有存在慢查询和锁表情况.(show full processlist),关注:查看最长时间查询的几个连接.注意:(带动作的连接,如果只连接值是null)不