GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué git falla al empujar/buscar con demasiados archivos abiertos?

Hay dos mensajes de error similares:

EMFILE: Too many open files
ENFILE: Too many open files in system

Parece que obtienes EMFILE , lo que significa que se está excediendo el número de archivos para un proceso individual. Entonces, verificando si vi puede abrir archivos es irrelevante—vi utilizará su propia tabla de archivos separada. Comprueba tus límites con:

$ ulimit -n
1024

Entonces, en mi sistema, hay un límite de 1024 archivos abiertos en un solo proceso. No debería necesitar preguntarle al administrador del sistema (no use el acrónimo SA, es demasiado opaco; si debe abreviar, use "sysadmin") para aumentar el límite.

Es posible que desee verificar qué archivos abre Git ejecutando Git en strace .

Esto podría ser un error en Git o en una biblioteca, o podría ser que esté usando una versión anterior de algo, o podría ser algo más extraño. Prueba strace primero para ver qué archivos abre y verificar si Git cierra esos archivos.

Actualización de Hazok:

Después de usar las recomendaciones anteriores, resulta que el error fue causado por demasiados objetos sueltos. Había demasiados objetos sueltos porque git gc no se ejecutaba con la frecuencia suficiente.


¿Por qué sucedió esto?

De la documentación de git:

Cuando haya aproximadamente más objetos sueltos en el repositorio, git gc --auto los empaquetará. Algunos comandos de Porcelain usan este comando para realizar una recolección de basura ligera de vez en cuando. El valor predeterminado es 6700.

Aquí "Algunos comandos de porcelana" incluye git push , git fetch etc. Entonces, si el límite máximo de archivos abiertos es ulimit -n <6700, eventualmente serás bloqueado por git gc --auto una vez que obtuviste ~6700 objetos sueltos en un solo repositorio de git.

Tengo prisa. ¿Cómo solucionarlo?

Si tiene permisos suficientes para ajustar el ulimit del sistema:

$ sudo ulimit -n 8192

De lo contrario, puede deshabilitar git gc configurando git config gc.auto 0 , para que pueda enviar sus confirmaciones locales al control remoto, eliminar el repositorio y volver a clonarlo sin miles de objetos sueltos.

¿Cómo podemos evitar que esto vuelva a suceder?

Establecer git config --global gc.auto 200 , donde 200 es un valor inferior al límite máximo de archivos abiertos. Si eligió un valor demasiado pequeño, git gc se ejecutaría con demasiada frecuencia, así que elija sabiamente.

Si establece gc.auto=0 , los objetos sueltos nunca se empaquetarán a menos que ejecutes git gc a mano. Por lo tanto, podría haber cientos de miles de archivos acumulados en el mismo directorio, lo que podría ser un problema, especialmente para usuarios de discos duros mecánicos o Windows. (Consulte también:¿Cuántos archivos en un directorio son demasiados? y ¿Está bien (desde el punto de vista del rendimiento) tener cientos o miles de archivos en el mismo directorio de Linux?).


Linux
  1. ¿Por qué el comando Ls tarda en interrumpirse en el directorio Nfs con muchos archivos?

  2. ¿Por qué Rsync falla con tubería rota (32), error en el zócalo Io (código 10) en Io.c (820)?

  3. ¿Por qué Tomcat funciona con el puerto 8080 pero no con el 80?

  4. bash:/bin/tar:lista de argumentos demasiado larga al comprimir muchos archivos con tar

  5. ¿Por qué este código falla con la aleatorización de direcciones activada?

Iniciando udev:udevd inotify_init falló:demasiados archivos abiertos

¿Por qué sed falla con los caracteres internacionales y cómo solucionarlo?

¿Por qué falla la actualización de yum en CentOS 6.4?

Demasiados archivos abiertos (CentOS7):ya intenté establecer límites más altos

¿Por qué el enlace de montaje de un archivo después de desvincular falla con ENOENT?

Demasiados archivos abiertos en Debian