CN2 スペース ユーザーの増加により、最近、Mysql プロセスが夜中に必ずクラッシュするようになりました。Mysql エラー ログを確認すると、プロンプトは次のとおりでした。[エラー] 受け入れ中のファイルが多すぎます。開いているファイルが不足すると、特に DirectAdmin システムが夜間にバックアップされる場合にデータベースがハングアップする可能性があります。

Linux システムのデフォルトのオープン ファイルは 1024 です。これを表示するには ulimit -a を使用できます。また、mysql のデフォルトのオープン ファイルも 1024 です。多くの場合、この値は設定を満たすことができません。 Web サイト構築のニーズ、特に大規模なものでは、Web サイトや巨大なデータベース センターでは、開いているファイルが多すぎるという問題が簡単に発生します。

この記事では、エラー「[エラー] 受け入れエラー: 開いているファイルが多すぎます」の解決方法を説明します。サーバーの最適化と問題解決の詳細については、以下を参照してください。

  1. しばらく写真を飛ばしましょう! Webサイト画像のWebP形式一括変換設定と高速効果体験
  2. Youpai Cloud FTP と Nut Cloud WebDAV を賢く使用して、個人ファイルのバックアップとデータ クラウド ストレージを作成します
  3. VPS ホストとサーバーのセキュリティ保護: SSH ポートの変更、ホワイトリストの追加、キーログインのみ

1. データベースの問題の詳細

DirectAdmin パネルを使用している場合は、データベース エラー ログを確認します。関連するログ パスは次のとおりです。

#DirectAdmin:
/var/log/directadmin/error.log
/var/log/directadmin/errortaskq.log
/var/log/directadmin/system.log
/var/log/directadmin/security.log


#Apache:
/var/log/httpd/error_log
/var/log/httpd/access_log
/var/log/httpd/suexec_log
/var/log/httpd/fpexec_log
/var/log/httpd/domains/domain.com.error.log
/var/log/httpd/domains/domain.com.log
/var/log/messages (generic errors)


#Proftpd:
/var/log/proftpd/access.log
/var/log/proftpd/auth.log
/var/log/messages (generic errors)


#PureFTPd:
/var/log/pureftpd.log


#Dovecot and vm-pop3d:
/var/log/maillog
/var/log/messages


#named (bind):
/var/log/messages


#exim:
/var/log/exim/mainlog
/var/log/exim/paniclog
/var/log/exim/processlog
/var/log/exim/rejectlog

#(on FreeBSD, they have "exim_" in front of the filenames)

#mysqld:
#RedHat:
/var/lib/mysql/server.hostname.com.err

#FreeBSD and Debian:
/usr/local/mysql/data/server.hostname.com.err


#crond:
/var/log/cron


#To view a log file, run:
less /var/log/filename

#Where /var/log/filename is the path of the log you wish to view.  If the log is too large you can use the "tail" command:
tail -n 30 /var/log/filename

#Where 30 is the number of lines from the end you wish to view.

Mysql エラー ログを開くと、通常、次のエラーが表示されます。

190902  3:16:52 [ERROR] Error in accept: Too many open files
190902  3:21:08 [ERROR] Error in accept: Too many open files
190902  3:25:24 [ERROR] Error in accept: Too many open files
190902  3:29:40 [ERROR] Error in accept: Too many open files
190902  3:33:56 [ERROR] Error in accept: Too many open files
190902  3:38:12 [ERROR] Error in accept: Too many open files
190902  3:42:28 [ERROR] Error in accept: Too many open files
190902  3:46:44 [ERROR] Error in accept: Too many open files
190902  3:51:00 [ERROR] Error in accept: Too many open files
190902  3:55:16 [ERROR] Error in accept: Too many open files
190902  3:59:32 [ERROR] Error in accept: Too many open files
190902  4:03:48 [ERROR] Error in accept: Too many open files
190902  4:08:04 [ERROR] Error in accept: Too many open files
190902  4:12:20 [ERROR] Error in accept: Too many open files
190902  4:16:37 [ERROR] Error in accept: Too many open files
190902  4:20:53 [ERROR] Error in accept: Too many open files
190902  4:25:09 [ERROR] Error in accept: Too many open files
190902  4:29:25 [ERROR] Error in accept: Too many open files
190902  4:33:41 [ERROR] Error in accept: Too many open files
190902  4:37:57 [ERROR] Error in accept: Too many open files
190902  4:42:13 [ERROR] Error in accept: Too many open files
190902  4:46:29 [ERROR] Error in accept: Too many open files
190902  4:50:45 [ERROR] Error in accept: Too many open files

