openwrt 修改进程 Socket 句柄数
最近在使用中发现一个软件 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 自启动脚本服务
标签:无