Debido al aumento de usuarios del espacio CN2, el proceso Mysql siempre falla en medio de la noche recientemente. Revisé el registro de errores de Mysql y el mensaje fue: [ERROR] Error al aceptar: demasiados archivos abiertos. La insuficiencia de archivos abiertos hace que la base de datos se cuelgue, especialmente cuando se realiza una copia de seguridad del sistema DirectAdmin por la noche.

El archivo abierto predeterminado en el sistema Linux es 1024. Puede usar ulimit -a para verlo. Este es un límite a nivel del sistema. Además, el archivo abierto predeterminado en mysql también es 1024. En muchos casos, este valor no puede cumplir con nuestro. Necesidades de creación de sitios web, especialmente uno grande. Es fácil que se produzcan demasiados problemas con archivos abiertos en sitios web y grandes centros de bases de datos.

Este artículo es para compartir cómo resolver el error: [ERROR] Error al aceptar: Demasiados archivos abiertos Para obtener más información sobre la optimización del servidor y la resolución de problemas, consulte:

  1. ¡Deja volar las imágenes un rato! Configuración de conversión por lotes de formato WebP de imágenes del sitio web y experiencia de efectos acelerados
  2. Utilice inteligentemente Youpai Cloud FTP y Nut Cloud WebDAV para crear copias de seguridad de archivos personales y almacenamiento de datos en la nube
  3. Protección de seguridad del servidor y host VPS: modificación del puerto SSH, adición a la lista blanca, solo inicio de sesión con clave

1. Detalles del problema de la base de datos

Verifique el registro de errores de la base de datos. Si está utilizando el panel DirectAdmin, la ruta del registro relevante es la siguiente:

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

Abra el registro de errores de Mysql y generalmente aparecerá el siguiente error:

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. Análisis de problemas de bases de datos

2.1 Ver restricciones

Utilice el comando: ulimit -a para ver el open_files_limit de la máquina local:

[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

O utilice el siguiente comando para ver sólo el open_files_limit de un determinado proceso:

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

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

#仅查看Mysql的open files limits:

su mysql ulimit -a

2.2 Modificar límites.conf

método uno:

Puede utilizar el siguiente comando para modificar el archivo /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',请根据自己的实际情况来设定数字

O inicie sesión con la cuenta raíz y luego use el siguiente comando para modificar temporalmente /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

Método dos:

Abra el archivo vi /etc/security/limits.conf y agregue una línea en el archivo: * - nofile 32768, ajustando así los archivos abiertos a 32768.

2.3 Modificar mi archivo.cnf

Editar: vi /etc/my.cnf, agregue el siguiente código debajo de [mysqld]:

[mysqld]
open_files_limit = 1024000

Luego reinicie Mysql de la siguiente manera:

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

2.4 Comprobar si surte efecto

Ejecute el siguiente comando:

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

Puede ver que open_files_limit se ha modificado correctamente:

3. Problema de falla después de reiniciar

Si descubre que los archivos abiertos han vuelto a 1024 después de que se reinicia el sistema, modifique la configuración de acuerdo con el siguiente 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. Resumen

El límite de descriptores de archivos abiertos por MySQL es el límite de descriptores de archivos del sistema operativo Linux, es decir, el valor predeterminado es 1024 y no tiene nada que ver con la configuración open_files_limit en el archivo de configuración de Mysql. Por lo tanto, si desea modificar open_files_limit, primero debe modificar open_files_limit del sistema operativo.

Por supuesto, si no desea modificar la configuración del sistema, también puede usar la cuenta raíz, ejecutar el script mysqld_safe para iniciar MySQL (o usar mysql.server para iniciar) y agregar el comando: –open-files- El límite se puede establecer con éxito, porque cuando mysqld_safe inicia MySQL, de hecho, antes de iniciar el programa mysqld, se llama a ulimit -n $open_files para implementar restricciones de descriptor de archivos.

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

Deja una respuesta