Establecer el límite máximo de archivos en un proceso en ejecución

27

Tengo un proceso de larga ejecución que finalmente alcanzará el límite máximo de archivos abiertos. Sé cómo cambiar eso después de que falla, pero ¿hay alguna manera de cambiar eso para el proceso en ejecución, desde la línea de comandos?

kāgii
fuente

Respuestas:

28

En los núcleos más nuevos (2.6.32+) en CentOS / RHEL puede cambiar esto en tiempo de ejecución con / proc / <pid> / limits:

cd /proc/7671/
[root@host 7671]# cat limits  | grep nice
Max nice priority         0                    0                    
[root@host 7671]# echo -n "Max nice priority=5:6" > limits
[root@host 7671]# cat limits  | grep nice
Max nice priority         5                    6                    
Sig-IO
fuente
Que las reglas! No tenía idea de que podría escribir en el archivo de límites.
clee
44
no funciona para mí en ubuntu 12.04
Poma
55
Esto no funciona en mi kernel 3.2 . Supongo que su distribución tiene un parche no oficial específico para esto porque no veo ningún rastro de este parche en el fs / proc / base.c del núcleo .
Totor
Podría ser ... Sé que está presente en los núcleos RHEL / CentOS. No parece estar presente en los núcleos de Debian.
Sig-IO
2
'setprlimit' es la forma recomendada y a prueba de futuro, vea la siguiente respuesta
Sig-IO
26

Como se documenta aquí , el prlimitcomando, introducido con util-linux 2.21 le permite leer y cambiar los límites de los procesos en ejecución.

Este es un seguimiento de la escritura /proc/<pid>/limits, que no se integró en el núcleo de la línea principal. Esta solución debería funcionar.

Si aún no lo prlimit(1)ha hecho, puede encontrar el código para una versión minimalista en la página de prlimit(2)manual .

Sig-IO
fuente
2
¡+1 para la versión minimalista en la página de manual!
Totor
Advertencia: "memcached" se segfault si cambia "nolimit" en su proceso después de encontrar un límite. No siempre es una buena idea usar los límites de escritura
Juan
2

Puede probar ulimit man ulimitcon la opción -n, sin embargo, la página mag no admite la mayoría de los sistemas operativos y no permite que esto se configure.

Puede establecer un límite de descripciones de archivo de todo el sistema utilizando sysctl -w fs.file-max=Ny hacer que los cambios persistan después del arranque en/etc/sysctl.conf

Sin embargo, también sugeriría mirar el proceso para ver si realmente necesita tener tantos archivos abiertos en un momento dado, y si de hecho puede cerrar algunos archivos y ser más eficiente en el proceso.

Oneiroi
fuente
El archivo abierto es un error, pero no he podido resolverlo. Si bien me encantaría hacerlo, la producción se bloquea periódicamente a medio día.
kāgii
ulimitno aplica la configuración a los procesos en ejecución .
try-catch-finally
0

El proceso podría cambiar sus propios límites flexibles si está programado para hacerlo (o si logra piratearlo), pero no puede aumentar sus límites estrictos a menos que tenga la capacidad CAP_SYS_RESOURCE. Puede inspeccionar los límites en tiempo de ejecución en /proc/$pid/limits.

Tobu
fuente