Linux 下关于 epoll 并发链接限制

在服务器开发压力测试的时候,发现超过 1000 个链接便会造成 errno:24 的错误,这个错误解释就是 Too many open files。 这个错误发生的原因便是 Linux 默认会有一个链接限制。 之前一直以为最大链接限制是在这里看的。

1
cat/proc/sys/fs/file-max

Google了一番找到了问题的根源。 以下内容摘取自:http://www.cnblogs.com/tankaixiong/p/4064708.html

Linux 服务器大并发调优时,往往需要预先调优 Linux 参数,其中修改 Linux 最大文件句柄数是最常修改的参数之一。

在 Linux 中执行 ulimit -a 即可查询 Linux 相关的参数,如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[root@mongodb11 ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256324
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 256324
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

默认情况下,Linux 最大文件句柄数为 1024 个。当你的服务器在大并发达到极限时,就会报出 “too many open files”

那么如何修改 Linux 最大文件句柄数呢?其实很简单:

1
ulimit -n 2048

这命令就可以修改 Linux 最大文件句柄数,修改以后使用 ulimit -a 查看修改的状态,如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[root@mongodb11 ~]# ulimit -n 2048
[root@mongodb11 ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256324
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 256324
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

但是,这种方法只针对当前进程有效。重新打开一个 Shell 或者开启一个进程,你就会发现参数还是 ulimit -n xx 修改之前的数字。那么有没有一劳永逸的方法呢?

当然有!那就是修改系统参数。

2、修改 Linux 系统参数,vi /etc/security/limits.conf 添加

1
2
- soft  nofile  65536
- hard  nofile  65536

修改以后保存,注销当前用户,重新登录,执行 ulimit -a ,ok ,参数生效了:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 256600
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 256600
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

硬限制表明 soft 限制中所能设定的最大值。 soft 限制指的是当前系统生效的设置值。 hard 限制值可以被普通用户降低。但是不能增加。 soft 限制不能设置的比 hard 限制更高。 只有 root 用户才能够增加 hard 限制值。

可以最大设到: 655350

Built with Hugo
主题 StackJimmy 设计