我正在尝试修复运行游戏服务器一两天后出现的以下错误。
2017/12/13 12:08:35 http: Accept error: accept tcp [::]:8081: accept4: too many open files; retrying in 1s
我将“fs.file-max = 2000000”添加到/etc/sysctl.conf并执行
sysctl -w fs.file-max=2000000
sysctl -p
我的全局限制现已更新(我需要重新启动吗?),但软限制和硬限制仍然分别为 1024 和 4096。
另外,使用以下命令检查 root 用户的“打开文件”时:
su - root -c 'ulimit -aHS' -s '/bin/bash'
我也得到了1024。
软限制和硬限制有什么作用?我是否需要更改它们才能使全局限制生效?那么用户(root)限制又如何呢?
谢谢!
答案1
您设置的限制sysctl
是适用于整个系统的系统设置。它不是适用于单个进程的限制。
每个进程最多可以打开 N 个文件,其中 N 是进程的NOFILE
软限制,并且可以将自己的软限制更改为不超过硬限制。只有以 root 身份运行的进程才能提高其硬限制。进程会继承其父进程的限制。
更改单个服务的限制的方法(这是您应该做的)取决于您的 init 系统。
- 对于 SysVinit (CentOS ≤6):编辑服务的 init 脚本(通常位于
/etc/rc.d/init.d
)以在运行守护程序之前调用ulimit
,然后重新启动服务。 对于 Systemd (CentOS ≥7):编辑服务的单元文件
/etc/systemd/system/my_game_server.service
并添加一个指令LimitNOFILE=16384
然后运行
systemctl daemon-reload
以重新加载配置,然后重新启动服务。
答案2
您可以更改 中的限制/etc/security/limits.conf
。注销并重新登录即可生效。
Hardlimit:某个用户的边界 - 该用户在运行时不能增加,只能减少:ulimit -Hu 2000
。硬限制列表:ulimit -Ha
软限制:硬限制内的“软”边界,用户可以在运行时更改:ulimit -Su 10000
软限制列表:ulimit -Sa
更改正在运行的进程的 ulimits:prlimit -p $$ --nproc=1200:
。这会将当前 shell 的进程数 (softlimit) 更改为 1200 $$
。
答案3
您可以更改文件中的限制数量/etc/security/limits.conf
(对于特定用户或每个人)您应该像这样添加:
username soft nofile 4096
username hard nofile 5120
这会将打开文件的数量设置为 4096(软限制),将 5120 设置为最高
进行此编辑后,您需要重新登录并重新启动服务才能对此负责。
据我记得,ulimit
只有在您从该用户注销之前才会进行更改