CentOS Too many open file

诊断过程


  1. 查看当前进程已打开的fd
  2. 查看系统fs.file-max
  3. 查看系统单个进程限制fd fs.nr_open
  4. 查看用户的ulimit的nofile的值
  5. 调整ulimit nofile值至适当
  6. 验证调整的值
  7. 参数建议

查看出错时系统fd使用详情

  1. 查看系统所有open的 fd,  如下
    lsof | awk '{print $2}' | sort | uniq -c | sort -nr
  2. 按进程维度查看各个进程的fd使用率
    ps -eo pid,comm | while read pid comm; do
      if [ -e /proc/$pid/fd ]; then
        count=$(ls /proc/$pid/fd | wc -l)
        echo "PID $pid ($comm): $count open files"
      fi
    done
    lsof -p [PID] | wc -l

 

查看系统fs.file-max

  1. 查看系统全局最大文件句柄数限制,即整个系统可以同时打开的最大文件数
    cat /proc/sys/fs/file-max
    
    sysctl -a | grep fs.file-max

 

查看系统fs.nr_open

  1. 查看系统级别的每个进程可以打开的最大文件描述符数量的上限
    cat /proc/sys/fs/nr_open
    
    sysctl -a | grep "fs.nr_open"

 

查看用户级别的nofile信息

  1. 使用ulimit -a
    [20:20:13] root@ALI-HZ-SYS-OPS-CICD-0-252:~ # ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 61371
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 65535
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 61371
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
  2. 使用ulimit -SHn
    [20:20:47] root@ALI-HZ-SYS-OPS-CICD-0-252:~ # ulimit -SHn
    65535

 

调整nofile

  1.  满足条件 nr_open > ulimit -SHn
    # End of file
    root soft nofile 65535
    root hard nofile 65535
    * soft nofile 655350
    * hard nofile 655350
  2. 切换至普通用户查看
    [20:23:10] root@ALI-HZ-SYS-OPS-CICD-0-252:~ # su - nflow
    上一次登录:五 7月 26 16:58:23 CST 2024pts/1 上
    [20:23:43] nflow@ALI-HZ-SYS-OPS-CICD-0-252:~ $ ulimit  -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    scheduling priority             (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 61371
    max locked memory       (kbytes, -l) 64
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 655350
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    real-time priority              (-r) 0
    stack size              (kbytes, -s) 8192
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 61371
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited
  3. 修改指定进程的nofile, 如jenkins.service vim /usr/lib/systemd/system/jenkins.service
    # Arbitrary additional arguments to pass to Jenkins.
    # Full option list: java -jar jenkins.war --help
    #Environment="JENKINS_OPTS="
    
    # Maximum core file size. If unset, the value from the OS is inherited.
    #LimitCORE=infinity
    
    # Maximum file size. If unset, the value from the OS is inherited.
    #LimitFSIZE=infinity
    
    # File descriptor limit. If unset, the value from the OS is inherited.
    LimitNOFILE=655350
  4. 验证指定的进程当前最大的文件句柄数
    [20:26:30] root@ALI-HZ-SYS-OPS-CICD-0-252:~ # cat /proc/$(pgrep -f java)/limits
    Limit                     Soft Limit           Hard Limit           Units
    Max cpu time              unlimited            unlimited            seconds
    Max file size             unlimited            unlimited            bytes
    Max data size             unlimited            unlimited            bytes
    Max stack size            8388608              unlimited            bytes
    Max core file size        0                    unlimited            bytes
    Max resident set          unlimited            unlimited            bytes
    Max processes             61371                61371                processes
    Max open files            655350               655350               files
    Max locked memory         65536                65536                bytes
    Max address space         unlimited            unlimited            bytes
    Max file locks            unlimited            unlimited            locks
    Max pending signals       61371                61371                signals
    Max msgqueue size         819200               819200               bytes
    Max nice priority         0                    0
    Max realtime priority     0                    0
    Max realtime timeout      unlimited            unlimited            us
  5. 创建pam_limits.so

    通常,pam_limits.so 需要在几个关键的 PAM 配置文件中设置。这些文件通常包括:

etc/pam.d/common-session

/etc/pam.d/common-session-noninteractive

/etc/pam.d/login

   确保这些文件中包含以下行:

   session required pam_limits.so

  修改完成之后, 需要退出, 重新登录 (修改参数时切记逻辑关系 /etc/security/limits.conf 中的 nofile不能大于 fs.nr_open的值否则重启之后无法登录系统)

pam

  1. pam_limts.so的作用
    pam_limits.so 是 PAM 模块中的一个,专门用于管理用户会话中的资源限制。它读取 /etc/security/limits.conf 文件以及 /etc/security/limits.d/ 目录中的配置文件,并在启动会话时应用这些限制
  2. session required pam_limits.so 的含义

    session:表示这是一个会话管理模块。

    required:表示这是一个必须成功的模块。如果这个模块失败了,整个会话启动过程也将失败。

    pam_limits.so:指定要加载的 PAM 模块文件。

  3. 为什么需要 session required pam_limits.so?

    为了确保系统在用户登录或启动会话时正确应用资源限制,需要在相关的 PAM 配置文件中包含 pam_limits.so 模块

参数建议

  1. 解数含义解释

    参数项 功能   范围
    fs.file-max 允许操作系统级别最大创建的文件句柄数 系统全局
    fs.nr_open 允许单个进程级别最大创建的文件句柄数 进程级别
    nofile 指linux操作系统用户维度最大的文件句柄灵敏 用户级别
  2. 在调整参数时需要注意逻辑大小关系 fs.file-max > file.nr_open > nofile
  3. fs.file-maxfs.nr_open 的关系

    fs.file-max 是整个系统的总文件描述符限制,而 fs.nr_open 是单个进程的文件描述符限制。它们之间没有直接的数量关系,但 fs.nr_open 应该是小于等于 fs.file-max 的合理值。

    fs.nr_openulimit -n 的关系

    ulimit -n 设置的文件描述符限制不能超过 fs.nr_open。即使你尝试通过 ulimit 设置一个大于 fs.nr_open 的值,也会失败。

    实际应用中的关系

    系统总限制 (fs.file-max):系统管理员设置 fs.file-max 来防止系统资源被耗尽。

    单个进程限制 (fs.nr_open):系统管理员设置 fs.nr_open 来防止单个进程过度使用文件描述符。

    用户级别限制 (ulimit -n):用户或管理员设置 ulimit -n 来控制特定用户会话或进程的文件描述符使用,且不能超过 fs.nr_open

参数未生效原因排查


  以下是参数没有生效排查思路

  1. 检查系统级别的限制
    cat /etc/systemd/system.conf
    cat /etc/systemd/user.conf
  2. 查看用户shell登录配置文件
    cat ~/.bashrc
    cat ~/.profile
    cat ~/.bash_profile
    cat /etc/profile
    cat /etc/bashrc
  3. debug日志
    编辑 /etc/pam.d/common-session 和 /etc/pam.d/common-session-noninteractive:
    
    session required pam_limits.so debug
  4. 查看系统日志
    sudo tail -f /var/log/auth.log
    sudo tail -f /var/log/syslog

     

posted @ 2024-07-26 20:04  MacoPlus  阅读(9)  评论(0编辑  收藏  举报