¿Los valores de limit.conf se aplican por proceso?

25

Estoy ajustando el nofilevalor /etc/security/limits.confpara mi usuario de Oracle y tengo una pregunta sobre su comportamiento: nofilelimita el número total de archivos que el usuario puede tener abiertos para todos sus procesos o limita el número total de archivos que el usuario puede tener abierto para cada uno de sus procesos?

Específicamente, para el siguiente uso:

oracle                  hard    nofile                  65536
Christopher Neylan
fuente

Respuestas:

23

La mayoría de los valores¹ en limits.confson límites que se pueden establecer con el ulimitcomando de shell o la setrlimitllamada al sistema. Son propiedades de un proceso. Los límites se aplican independientemente para cada proceso. En particular, cada proceso puede tener hasta nofilearchivos abiertos. No hay límite para la cantidad de archivos abiertos acumulados por los procesos de un usuario.

El nproclímite es un caso un poco especial, ya que suma todos los procesos de un usuario. No obstante, todavía se aplica por proceso: cuando un proceso llama forkpara crear un nuevo proceso, la llamada se rechaza si el número de procesos que pertenecen al euid del proceso es mayor que el RLIMIT_NPROCvalor del proceso .

La limits.confpágina del manual explica que los límites se aplican a una sesión. Esto significa que todos los procesos en una sesión tendrán todos estos mismos límites (a menos que uno de estos procesos los cambie). No significa que se realice una suma sobre los procesos en una sesión (eso ni siquiera es algo que el sistema operativo rastrea; hay una noción de sesión, pero es más precisa que eso, por ejemplo, cada aplicación X11 tiende a finalizar en su propia sesión). La forma en que funciona es que el proceso de inicio de sesión establece algunos límites, y todos los procesos secundarios los heredan.

¹ Las excepciones son maxlogins, maxsysloginsy chroot, que se aplican como parte del proceso de inicio de sesión para denegar o influir en el inicio de sesión.

Gilles 'SO- deja de ser malvado'
fuente
Por el contrario, ¿eso significa que diferentes sesiones pueden tener diferentes conjuntos de límites?
CMCDragonkai
1
@CMCDragonkai Sí, por ejemplo, si se limit.confcambia entre los horarios en que se abrieron las sesiones, o si se establecen límites diferentes (tendrían que ser más pequeños, excepto la raíz) .profile.
Gilles 'SO- deja de ser malvado'
1
@laimison Si itera sobre todos los procesos en ejecución y se ejecuta prlimit --pid $piden cada uno, puede cambiar efectivamente el límite para una sesión activa. Tenga en cuenta que es posible que deba hacerlo varias veces en caso de que algunos procesos se bifurquen mientras está iterando.
Gilles 'SO- deja de ser malvado'
1
@laimison No. Suponga que un usuario tiene solo dos procesos A y B, con un RLIMIT_NPROCconjunto de 2 en A y 3 en B. Entonces B puede bifurcar un proceso más, pero A no puede.
Gilles 'SO- deja de ser malvado'
1
@laimison Si establece el límite en 2 en el padre de B y no lo cambia en B después de la bifurcación, entonces el límite de B será 2. Si establece el límite en 2 en el padre de B pero aumenta el límite en B, o si establece el límite en 3 en el padre de B antes de bifurcar B y lo establece en 2 después de bifurcar B, B tendrá el límite establecido en 3. El único límite que importa es el del proceso que llama fork (), no el límite en ese proceso padre o en cualquier otro proceso.
Gilles 'SO- deja de ser malvado'