打开的文件太多(CentOS7)- 已尝试设置更高的限制

打开的文件太多(CentOS7)- 已尝试设置更高的限制

第一次设置 VPS – 注意不要在这里询问,除非我做了尽职调查并提供背景信息。

在我的远程 VPS 上,通过终端,我运行的几乎所有命令都会出现一条Error: Too many open files消息,我需要您的帮助才能继续前进。

我运行:CentOS Linux release 7.6.1810 (Core)在一台拥有 1 个 CPU 核心和 2048Mb RAM 的机器上。它已设置了一个 LEMP 堆栈,Nginx 1.16.1, PHP-FPM 7.3.9, MariaDb 10.4.8用于简单的 wordpress 网站。

我努力了:

  1. 谷歌和论坛搜索。
  2. 应用这些设置(每次通过控制面板手动重启 VPS):

系统范围的设置/etc/security/limits.conf

nginx       soft    nofile      1024
nginx       hard    nofile      65536
root        hard    nofile      65536
root        soft    nofile      1024

调整内存限制和上传/etc/php.ini

memory_limit = 256M
file_uploads = On
upload_max_filesize = 128M
max_execution_time = 600
max_input_time = 600
max_input_vars = 3000

PHP rlimit 设置/etc/php-fpm.d/www.conf

rlimit_files = 65535

设置 NGINX 限制(和其他设置)nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  10000;
}

worker_rlimit_nofile 100000;


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;
    client_body_buffer_size 128k;
    client_header_buffer_size 10k;
    client_max_body_size 100m;
    large_client_header_buffers 4 256k;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    server_names_hash_bucket_size 64;
}

以下是输出cat /proc/sys/fs/file-nr

45216   0   6520154

以下是输出ps aux|grep nginx|grep -v grep

root       928  0.0  0.0  46440  1192 ?        Ss   00:25   0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx      929  0.0  0.2  50880  6028 ?        S    00:25   0:00 nginx: worker process
nginx     9973  0.0  0.1 171576  4048 ?        S    04:28   0:00 php-fpm: pool www
nginx     9974  0.0  0.1 171576  4048 ?        S    04:28   0:00 php-fpm: pool www
nginx     9975  0.0  0.1 171576  4048 ?        S    04:28   0:00 php-fpm: pool www
nginx     9976  0.0  0.1 171576  4048 ?        S    04:28   0:00 php-fpm: pool www
nginx     9977  0.0  0.1 171576  4052 ?        S    04:28   0:00 php-fpm: pool www

切换用户并使用以下nginx方式su - nginx检查限制: ulimit -Sn返回1024 ulimit -Hn返回65536

命令lsof | wc -l返回:4776

希望您能帮助我找到正确的方法来解决文件过多的问题!

编辑 - 以下命令显示更多信息:

service nginx restart

Redirecting to /bin/systemctl restart nginx.service
Error: Too many open files
Job for nginx.service failed because a configured resource limit was exceeded. See "systemctl status nginx.service" and "journalctl -xe" for details.
[root@pars ~]# systemctl status nginx.service
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/nginx.service.d
           └─worker_files_limit.conf
   Active: failed (Result: resources) since Fri 2019-09-13 05:32:23 CEST; 14s ago
     Docs: http://nginx.org/en/docs/
  Process: 1113 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 1125 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 870 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/virtualizor.service/system.slice/nginx.service

Sep 13 05:32:22 pars.work systemd[1]: Starting nginx - high performance web server...
Sep 13 05:32:22 pars.work systemd[1]: PID file /var/run/nginx.pid not readable (yet?) after start.
Sep 13 05:32:22 pars.work systemd[1]: Failed to set a watch for nginx.service's PID file /var/run/nginx.pid: Too many open files
Sep 13 05:32:23 pars.work systemd[1]: Failed to kill control group: Input/output error
Sep 13 05:32:23 pars.work systemd[1]: Failed to kill control group: Input/output error
Sep 13 05:32:23 pars.work systemd[1]: Failed to start nginx - high performance web server.
Sep 13 05:32:23 pars.work systemd[1]: Unit nginx.service entered failed state.
Sep 13 05:32:23 pars.work systemd[1]: nginx.service failed.

答案1

实际上不是打开文件句柄用完了,而是 inotify 监视的。

您可以在错误消息中看到这一点:

Sep 13 05:32:22 pars.work systemd[1]: Failed to set a watch for nginx.service's PID file /var/run/nginx.pid: Too many open files

要解决这个问题,你需要增加系统可用的 inotify 监视数量。如果你真的检查一下,你会发现它有一个非常低的值,比如 8192。

$ sysctl fs.inotify.max_user_watches
fs.inotify.max_user_watches = 8192

您可以通过编辑或创建目录中的文件将 sysctlfs.inotify.max_user_watches持久设置为更高的值。例如,我的系统有:/etc/sysctl.conf/etc/sysctl.d

$ cat /etc/sysctl.d/10-user-watches.conf 
fs.inotify.max_user_watches = 1048576

然后用 加载它sysctl -p

你可能不想直接拨打该号码,导致内核分配内存来跟踪一百万个用户文件监视槽;相反,只需取当前值并将其加倍,直到问题不再发生。

答案2

要更改服务的 ulimit 设置,您需要修改 systemd 单元。

sudo systemctl edit --full nginx.service

并将所需值添加到服务部分

[Service]
LimitNOFILE=<integer>
...

答案3

在 /etc/security/limits.d/NN-custom.conf 创建一个新文件(将 NN 替换为一些数字,例如 20、30 等)。文件的名称无关紧要,但扩展名应为 .conf

将以下内容放入上述文件中(这些内容与您在帖子中提到的相同,根据您的需要进行调整):

 nginx       soft    nofile      1024 
 nginx       hard    nofile      65536 
 root        hard    nofile      65536 
 root        soft    nofile      1024

运行# sysctl -p /etc/security/limits.d/NN-custom.conf

注销并重新登录并重新启动您的服务。

希望这可以帮助。

答案4

Debian 9 和 Debian 10 buster 也存在同样的问题。

显示错误:

Failed to allocate directory watch: Too many open files

并且增加 Linux 中打开的文件数量也没有帮助,它已经达到了最大值:

fs.file-max = 9223372036854775807

修复方法是将用户实例数从 128 增加到如下数量或更多:

sysctl fs.inotify.max_user_instances=1024

并通过手表使其永久存在:

sudo bash -c 'cat <<EOF> /etc/sysctl.d/fs_inotify.conf
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
EOF'

相关内容