Incrementar el límite de archivos abiertos en OpenBSD

Escrito por Adrian Ali el 25 de agosto de 2023, usando OpenBSD Release 7.3 contacto: adrianali arroba fortix.com.ar

Índice

1. Introducción
2. Límite a nivel kernel
3. Límita a nivel usuario
4. Referencias

1. Introducción

No todos los usuarios le dan el mismo uso a un sistema operativo y OpenBSD no es la excepción. Si bien dos usuarios podrían usar la misma versión de OpenBSD y hasta el mismo Windows Manager y coincidir en el uso de algunas aplicaciones, seguramente habrá diferencias también. Particularmente mi caso de uso era que abro muchísimas sesiones ssh en muchas terminales, todas ellas dentro del programa de terminal "Konsole", si bien no uso el entorno KDE (hoy en día uso el WM i3) si uso esta aplicación de KDE para la terminal por gusto. Resulta que era muy normal que me encontrara con limites cuando abría muchas pestañas de Konsole y/o tenia muchas sesiones ssh, por ejemplo obtenía este error al tratar de abrir mas sesiones ssh:

ssh texto-plano.xyz
/bin/ksh: cannot fork - try again

en estos casos tenia que cerrar una sesión para poder abrir una nueva. Termine relacionando la imposibilidad de no generar mas "fork" con la limitación en la cantidad de archivos que podía abrir, entre otras por supuesto. Sea por la razón que fuera que necesite abrir mas de 1024 archivos por usuario, que es el valor por defecto en la instalación, en este documento se explicara como configurar para extender ese valor, esta receta por supuesto es aplicable también a otros límites del kernel que queramos extender.

2. Límite a nivel kernel

En cuanto a la cantidad de archivos abiertos que se puede tener en el sistema tenemos un limite global a nivel kernel:

puffy ~ # sysctl kern.maxfiles
kern.maxfiles=7030
puffy ~ #

modificable con sysctl:

puffy ~ #
puffy ~ # sysctl kern.maxfiles
kern.maxfiles=7030
puffy ~ # 
puffy ~ # sysctl kern.maxfiles=15000
kern.maxfiles: 7030 -> 15000
puffy ~ # 
puffy ~ # sysctl kern.maxfiles      
kern.maxfiles=15000
puffy ~ #

para dejar este valor persistente por mas que reiniciemos la computadora procedemos así:

puffy ~ # 
puffy ~ # echo "sysctl kern.maxfiles=15000" >> /etc/sysctl.conf
puffy ~ #
puffy ~ # grep kern.maxfiles /etc/sysctl.conf
sysctl kern.maxfiles=15000
puffy ~ #

3. Límite a nivel usuario

También tenemos un límite por usuario, modificable en el archivo:

/etc/login.conf

copio de página de man una parte importante que hace unas aclaraciones:

Las entradas de límite de recursos (cputime, filesize, datasize, stacksize, coredumpsize, memoryuse, memorylocked, maxproc, and openfiles) en realidad especifican los límites máximo y actual. El límite actual es el que se utiliza normalmente, aunque se permite al usuario aumentar el límite actual hasta el límite máximo. Los límites máximo y actual se pueden especificar individualmente agregando -max o -cur al nombre de la capacidad (por ejemplo, openfiles-max y openfiles-cur).

por ejemplo para consultar el límite de archivos que podemos abrir para nuestro usuario ejecutar:

puffy ~ aali $ 
puffy ~ aali $ ulimit -n
512
puffy ~ aali $ 

o sino:

puffy ~ aali $ 
puffy ~ aali $ ulimit -a
time(cpu-seconds)    unlimited
file(blocks)         unlimited
coredump(blocks)     unlimited
data(kbytes)         1572864
stack(kbytes)        4096
lockedmem(kbytes)    87381
memory(kbytes)       15831968
nofiles(descriptors) 512
processes            256
puffy ~ aali $ 
puffy ~ aali $

como podemos ver tenemos un límite para abrir 512 archivos. Que coincide con el valor de la clase "default":

default:\    
        :path=/usr/bin /bin /usr/sbin /sbin /usr/X11R6/bin /usr/local/bin /usr/local/sbin:\    
        :umask=022:\    
        :datasize-max=1024M:\    
        :datasize-cur=1024M:\    
        :maxproc-max=256:\    
        :maxproc-cur=128:\    
        :openfiles-max=1024:\    
        :openfiles-cur=512:\    
        :stacksize-cur=4M:\    
        :localcipher=blowfish,a:\    
        :tc=auth-defaults:\    
        :tc=auth-ftp-defaults:

aunque el valor máximo si se puede extender a 1024 archivos como vemos en la linea:

:openfiles-max=1024:\

Bien, puesto que la clase "staff" a la que pertenece nuestro usuario no tiene definición alguna sobre "openfiles", vamos a proceder a agregar en la misma una nueva definición para "openfiles", no vamos a usar ni "max" ni "cur", usaremos un solo valor, la linea quedaría así:

:openfiles=8192:\

NOTA: Esta definición de openfiles a un valor de 8192 la use en mi computadora con 16GB de RAM, para computadores con menos RAM tener cuidado y definir valores menores o dejar por la configuración por default.

Entonces una ves cambiado ese valor, cerramos sesión y nos volvemos a logear y comprobamos que el valor cambió:

puffy ~ aali $ ulimit -n
8192
puffy ~ aali $

Aparte de este cambio en la cantidad de archivos abiertos que se puede tener en el sistema, también cambie otros valores, aquí esta el diff:

puffy /etc # diff -u login.conf.ori login.conf
--- login.conf.ori      Fri Sep 22 22:27:48 2023
+++ login.conf  Fri Sep 22 22:20:01 2023
@@ -72,8 +72,9 @@
 staff:\
        :datasize-cur=1536M:\
        :datasize-max=infinity:\
-       :maxproc-max=512:\
-       :maxproc-cur=256:\
+       :maxproc=1024:\
+       :openfiles=8192:\
+       :stacksize-cur=8M:\
        :ignorenologin:\
        :requirehome@:\
        :tc=default:
puffy /etc #

4. Referencias

sysctl.conf

login.conf

sysctl

ksh-ulimit