调整Linux实例的nofile参数后,远程连接失败或提示“Too many open files”错误怎么办?

问题现象

  • 远程连接失败

    • 通过 SSH 或Workbench 远程连接实例时,连接被拒绝或超时,无法建立会话。

    • 通过 VNC 登录,输入正确的用户名和密码后提示“System error”,无法登录。

  • 业务程序运行异常:

    应用日志或命令行输出“Too many open files”错误。image

问题原因

nofile 资源限制过严/etc/security/limits.conf 文件中的 nofile 参数值决定每个进程可打开文件数量上限,若设置过小,单进程所需打开文件数量超出此限制,将提示无法打开更多文件或直接拒绝登录。

操作步骤

若可登录,可直接修改配置;若已无法登录,则需要通过挂载系统盘方式修复。

可登录实例

  1. 使用root用户登录ECS实例。

    1. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

    2. 进入目标实例详情页,单击远程连接,选择通过Workbench远程连接。根据页面提示使用root用户登录,进入终端页面。

  2. 修改配置文件。

    编辑/etc/security/limits.conf文件,修改hard nofilesoft nofile参数值为默认的65535后,保存并退出。

    * soft nofile 65535
    * hard nofile 65535
    root soft nofile 65535
    root hard nofile 65535
    • 代表所有普通用户,root 代表 root 用户。

    • hard nofile:文件打开数的硬性上限,该值不能超过内核参数/proc/sys/fs/nr_open 的限制,否则可能导致实例登录失败。。

    • soft nofile:当前可打开的文件数限制,该值不得超过hard nofile ,否则配置将被忽略。

      若设置的soft nofile大于hard nofile,实际生效的nofile值为hard nofile参数值。
  3. 使配置生效。

    1. 退出并使用目标用户重新登录ECS实例,使配置生效。

    2. 使用sudo ulimit -n,输出为65535,表示nofile 已更新。

  4. 重启并运行相关业务程序,确认功能恢复正常。

无法登录实例

重要

若系统盘存在历史快照,建议新建快照备份当前数据后,优先利用历史快照回滚系统盘,然后验证恢复正常。

若无历史快照,则需准备一台与故障实例在同一可用区的正常Linux实例,通过挂载系统盘的方式更改nofile参数。

  1. 卸载系统盘。

    确保异常实例状态为已停止,执行以下操作:

    1. 为防止误操作导致数据丢失,建议对系统盘手动创建单个快照,备份当前数据。

    2. 访问ECS控制台-实例。在页面左侧顶部,选择目标资源所在的资源组和地域。

    3. 单击异常实例ID进入实例详情页后,切换至块存储页签。

    4. 系统盘操作列选择更多 > 卸载

    5. 卸载云盘对话框中确认信息,单击确定卸载。当实例状态显示无系统盘时,表示卸载成功。

  2. 作为数据盘挂载至正常实例。

    确保正常实例状态为运行中,执行以下操作:

    1. 挂载异常系统盘至正常实例。

      1. 单击正常实例ID进入实例详情页。

      2. 切换至块存储页签后,单击挂载云盘

      3. 挂载到实例页面的目标盘中,选择已卸载的异常系统盘,单击下一步

      4. 分区及创建文件系统并挂载界面,选择稍后设置,完成挂载。

    2. 单击远程连接,选择通过Workbench远程连接。根据页面提示使用root用户登录,进入终端页面。

    3. 挂载文件系统。

      1. 确定故障盘分区名称。

        lsblk -f
        vda                                                      
        ├─vda1                                                   
        ├─vda2 vfat         7938-FA03                            /boot/efi
        └─vda3 ext4   root  33b46ac5-7482-4aa5-8de0-60ab4c3a4c78 /
        vdb                                                      
        ├─vdb1                                                   
        ├─vdb2 vfat         7938-FA03                            
        └─vdb3 ext4   root  33b46ac5-7482-4aa5-8de0-60ab4c3a4c78                                  

        示例中,故障盘vdb的根分区为vdb3需挂载,各分区含义如下:

        • vdb1/vdb2:存放系统启动相关程序,可忽略。

        • vdb3:存放操作系统文件和数据,需挂载。

      2. 创建目录并挂载文件系统。

        mkdir <挂载目录> && sudo mount /dev/<分区名称> <挂载目录>

        参数

        说明

        <分区名称>

        替换为上一步确定的故障盘的根分区名称。

        <挂载目录>

        自定义<挂载目录>,应为以/开头的空路径,可自定义但不可重复。

        重要

        若目录非空,原目录下文件将被隐藏导致无法读取,请谨慎评估。

        以将目标分区vdb1挂载至新创建的/test为例,需执行mkdir /test && sudo mount /dev/vdb3 /test
      3. 检查文件系统挂载结果。

        运行lsblk命令,若目标分区存在挂载目录(MOUNTPOINT),表示文件系统挂载成功。

  3. 修改配置文件。

    编辑<挂载目录>/etc/security/limits.conf文件,修改hard nofilesoft nofile参数值为默认的65535后,保存并退出。

    * soft nofile 65535
    * hard nofile 65535
    root soft nofile 65535
    root hard nofile 65535
    • 代表所有用户,root 代表 root 用户。

    • hard nofile:文件打开数的硬性上限,该值不能超过内核参数<挂载目录>/proc/sys/fs/nr_open 的限制,否则可能导致实例登录失败。

    • soft nofile:当前可打开的文件数限制,该值不得超过hard nofile ,否则配置将被忽略。

      若设置的soft nofile大于hard nofile,实际生效的nofile值为hard nofile参数值。
  4. 作为系统盘挂载回异常ECS实例。

    1. 卸载文件系统。

      <挂载目录>需替换为实际的挂载路径

      umount <挂载目录>
      示例需执行umount /test
    2. 卸载修复后的系统盘。

      1. 返回ECS控制台,进入正常实例详情页的块存储页签。

      2. 单击修复后的系统盘操作列的卸载

      3. 卸载云盘界面,单击确定卸载

    3. 将修复后的系统盘挂载回源实例。

      1. 进入异常实例详情页的块存储页签,单击挂载云盘

      2. 挂载到实例页面的目标盘中,选择修复后的系统盘,配置登录凭证后,单击下一步

      3. 分区及创建文件系统并挂载界面,选择稍后设置,完成挂载。

    4. 启动ECS实例。

  5. 登录异常ECS实例,查看是否正常。

后续建议

  • 谨慎操作核心系统文件:在修改核心系统文件前,请务必手动创建单个快照备份数据,并确认操作的必要性和潜在风险。切勿轻易修改不熟悉的系统参数。

  • 监控告警:为保障关键业务系统的稳定性与安全性,建议在所有核心实例上部署ulimit -n 配置检查机制。通过定期检测 ulimit -n 的实际运行值及其期望配置的一致性,确保系统资源限制设置符合预期标准,及时发现并预警异常修改行为。