2. データベースの問題分析

2.1 閲覧制限

コマンド ulimit -a を使用して、ローカル マシンの open_files_limit: を表示します。

[root@sc3 ~]# 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) 15675
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
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) 15675
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

または、次のコマンドを使用して、特定のプロセスの open_files_limit のみを表示します:

#直接查看 open files限制数字
ulimit -n

#仅查看soft 和 hard open files limits :
ulimit -Hn
ulimit -Sn

#仅查看Mysql的open files limits:

su mysql ulimit -a

2.2limits.confを変更する

方法 1:

次のコマンドを使用して、/etc/security/limits.conf ファイルを変更できます。

#To set the ceiling of the limits available (the max a soft or hard limit can be set by each user).
#NOTE: this is set by a PAM during authentication, and NOT at boot. 
#编辑文件

vi /etc/security/limits.conf

#Add the following to bottom of file to set for everything *:
#添加以下谷贱伤农

* soft nofile 1024000
* hard nofile 1024000
* soft nproc 10240
* hard nproc 10240

#To set only a specific user, like mysql then put in:
#或者指定Mysql

mysql hard nofile 1024000
mysql soft nofile 1024000

#Repeat for /etc/security/limits.d/90-nproc.conf
#同样对90-nproc.conf也是一样的操作

vi /etc/security/limits.d/90-nproc.conf

#Add the following:

* soft nofile 1024000
* hard nofile 1024000
* soft nproc 10240
* hard nproc 10240

#root soft nproc unlimited
#I selected '1024000', which is fairly high; you can surely set this lower to something like '102400',请根据自己的实际情况来设定数字

または、root アカウントでログインし、次のコマンドを使用して /etc/security/limits.conf を一時的に変更します。

ulimit -Hn 1024000


#Edit /etc/init.d/mysqld and add this to the top, after #!/bin/sh
#或者编辑修改/etc/init.d/mysqld,加入以下代码:
ulimit -HSn 1024
ulimit -HSn 32768
ulimit -HSn 1024000

方法 2:

vi /etc/security/limits.conf ファイルを開き、ファイルに次の行を追加します: * - nofile 32768。これにより、open files が < に調整されます。 bpt3 >32768。

2.3 my.cnf ファイルを変更する

編集: vi /etc/my.cnf[mysqld] の下に次のコードを追加します。

[mysqld]
open_files_limit = 1024000

次に、次のように Mysql を再起動します。

/etc/init.d/mysqld restart
#或者
service mysqld restart

2.4 有効かどうかを確認する

次のコマンドを実行します。

mysql -u root -p 
show global variables like 'open%';
#如果是DirectAdmin面板
mysql -u da_admin -p 
show global variables like 'open%';

open_files_limit が正常に変更されたことがわかります。

3. 再起動後の障害問題

システムの再起動後に開いているファイルが 1024 に戻っていることが判明した場合は、次のコマンドに従って構成を変更します。

#One fix: simply restart mysqld after the system boots up.
#最简单的方法再次重启Mysql

service mysqld restart

#另一种方法
#Another fix is to set these values at boot time before everything else (permanent):
vi /etc/init.d/mysqld

#Add the following:
#添加以下内容:
ulimit -S -n ${DAEMON_FILES_LIMIT:-102400} >/dev/null 2>&1

#然后在 /etc/my.cnf 中添加以下内容:
[myqld_safe]
open_files_limit = 102400
#或者是
[myqld]
open_files_limit = 102400

4. まとめ

MySQL によって開かれるファイル記述子の制限は、Linux オペレーティング システムのファイル記述子の制限、つまりデフォルトは 1024 であり、Mysql 設定ファイルの open_files_limit 設定とは関係ありません。したがって、open_files_limit を変更する場合は、まずオペレーティング システムの open_files_limit を変更する必要があります。

もちろん、システム設定を変更したくない場合は、root アカウントを使用し、mysqld_safe スクリプトを実行して MySQL を起動し (または mysql.server を使用して起動し)、コマンド –open-files- を追加することもできます。 mysqld_safe が MySQL を開始するとき、実際には mysqld プログラムを開始する前に ulimit -n $open_files が呼び出され、ファイル記述子の制限が実装されるため、制限は正常に設定できます。

./mysqld_safe --open-files-limit=25000 &
root@(none) 02:50:54>show variables like "%open_files_limit%";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 25000 |
+------------------+-------+

返信を残す