在服务器开发压力测试的时候,发现超过 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 最大文件句柄数呢?其实很简单:
这命令就可以修改 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