在 Linux 系统中,/etc/security/limits.conf 文件用于设置用户的资源限制(如 nofile,即最大打开文件数)。要动态调整(即临时生效)或永久生效nofile 值,需要结合 ulimit 命令、系统内核参数以及配置文件的修改。以下是详细步骤:

一、临时调整(动态生效)

临时调整适用于当前终端会话或进程,无需修改配置文件,但重启后会失效。

1. 使用 ulimit 命令

查看当前限制

ulimit -n      # 查看当前软限制
ulimit -Hn     # 查看当前硬限制

临时修改限制

ulimit -Sn <soft_value>   # 设置软限制
ulimit -Hn <hard_value>   # 设置硬限制

示例:将软限制设为 10240,硬限制设为 20480:

ulimit -Sn 10240
ulimit -Hn 20480

验证修改

ulimit -n      # 应显示新的软限制

2. 注意事项

  • ulimit 命令仅对当前终端会话有效,退出后恢复原值。

  • 普通用户无法通过 ulimit 修改硬限制(除非有 root 权限)。

  • 硬限制不能超过系统级别的 file-maxnr_open(见下文)。

二、永久生效(修改配置文件)

要永久生效,需要修改 /etc/security/limits.conf 文件,并确保系统级参数(file-maxnr_open)足够大。

1. 修改 /etc/security/limits.conf

  • 编辑文件

    sudo vi /etc/security/limits.conf
  • 添加或修改以下内容

    * soft nofile <soft_value>
    * hard nofile <hard_value>

    示例:设置所有用户软限制为 65535,硬限制为 65535:

    * soft nofile 65535
    * hard nofile 65535

    如果只想针对特定用户(如 rootnginx),将 * 替换为用户名。

  • 保存并退出,然后重新登录用户或重启服务以生效。

2. 确保系统级参数足够大

nofile 的硬限制不能超过系统级参数 file-maxnr_open。需要检查并调整这些值:

  • 查看当前值

    cat /proc/sys/fs/file-max       # 系统范围最大文件数
    cat /proc/sys/fs/nr_open        # 单个进程最大文件数(内核版本需 ≥ 2.6.25)
  • 临时修改(重启后失效):

    echo <new_value> > /proc/sys/fs/file-max
    echo <new_value> > /proc/sys/fs/nr_open
  • 永久修改(编辑 /etc/sysctl.conf):

    sudo vi /etc/sysctl.conf

    添加以下内容:

    fs.file-max = <value>
    fs.nr_open = <value>

    示例

    fs.file-max = 2000000
    fs.nr_open = 2000000
  • 应用配置

    sudo sysctl -p

3. 特殊系统(如 Ubuntu 18.04+ 或 systemd 系统)

  • 修改 systemd 配置: 在 /etc/systemd/system.conf/etc/systemd/user.conf 中添加:

    DefaultLimitNOFILE=<value>

    示例

    DefaultLimitNOFILE=65535
  • 重启 systemd

    sudo systemctl daemon-reexec

4. 验证配置

  • 重新登录用户或重启服务后,检查限制是否生效:

    ulimit -n      # 查看当前软限制
  • 检查系统级参数

    cat /proc/sys/fs/file-max
    cat /proc/sys/fs/nr_open

三、常见问题与注意事项

1. 限制值层级关系

  • 软限制(soft limit)硬限制(hard limit)系统级 nr_open系统级 file-max

  • 如果 limits.conf 中的 hard nofile 超过 nr_openfile-max,配置将无效,甚至可能导致服务无法启动。

2. 服务重启

  • 修改后需要重启服务重新登录用户才能生效。

    • 对于服务(如 Nginx、MySQL),需重启服务:

      sudo systemctl restart nginx

3. 容器环境

  • 在 Docker 容器中调整 nofile

    • 修改容器的 ulimit 配置:

      docker run --ulimit nofile=<soft>:<hard> ...
    • 或在容器内手动调整(需容器镜像支持 ulimit)。

4. 系统兼容性

  • nr_open 参数:仅在内核版本 ≥ 2.6.25 时支持。

    uname -r      # 查看内核版本

四、完整操作示例

假设需要将所有用户的 nofile 软限制设为 65535,硬限制设为 65535,并确保系统级参数足够大:

# 1. 修改 /etc/security/limits.conf
echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 65535" | sudo tee -a /etc/security/limits.conf

# 2. 修改系统级参数(/etc/sysctl.conf)
echo "fs.file-max = 2000000" | sudo tee -a /etc/sysctl.conf
echo "fs.nr_open = 2000000" | sudo tee -a /etc/sysctl.conf

# 3. 应用系统级参数
sudo sysctl -p

# 4. 修改 systemd 配置(Ubuntu 18.04+)
echo "DefaultLimitNOFILE=65535" | sudo tee -a /etc/systemd/system.conf
echo "DefaultLimitNOFILE=65535" | sudo tee -a /etc/systemd/user.conf
sudo systemctl daemon-reexec

# 5. 重新登录用户或重启服务

通过以上步骤,你可以动态或永久调整 nofile 值,确保应用程序在高并发场景下正常运行。

文章作者: 楚少爱看雪
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 楚少爱看雪
学习
喜欢就支持一下吧