配置了最大连接数 65535,但是/etc/rc.local 里的没生效

2017-10-27 23:14:15 +08:00
 whx20202
就是我按照网上的说法,在 /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 不够用,毕竟是代理软件
谢谢
5587 次点击
所在节点    Linux
16 条回复
anjunecha
2017-10-27 23:30:58 +08:00
什么系统咯?如果是 centos7 的话我记得有一个地方是要更改的
whx20202
2017-10-27 23:34:23 +08:00
@anjunecha Ubuntu 16.04
anjunecha
2017-10-27 23:37:57 +08:00
@whx20202 应该是 systemd 的原因,你可以查查相关的资料看看
pkking
2017-10-28 00:20:59 +08:00
prlimit -n xxx -p pid
whx20202
2017-10-28 00:27:59 +08:00
@pkking 这个要在启动 TcpRoute2 之后,给进程 pid 用上吗?
artandlol
2017-10-28 03:53:39 +08:00
{
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
}
lesteryu
2017-10-28 06:58:24 +08:00
用 systemd 的服务不会加载 limits.conf,得在 systemd 服务的配置里改。

*. 可以试一下 sudo systemctl edit rc-local.service,然后添加:
[Service]
LimitNOFILE=65536

*. 更好的方法是把 TcpRoute2 做成一个单独的 systemd 服务,然后设置 LimitNOFILE。
ryd994
2017-10-28 07:56:48 +08:00
好好用 systemd 服务文件,不要用 rclocal 来启动服务
rclocal 就是给你启动时自动写点参数用的而已
julyclyde
2017-10-28 08:55:24 +08:00
哈哈哈,常见错误

/etc/security/limits.conf 是 pam_limits.so 的配置文件,一般只有在“登录”的时候才执行,用于从(login/sshd)+pam_limits.so 的 root 身份降级到普通用户之前,设置好 rlimits

而你这个根本就没有登录这个动作
gamexg
2017-10-28 17:46:30 +08:00
2. 记得高点的 linux 内核版本支持,不过目前版本的 tcproute 不再增加功能了,下一个版本会直接重写,目前只完成了一部分,全部完成会比较久...
yesono
2017-10-29 08:39:36 +08:00
chmod +x /etc/rc.local
tangbao
2017-10-29 18:19:15 +08:00
我遇到过类似的坑 想开机跑一些脚本 但是 rc.local 添加进去后没有反应

lz 你试试在你的命令前面添加一个 sleep 10s 让系统完全启动了以后再运行这个脚本试试
julyclyde
2017-10-30 15:09:55 +08:00
@tangbao sleep 不可能有效的,别想了
tangbao
2017-10-30 16:50:58 +08:00
@julyclyde 我的不可描述 Server 就是加了 sleep 启动的啊
julyclyde
2017-10-30 16:56:40 +08:00
@tangbao 时间上的相关关系并不等于因果关系
tangbao
2017-11-03 22:01:56 +08:00
@julyclyde 但是我启动不了的服务的确加了 Sleep 后就能启动了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/401409

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX