Loading...

解决 too many open files 导致的程序错误

最近经常出现 Frp 服务端异常的情况,具体表现为服务端突然无法连接,但是服务器 ping 的通。

连接上 SSH 后,查询日志发现了很多 too many open files(打开了太多的文件)。

后来经过谷歌,才知道这是 Linux 系统的一个常见错误,具体原因就是因为打开的句柄(handle)或者 socket 连接数量过多导致的。

这个限制在系统中默认值是 1024,即打开 1024 个句柄以上就会导致程序出错(无法分配更多句柄)。

查询当前限制

使用一个简单的命令查询系统当前的句柄数量限制

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) 1856
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) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1856
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

可以看到,open files 的值是 1024,说明当前单个进程最大可以打开 1024 个句柄。

修改限制

有两种办法修改句柄数量限制,第一种是临时修改,重启系统失效

ulimit -n 2048

在普通用户权限下只能设置到 2048,如果想要设置更高的数值需要 root 权限或者使用 sudo。

另外一种方法可以永久修改,编辑 /etc/security/limits.conf ,在最后加入

* soft nofile 4096
* hard nofile 4096

也可以设置

* - nofile 8192

第一项 * 代表用户名,使用 * 代表所有用户,你也可以指定用户,例如 akkariin

第二项如果是 -,则代表同时指定 softhard 的值,你也可以指定 softhard,但是注意 softhard 要同时设置(不能只设置其中一项)

这种方法需要注销后生效(断开 SSH 重新连接即可)

发表评论

》表情