GNU/Linux >> Tutoriales Linux >  >> Linux

¿En qué difieren ulimit -n y /proc/sys/fs/file-max?

Solución 1:

file-max es el máximo de descriptores de archivo (FD) aplicado a nivel de kernel, que no puede ser superado por todos los procesos sin aumentar. El ulimit se aplica en un nivel de proceso, que puede ser inferior al file-max .

No hay riesgo de impacto en el rendimiento al aumentar file-max . Las distribuciones modernas tienen un FD máximo establecido bastante alto, mientras que en el pasado requería una recompilación y modificación del kernel para aumentar más allá de 1024. No aumentaría en todo el sistema a menos que tenga una necesidad técnica.

La configuración por proceso a menudo necesita ajustarse para servir a un demonio en particular, ya sea una base de datos o un servidor web. Si elimina el límite por completo, ese demonio podría potencialmente agotar todos los recursos disponibles del sistema; lo que significa que no podrá solucionar el problema, excepto presionando el botón de reinicio o el ciclo de encendido. Por supuesto, es probable que cualquiera de los dos provoque la corrupción de los archivos abiertos.

Solución 2:

La limitación de ulimit es por usuario único. Por lo tanto, el usuario 1, independientemente de cuántas veces haya iniciado sesión o haya procesos en ejecución, estaría limitado a 1024. Está combinado.

No estoy seguro de entender completamente el significado de esa oración (el inglés no es mi lengua materna). Si esa oración significa que la configuración ulimit para los descriptores de archivos no es una limitación por proceso, la respuesta aceptada (AFAIK) es incorrecta.

Lo que quiero decir es que si algún usuario ha lanzado 4 procesos y la configuración ulimit para FD es 1024, cada proceso puede abrir 1024 FD. El usuario no estará limitado a 1024 FD, sino a los procesos que inicie ese usuario.

Por ejemplo:

[email protected]:~$ ulimit -n
1024
[email protected]:~$ lsof | grep $USER | wc -l
8145

Aquí un ejemplo de perl donde alcanzamos el límite (es un límite por proceso):

#!/usr/bin/perl

$count = 0;
@filedescriptors;

while ($count <= 1024) {
    $FILE = ${count};
    open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
    push(@filedescriptors, $FILE);
    $count ++;
}

Resultado:

FDs: 1021 Too many open files at ./test.pl line 8.

1021 porque había 3 descriptores de archivos abiertos antes de llegar al ciclo while (stdout, stdin y stderr)

Lo siento si estoy completamente equivocado o no entendí bien la respuesta.


Linux
  1. Cómo mover /usr y /var a otra partición o disco

  2. ¿Cómo obtengo la ruta de un proceso en Unix/Linux?

  3. montar dev, proc, sys en un entorno chroot?

  4. ¿Cómo saber desde qué carpeta se está ejecutando un proceso?

  5. /sys/ documentación?

Archivos /proc/cpuinfo y /proc/meminfo en Linux

Comprender los archivos /proc/mounts, /etc/mtab y /proc/partitions

/proc/[pid]/pagemaps y /proc/[pid]/maps | linux

¿En qué se diferencian SO_REUSEADDR y SO_REUSEPORT?

¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

Cómo usa Linux /dev/tty y /dev/tty0