分类
Linux 笔记

修改Linux系统最大连接数限制

生产环境redis总是会报 Redis too many open files error 连接问题。用命令连接Redis,抛出 ERR max number of clients reached 。开始以为是redis客户端连接数设置问题,于是把配置文件 maxclients 设为 20000。重启程序运行一段时间后,问题依旧。看来这个问题不只是redis服务端配置连接这么简单。

在操作系统中,每个进程的连接数是有限制的。记得windows好像是1024吧,linux默认是2048。于是查看redis的连接数。
先查出redis的进程pid,根据pid查询limit限制,如下:

Max open files 是 4096。

然后查看连接情况:

目前连接是 4073 。

可以看到连接数快满了。于是想到修改系统内核,增大连接数。
打开 limits.conf 文件:
vi /etc/security/limits.conf
发现系统已经添加了以下内容,值是65536。如果没有添加,则添加:

root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

* 号是通配置,表示对所有用户生效。据说 ubuntu 有个版本有bug,通配符不生效,所以对 root 用户单独设置一次。
保存后重启。
系统重启后打开redis,查看链接,Max open files 依然是 4096 。使用 ulimit -n 可以查看,已经是 65535 了。

也就是说,limits.conf修改成功,但是对进程未生效。

用百度找了一圈,有些人说是要修改 /etc/sysctl.conf 中的 fs.file-max 和 fs.file-nr 参数。都试过了,没用。我想应该是系统环境问题吧。在另一台服务器上,系统是CentOS ,查看 Redis 的 Max open files 是 10240 。这台是 Ubuntu 16.04 。换 google 搜了一下,终于找到有人和我一样的问题。如下:
https://stackoverflow.com/questions/39506149/ubuntu-16-04-systemd-redis-issues-with-ulimit
按照一大神回复,修改 /etc/systemd/system.conf 文件,找到 DefaultLimitNOFILE ,改为:
DefaultLimitNOFILE=65535
重启服务器再查看redis信息。已经修改成功了。

这里并不是要黑百度。平时懒得翻墙,其本都是用百度。这次偶然用google解决了问题。可能因为百度是优先把中文排在前面吧。毕竟stackoverflow是国外网站。总之问题是解决了。

发表评论

电子邮件地址不会被公开。