¿Es posible cambiar el límite blando y duro de un proceso específico ?
En mi caso, mi proceso es mongod
y 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?
Respuestas:
Un proceso puede cambiar sus límites a través de la
setrlimit(2)
llamada al sistema. Cuando corrasulimit -n
deberí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. Elulimit
comando ejecutó lagetrlimit(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 llamesetrlimit()
adecuadamente.Para cambiar
mongodb's
el límite del descriptor de archivo abierto, debe ejecutarulimit -n 2048
(o cualquier número grande que permita su núcleo) en un shell. Luego usarías ese caparazón para comenzarmongodb
. Como proceso secundario,mongodb
heredarí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.conf
y ejecutarsysctl -p
. Mira el valor delfs.file-max
parámetro en/etc/sysctl.conf
.fuente
Para cambiar los límites de un proceso en ejecución, puede usar el comando de utilidad
prlimit
.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/
fuente
too many files open
errores. Su respuesta resolvió mi problema sin detener el proceso.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:
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.
fuente
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.
fuente