web-dev-qa-db-ja.com

開いているファイルが多すぎます(CentOS7)-すでに上限を設定しようとしました

初めてVPSを設定する–十分な注意を払い、コンテキストを提供しない限り、ここで質問しないように注意してください。

私のリモートVPSでは、ターミナルを介して、実行するほとんどすべてのコマンドが_Error: Too many open files_メッセージで終了します。先に進むには、あなたの助けが必要です。

私が実行するのは、1 CPUコアと2048Mb RAMを搭載したマシンでCentOS Linux release 7.6.1810 (Core)です。シンプルなwordpressサイトを対象としたLEMPスタック_Nginx 1.16.1, PHP-FPM 7.3.9, MariaDb 10.4.8_でセットアップされています。

私が試してみました:

  1. Googleおよびフォーラム検索。
  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
_

_/etc/php-fpm.d/www.conf_のPHP rlimit設定:

_rlimit_files = 65535
_

_nginx.conf_でのNGINX制限(およびその他の設定)の設定:

_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
_

_su - nginx_を使用してユーザーをnginxに切り替え、次を使用して制限を確認しています:_ulimit -Sn_は_1024_を返します_ulimit -Hn_ returns _65536_

_lsof | wc -l_コマンドは次を返します:_4776_

多すぎるファイルの問題を解決するために私を正しい方向に導くのを助けてくれることを願っています!

[〜#〜] edit [〜#〜]-次のコマンドは詳細を表示します:

_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.
_
6

実行されたのは、実際には開いているファイルハンドルではなく、監視を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

fs.inotify.max_user_watchesを編集するか、/etc/sysctl.confディレクトリにファイルを作成することで、sysctl /etc/sysctl.dを永続的に高い値に設定できます。たとえば、私のシステムには次のようなものがあります。

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

そして、それをsysctl -pでロードします。

あなたはその数に直接行きたくないかもしれません カーネルが100万のユーザーファイル監視スロットを追跡するためにメモリを割り当てるので ;代わりに、現在の値を取得し、問題が発生しなくなるまで2倍にします。

9
Michael Hampton

サービスのulimit設定を変更するには、systemdユニットを変更する必要があります。

Sudo systemctl edit --full nginx.service

そして、希望する値をサービスセクションに追加します

[Service]
LimitNOFILE=<integer>
...
0
HBruijn

/etc/security/limits.d/NN-custom.confに新しいファイルを作成します(NNを20,30 ..etcなどの番号に置き換えます)。ファイルの名前は重要ではありませんが、拡張子は.confにする必要があります

上記のファイルに次の内容を入力します(これらは投稿で述べたものと同じであり、必要に応じて調整します)。

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

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

ログオフして再度ログインし、サービスを再起動します。

お役に立てれば。

0
NeedFrnds