最近经常出现 Frp 服务端异常的情况,具体表现为服务端突然无法连接,但是服务器 ping 的通。
连接上 SSH 后,查询日志发现了很多 too many open files
(打开了太多的文件)。
后来经过谷歌,才知道这是 Linux 系统的一个常见错误,具体原因就是因为打开的句柄(handle)或者 socket 连接数量过多导致的。
这个限制在系统中默认值是 1024,即打开 1024 个句柄以上就会导致程序出错(无法分配更多句柄)。
查询当前限制
使用一个简单的命令查询系统当前的句柄数量限制
[code]ulimit -a[/code]
运行命令输出结果
[code]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[/code]
可以看到,open files
的值是 1024
,说明当前单个进程最大可以打开 1024 个句柄。
修改限制
有两种办法修改句柄数量限制,第一种是临时修改,重启系统失效
[code]ulimit -n 2048[/code]
在普通用户权限下只能设置到 2048,如果想要设置更高的数值需要 root 权限或者使用 sudo。
另外一种方法可以永久修改,编辑 /etc/security/limits.conf
,在最后加入
[code]* soft nofile 4096
* hard nofile 4096[/code]
也可以设置
[code]* – nofile 8192[/code]
第一项 *
代表用户名,使用 *
代表所有用户,你也可以指定用户,例如 akkariin
第二项如果是 -
,则代表同时指定 soft
和 hard
的值,你也可以指定 soft
和 hard
,但是注意 soft
和 hard
要同时设置(不能只设置其中一项)
这种方法需要注销后生效(断开 SSH 重新连接即可)
读者评论