最近在使用中发现一个软件 log 中出现大量的报错:

/core/transport/internet/tcp: failed to accepted raw connections > accept tcp [::]:18919: accept4: too many open files

查询后知道这是进程占用的句柄数超出了系统最大值导致的。由于我的系统是 openwrt 所以下面介绍如何修改某个进程的最大句柄数限制。

首先查询当前系统当前的句柄限制值:

ulimit -n

1024

也可以查询当前系统的其他所有限制参数:

ulimit -a

返回 1024 表示当前系统每个进程的限制值是 1024。

然后我们查询下当前系统进程中占用情况:

lsof -n |awk '{print $2}'|sort|uniq -c |sort -nr|more

     8790 2390
     41 2638
     27 1914
     26 1
     25 2127
     23 2166
     23 1976
     23 1704

可以看到进程PID号 2390 就占用了 8790 个句柄,这肯定超出了系统限制,我们看看这个 2390 到底是那个程序:

ps | grep 2390

 2390 root     5005m S    /usr/bin/v2ray -confdir /etc/v2ray/conf.d
 6815 root      1072 R    grep 2390

发现的确是我报错的那个程序占用了这个进程。

然后我们查询系统可以设置的最大句柄数:

cat /proc/sys/fs/file-max

101238

返回值说明当前系统可以设置最大句柄数为 101238.

想要修改句柄数需要在对应进程的 procd init script 脚本修改内容,在 start_service 中增加:

        procd_set_param limits core="unlimited"
        procd_set_param limits nofile="101200"
        procd_set_param limits nproc="101200"

limits 参数可以设置系统的一些限制值,openwrt 可用的限制值名称可以在官方文档找到:https://openwrt.org/docs/guide-developer/procd-init-scripts#service_parameters

以上就将系统限制设置为一个较大的值,修改完成后重启这个进程即可。

参考链接

Linux命令:TCP连接高并发时Socket句柄数的修改
procd-init-scripts#service_parameters
procd-init-script-example#advanced_options
openwrt procd init script 自启动脚本服务

标签:无

你的评论