A causa dell'aumento degli utenti dello spazio CN2, il processo Mysql si è sempre bloccato nel cuore della notte di recente. Ho controllato il registro degli errori di Mysql e il messaggio era: [ERRORE] Errore nell'accettazione: troppi file aperti essere a causa di file aperti. L'insufficienza dei file può causare il blocco del database, soprattutto quando viene eseguito il backup del sistema DirectAdmin di notte.

Il file di apertura predefinito nel sistema Linux è 1024. È possibile utilizzare ulimit -a per visualizzarlo. Questo è un limite a livello di sistema. Inoltre, anche il file aperto predefinito in mysql è 1024. In molti casi, questo valore non può soddisfare i nostri. esigenze di creazione di siti Web, soprattutto quelli di grandi dimensioni. Troppi problemi di file aperti possono facilmente verificarsi nei siti Web e negli enormi centri database.

Questo articolo spiega come risolvere l'errore: [ERRORE] Errore nell'accettazione: troppi file aperti. Per ulteriori informazioni sull'ottimizzazione del server e sulla risoluzione dei problemi, fare riferimento a:

  1. Lascia volare le immagini per un po'! Immagine del sito Web Impostazioni di conversione batch in formato WebP ed esperienza con effetti accelerati
  2. Utilizza in modo intelligente Youpai Cloud FTP e Nut Cloud WebDAV per creare il backup di file personali e l'archiviazione di dati nel cloud
  3. Protezione della sicurezza dell'host e del server VPS: modifica della porta SSH, aggiunta alla whitelist, solo accesso con chiave

1. Dettagli del problema del database

Controllare il registro degli errori del database Se si utilizza il pannello DirectAdmin, il percorso del registro pertinente è il seguente:

#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.

Apri il registro degli errori Mysql e generalmente verrà richiesto il seguente errore:

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. Analisi dei problemi del database

2.1 Visualizza restrizioni

Utilizzare il comando: ulimit -a per visualizzare open_files_limit: della macchina locale

[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

Oppure utilizza il comando seguente per visualizzare solo open_files_limit di un determinato processo:

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

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

#仅查看Mysql的open files limits:

su mysql ulimit -a

2.2 Modifica limiti.conf

metodo uno:

È possibile utilizzare il comando seguente per modificare il file /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',请根据自己的实际情况来设定数字

Oppure accedi con l'account root e quindi utilizza il seguente comando per modificare temporaneamente /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

Metodo due:

Apri il file vi /etc/security/limits.conf e aggiungi una riga nel file: * - nofile 32768, regolando così i file aperti a 32768.

2.3 Modificare il file my.cnf

Modifica: vi /etc/my.cnf, aggiungi il seguente codice sotto [mysqld]:

[mysqld]
open_files_limit = 1024000

Quindi riavvia Mysql come segue:

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

2.4 Controlla se ha effetto

Esegui il seguente comando:

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

Puoi vedere che open_files_limit è stato modificato con successo:

3. Problema di guasto dopo il riavvio

Se scopri che i file aperti sono tornati a 1024 dopo il riavvio del sistema, modifica la configurazione secondo il seguente comando:

#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. Riepilogo

Il limite del descrittore di file aperto da MySQL è il limite del descrittore di file del sistema operativo Linux, ovvero il valore predefinito è 1024 e non ha nulla a che fare con l'impostazione open_files_limit nel file di configurazione Mysql. Pertanto, se desideri modificare open_files_limit, devi prima modificare open_files_limit del sistema operativo.

Naturalmente, se non vuoi modificare le impostazioni di sistema, puoi anche usare l'account root, eseguire lo script mysqld_safe per avviare MySQL (o usare mysql.server per avviare) e aggiungere il comando: –open-files- limit può essere impostato con successo, perché quando mysqld_safe avvia MySQL, infatti, prima di avviare il programma mysqld, viene chiamato ulimit -n $open_files per implementare le restrizioni del descrittore di file.

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

lascia un commento