Diferencia entre ulimit -n y / proc / $ PID / limits

9

En Linux, hay un límite de archivo abierto. Puedo usar ulimit -npara ver el límite de archivo abierto, que es 1024 por defecto. Entonces también puedo ver el límite suave / duro del archivo abierto por proceso mirando / proc / $ PID / limits. Veo soft = 1024 y hard = 4096.

Me pregunto cuál es la diferencia entre estos dos resultados.

Además, ¿se aplica setRlimit()y se getRlimit()aplica a todo el sistema o por proceso?

sdeLevelNegativeTwo
fuente

Respuestas:

11

ulimit -nestablece el límite flexible por defecto; puede agregar la -Hopción para ver / establecer el límite duro.

En su mayor parte, los límites suaves y duros se comportan así:

  1. Los procesos de root (en realidad, cualquier proceso con CAP_SYS_RESOURCE) pueden aumentar o disminuir cualquier límite en cualquier proceso.
  2. los procesos de cualquier usuario pueden reducir cualquier límite en otros procesos propiedad de ese usuario.
  3. los procesos de cualquier usuario pueden elevar el límite flexible hasta el límite estricto de los procesos que posee ese usuario.
  4. Si un proceso intenta exceder su límite flexible, el intento fallará.

Entonces, los límites duros funcionan como un límite en los límites blandos (a excepción de la raíz, que normalmente puede hacer cualquier cosa).

Hay una excepción: un límite de CPU suave envía un SIGXCPU señal. Un proceso puede optar por ignorar eso, o pasar tiempo haciendo la limpieza, etc. Una vez que se cruza el límite duro de la CPU, el núcleo envía, lo SIGKILLque no es detectable, manejable o ignorable. Por lo tanto, en este caso, el límite flexible funciona como una advertencia: "se le acabó el tiempo de CPU: termine y salga rápidamente, o de lo contrario". y el límite duro es el "o si no".

La mayoría son por proceso, pero algunos (como RLIMIT_NPROC) son por usuario. La página del manual de getrlimit (2) especifica para cada límite.

derobert
fuente
Otra pregunta relacionada, ¿por qué a veces mi shell tiene ulimit -n = 1024 y otro proceso disparado desde este shell tiene límite suave = 4096 (lectura de / proc / PID / limits)
sdeLevelNegativeTwo
@sdeLevelNegativeTwo ¿Lanzaste el proceso antes o después del ulimit -n? No afecta los procesos ya activados, solo el shell y los futuros. Aparte de eso, el proceso puede estar aumentando su límite suave al límite duro. Entonces podrías usar ulimit -H -npara detenerlo.
derobert