Modificar ulimit (archivos abiertos) de un proceso específico

27

¿Es posible cambiar el límite blando y duro de un proceso específico ?

En mi caso, mi proceso es mongody muchos recursos web me dicen que simplemente ejecute:

ulimit -n <my new value>

Mis pensamientos actuales:

  • ¿Cómo sabrá el comando el límite del proceso que voy a modificar? ¿Esto no modificará el límite de archivos abiertos de todo el sistema?
  • Supongo que este comando solo cambia el límite flexible. Entonces, ¿hay alguna manera de aumentar el límite duro también?
prueba
fuente
¿Has leído esta valiosa información? docs.mongodb.org/manual/reference/ulimit
tink
Sí, lo aprendí todo de memoria ... No estoy seguro de si me falta algo, pero esa página solo te dice cómo VER los detalles. Solo le dice que escriba ulimit -n <valor> ...
pruebe

Respuestas:

29

Un proceso puede cambiar sus límites a través de la setrlimit(2)llamada al sistema. Cuando corras ulimit -ndeberías ver un número. Ese es el límite actual en la cantidad de descriptores de archivos abiertos (que incluye archivos, enchufes, tuberías, etc.) para el proceso. El ulimitcomando ejecutó la getrlimit(2)llamada al sistema para averiguar cuál es el valor actual.

Aquí está el punto clave: un proceso hereda su límite actual de su proceso padre. Entonces, si ejecutó ulimit -n 64, establecería el límite de los descriptores de archivos abiertos de ese shell en 64. Cualquier proceso que inicie el shell tendría el mismo límite, a menos que ese nuevo proceso llame setrlimit()adecuadamente.

Para cambiar mongodb'sel límite del descriptor de archivo abierto, debe ejecutar ulimit -n 2048(o cualquier número grande que permita su núcleo) en un shell. Luego usarías ese caparazón para comenzar mongodb. Como proceso secundario, mongodbheredaría el límite (grande) en los descriptores de archivos abiertos.

Para modificar el límite de archivo abierto del sistema, que se parece más a la suma de todos los procesos de límite de descriptor de archivo abierto, debe hacer algo como modificar /etc/sysctl.confy ejecutar sysctl -p. Mira el valor del fs.file-maxparámetro en /etc/sysctl.conf.

Bruce Ediger
fuente
¡Qué gran explicación! Muchas gracias. ¡Intentaré esto de inmediato!
prueba
Esta respuesta me ayudó mucho, pero el problema ahora es que el límite duro es 2048, y esto no es suficiente en mi caso. 1) ¿cómo puedo encontrar el límite que permite mi núcleo? 2) ¿Es posible cambiar el LÍMITE DURO ahora? ¡Gracias de nuevo!
prueba
@test: nunca he elevado el límite duro. Encontré esto: blog.samat.org/2011/04/05/… y este wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux Dicen lo mismo.
Bruce Ediger
18

Para cambiar los límites de un proceso en ejecución, puede usar el comando de utilidad prlimit.

prlimit --pid 12345 --nofile=1024:1024

Lo que hace internamente es llamar setrlimit(2). La página de manual de prlimit debe contener algunos ejemplos útiles de invocación.

Fuente: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/

user7610
fuente
Esto me salvó el día, gracias. Tuve un proceso de Python de larga ejecución que estaba produciendo too many files openerrores. Su respuesta resolvió mi problema sin detener el proceso.
Visionscaper
1

Al menos en Linux, la mayoría de las distribuciones parecen usar pam para la autenticación. Un módulo que viene con pam es el módulo de límites . Citando el archivo README para pam_limits:

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

Como resultado, puede establecer límites por usuario, por grupo y predeterminados, en ambas categorías (la raíz establece esto y el proceso no puede solicitar mayores) y límites suaves. Los límites suaves generalmente se establecen más bajos que los límites estrictos, y la aplicación puede aumentarlo hasta alcanzar el límite rígido.

En su caso, si el proceso que desea aumentar los límites de las ejecuciones como usuario normal, puede aumentar los límites para ese usuario o grupo. Como ejemplo, tengo algunos trabajos cron de mysql en algunos servidores que requieren la apertura de identificadores de archivos adicionales, así que configuré esto:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

No hay nada que deba reiniciarse; cuando le solicitas a ese usuario, puedes ver de inmediato que los nuevos límites entran en vigencia.

Otra cosa que puede hacer si está en un sistema derivado de RedHat típico es colocar la llamada ulimit que desea en el script / etc / sysconfig / $ SERVICE. Como ejemplo, el script de inicio de apache se llama /etc/init.d/httpd y, si se encuentra, obtiene el archivo de configuración / etc / sysconfig / httpd. He encontrado que es más fácil de administrar haciendo esto en lugar de editar el script de inicio en sí porque los scripts de inicio se actualizan cuando se actualizan las rpm, pero los archivos sysconfig solo se actualizan si no se cambian de manera predeterminada.

Todd Lyons
fuente
La mejor y más práctica solución.
nelaaro
0

¿Cómo sabrá el comando el límite del proceso que voy a modificar? ¿Esto no modificará el límite de archivos abiertos de todo el sistema?

El comando cambiará el límite para el proceso actual (su shell) y cualquier proceso secundario (cualquier cosa que ejecute desde el shell posteriormente).

Los procesos se organizan en un árbol. Cada proceso tiene un padre (que lo invocó). El proceso número 1, init, es un proceso especial en el sentido de que es su propio padre. Herramientas como htop o top pueden mostrarle procesos que se muestran como un árbol de padres e hijos.

user7610
fuente