技术解析

配置了最大连接数 65535,但是/etc/rc.local 里的没生效
0
2021-06-28 07:24:40
idczone
就是我按照网上的说法,在 /etc/security/limits.conf 里面,配置了以下内容

* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535

然后我登录环境,ulimit -n 执行结果也确实是 65535,
然后我在开机启动脚本 /etc/rc.local 启动 TcpRoute2 代理软件,结果这个进程起来之后 最大 fd 是 1024,提示 too many open files
我手动重启 TcpRoute2,这个进程的最大 fd 就是 65535 了,问题规避

通过查看 http://www.jb51.net/article/97706.htm ,我发现了原因:
1、这个限制是针对单个程序的限制
2、这个限制不会改变之前已经运行了的程序的限制
3、对这个值的修改,退出了当前的 shell 就会消失
比如说,我先运行了一个程序 A,然后通过 ulimit 修改了限制为 2048,然后运行 B,然后退出了 shell 再登录,然后运行 C。那就只有 B 可以打开 2048 个句柄。

那么我有几个小问题,希望大家指点一下:
1. 如果我就要开机启动脚本里面,启动的进程就是 65535,怎么办呢?或者是规范的做法是什么呢?
2. @GameXG 就算用户不设置 65535,代码里面可以申请 65535 个 fd 吗?总感觉默认 1024 不够用,毕竟是代理软件
谢谢
什么系统咯?如果是 centos7 的话我记得有一个地方是要更改的

Ubuntu 16.04

应该是 systemd 的原因,你可以查查相关的资料看看

prlimit -n xxx -p pid

这个要在启动 TcpRoute2 之后,给进程 pid 用上吗?

{
echo "* soft nproc 65535" > /etc/security/limits.d/90-nproc.conf
echo "* hard nproc 65535" >> /etc/security/limits.d/90-nproc.conf
echo "* soft nofile 65535" >> /etc/security/limits.d/90-nproc.conf
echo "* hard nofile 65535" >> /etc/security/limits.d/90-nproc.conf
}

用 systemd 的服务不会加载 limits.conf,得在 systemd 服务的配置里改。
*. 可以试一下 sudo systemctl edit rc-local.service,然后添加:
[Service]
LimitNOFILE=65536
*. 更好的方法是把 TcpRoute2 做成一个单独的 systemd 服务,然后设置 LimitNOFILE。

好好用 systemd 服务文件,不要用 rclocal 来启动服务
rclocal 就是给你启动时自动写点参数用的而已

哈哈哈,常见错误
/etc/security/limits.conf 是 pam_limits.so 的配置文件,一般只有在“登录”的时候才执行,用于从(login/sshd)+pam_limits.so 的 root 身份降级到普通用户之前,设置好 rlimits
而你这个根本就没有登录这个动作

2. 记得高点的 linux 内核版本支持,不过目前版本的 tcproute 不再增加功能了,下一个版本会直接重写,目前只完成了一部分,全部完成会比较久...

chmod +x /etc/rc.local

我遇到过类似的坑 想开机跑一些脚本 但是 rc.local 添加进去后没有反应
lz 你试试在你的命令前面添加一个 sleep 10s 让系统完全启动了以后再运行这个脚本试试

sleep 不可能有效的,别想了

我的不可描述 Server 就是加了 sleep 启动的啊

时间上的相关关系并不等于因果关系

但是我启动不了的服务的确加了 Sleep 后就能启动了

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服