因为“文件描述符”数量限制,导致部分设备无法连接到TCP服务器

### 部分设备无法连接到TCP服务器的原因

0. 失败的日志找到了报错:WARNING Server::accept_connection(): accept() failed, Error: Too many open files,原因为“文件描述符”数量限制

1. 检查的位置有

   1. 系统限制 ulimit -n

   2. supervisor minfds 配置,这里是个巨坑,想不到

2. 系统调整方案

   在Linux系统中,可以打开的TCP连接数量受到多个因素的影响,包括操作系统的配置、硬件资源(如内存和CPU)、网络配置等。以下是一些关键的因素和配置选项,可以帮助你优化和增加TCP连接的数量:

   1. **文件描述符限制**

      – 查看当前用户的文件描述符限制:

        “`bash

        ulimit -n

        “`

      – 临时增加当前会话的文件描述符限制:

        “`bash

        ulimit -n 100000

        “`

      – 永久增加文件描述符限制,编辑 `/etc/security/limits.conf`,添加:

        “`

        * soft nofile 100000

        * hard nofile 100000

        “`

   2. **系统文件描述符限制**

      – 查看和设置系统范围的文件描述符限制:

        “`bash

        cat /proc/sys/fs/file-max

        echo 1000000 > /proc/sys/fs/file-max

        “`

      – 永久生效,编辑 `/etc/sysctl.conf`,添加:

        “`

        fs.file-max = 1000000

        “`

        然后运行 `sysctl -p` 以应用更改。

   3. **TCP连接跟踪表(netfilter conntrack)**

      – 查看和设置当前的连接跟踪表大小:

        “`bash

        cat /proc/sys/net/netfilter/nf_conntrack_max

        echo 1000000 > /proc/sys/net/netfilter/nf_conntrack_max

        “`

      – 永久生效,编辑 `/etc/sysctl.conf`,添加:

        “`

        net.netfilter.nf_conntrack_max = 1000000

        “`

        然后运行 `sysctl -p`。

   4. **TCP端口范围**

      – 查看和设置可用的TCP端口范围:

        “`bash

        cat /proc/sys/net/ipv4/ip_local_port_range

        echo “1024 65535” > /proc/sys/net/ipv4/ip_local_port_range

        “`

      – 永久生效,编辑 `/etc/sysctl.conf`,添加:

        “`

        net.ipv4.ip_local_port_range = 1024 65535

        “`

        然后运行 `sysctl -p`。

   5. **TCP回收和再利用**

      – 启用TCP连接的快速回收和再利用:

        “`bash

        echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

        echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

        “`

      – 永久生效,编辑 `/etc/sysctl.conf`,添加:

        “`

        net.ipv4.tcp_tw_reuse = 1

        net.ipv4.tcp_tw_recycle = 1

        “`

        然后运行 `sysctl -p`。

   通过调整这些配置,可以大大增加Linux系统能够同时打开的TCP连接数量。但请注意,增加TCP连接数量也可能增加系统负载,因此需要根据具体需求和硬件资源进行合理调整。

3. supervisor 修改minfds配置

   在宝塔面板中使用 Supervisor 时,修改 `minfds` 配置以增加可以打开的文件描述符数量需要一些额外的步骤。以下是详细的步骤:

    ### 步骤 1:找到 Supervisor 配置文件

    1. 登录宝塔面板。

    2. 在面板左侧的菜单中找到并点击 “软件管理”。

    3. 找到 Supervisor 并点击 “设置” 或 “配置文件”,打开 Supervisor 的配置文件进行编辑。

    ### 步骤 2:编辑 Supervisor 配置文件

    Supervisor 的配置文件路径通常是 `/etc/supervisord.conf` 或 `/etc/supervisor/supervisord.conf`。你需要在配置文件中添加或修改 `minfds` 选项。

    1. 打开配置文件进行编辑:

    “`bash

    sudo nano /etc/supervisord.conf

    “`

    或者:

    “`bash

    sudo nano /etc/supervisor/supervisord.conf

    “`

    2. 在 `[supervisord]` 部分中添加或修改 `minfds` 选项。例如,设置为 100000:

    “`ini

    [supervisord]

    minfds=100000

    “`

    ### 步骤 3:确保系统文件描述符限制适当

    除了修改 Supervisor 的 `minfds` 配置外,还需要确保系统文件描述符限制足够高。具体步骤如下:

    1. **编辑 `/etc/security/limits.conf` 文件**

    “`bash

    sudo nano /etc/security/limits.conf

    “`

    添加以下内容:

    “`ini

    * soft nofile 100000

    * hard nofile 100000

    “`

    2. **编辑 `/etc/pam.d/common-session``/etc/pam.d/common-session-noninteractive` 文件**

    “`bash

    sudo nano /etc/pam.d/common-session

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

    “`

    添加以下内容:

    “`ini

    session required pam_limits.so

    “`

    3. **编辑 `/etc/sysctl.conf` 文件**

    “`bash

    sudo nano /etc/sysctl.conf

    “`

    添加以下内容:

    “`ini

    fs.file-max = 1000000

    “`

    然后运行以下命令以应用更改:

    “`bash

    sudo sysctl -p

    “`

    ### 步骤 4:重新启动 Supervisor

    在修改配置文件后,重新启动 Supervisor 以应用更改:

    “`bash

    sudo supervisorctl reload

    “`

    或使用 systemd 来重新启动 Supervisor 服务:

    “`bash

    sudo systemctl restart supervisord

    “`

    ### 步骤 5:验证配置

    1. 确认配置生效,检查 Supervisor 的日志文件,通常位于 `/var/log/supervisor/supervisord.log`,查看是否有相关的日志记录。

    2. 确认新的文件描述符限制生效:

    “`bash

    su – your_user -c ‘ulimit -n’

    “`

    将 `your_user` 替换为运行 Supervisor 的用户。

    3. 查看当前系统打开的文件描述符数量:

    “`bash

    lsof | wc -l

    “`

    通过这些步骤,你可以在宝塔面板中正确配置 Supervisor 的 `minfds`,确保系统能够处理更多的 TCP 连接,从而避免 `Too many open files` 错误。