¿Cómo configuro el registro para ulimits?

¿Cómo configuro el registro para ulimits?

Me preguntaba si se registra algo cuando hay alguno.límitesson afectados (archivos abiertos, etc.). Si es así, ¿dónde se registra y qué debo buscar? Estoy usando CentOS 6.

Respuesta1

Puedes usarauditoríapara registrar los fallos de las llamadas al sistema correspondientes (syscalls), aunque no todos los excesos se manifiestan de esta manera. Por ejemplo como Henk LangeveldComo se señaló, excederlo RLIMIT_RTTIMEhace que el núcleo envíe una señal.

Tomemos por ejemplo elRLIMIT_NOFILElímite:

Especifica un valor uno mayor que el número máximo de descriptores de archivo que puede abrir este proceso. Intentos (open(2), pipe(2), dup(2), etc.) para exceder este límite produce el error EMFILE. (Históricamente, este límite se nombraba RLIMIT_OFILEen BSD).

Entonces tendrás que monitorear, por ejemplo, la openllamada al sistema. Espágina de manualdice:

VALOR DEVUELTO

open(), openat()y creat()devolver el nuevo descriptor de archivo, o -1 si ocurrió un error (en cuyo caso,errnoestá configurado apropiadamente).

ERRORES

open(), openat()y creat()puede fallar con los siguientes errores:

EMFILE- El proceso ya tiene el número máximo de archivos abiertos.

Esto significa que debe auditar las openllamadas al sistema que fallan EMFILE. La página de manual sugiere que opendevuelve -1 y se establece errnoen EMFILE, pero lo que sucede en realidad es que elopen llamada al sistemadevoluciones -EMFILEyglibc conviertelo convierte en -1 y lo establece errnoen EMFILE * .

Ahora que hemos aclarado eso, agreguemos una regla de auditoría:

[root@h ~]# auditctl -a always,exit -F arch=`uname -m` -S open \
                                    -F uid=ciupicri -F exit=-EMFILE -k "UL-SE"

Probemos los límites:

[ciupicri@h ~]$ ulimit -n 10
[ciupicri@h ~]$ python -c 'from __future__ import print_function; f = [(print(i), open("/etc/passwd")) for i in range(10)]'
0
1
2
3
4
5
6
7
Traceback (most recent call last):
  File "<string>", line 1, in <module>
IOError: [Errno 24] Too many open files: '/etc/passwd'

Y revisa los registros:

[root@h ~]# ausearch --start recent -k UL-SE
...
time->Wed Jun 25 21:27:37 2014
type=PATH msg=audit(1403720857.418:63): item=0 name="/etc/passwd" nametype=UNK
NOWN
type=CWD msg=audit(1403720857.418:63):  cwd="/home/ciupicri"
type=SYSCALL msg=audit(1403720857.418:63): arch=40000003 syscall=5 success=no 
exit=-24 a0=8ed72e0 a1=8000 a2=1b6 a3=8f24d11 items=1 ppid=1110 pid=1139 auid=
5000 uid=5000 gid=5000 euid=5000 suid=5000 fsuid=5000 egid=5000 sgid=5000 fsgi
d=5000 tty=pts3 ses=2 comm="python" exe="/usr/bin/python" subj=unconfined_u:un
confined_r:unconfined_t:s0-s0:c0.c1023 key="UL-SE"
...

La "Guía de seguridad" para Red Hat Enterprise Linux 6 tiene una"Auditoría del sistema"Capítulo donde podrás leer más sobre el tema.

* Gracias ir afchepor señalar esto.

Respuesta2

Necesita inspeccionar la fuente del kernel para esto.

Ejemplo:

Los temporizadores de CPU en el kernel de Linux (posix-cpu-timers.c) simplemente enviará un SIGKILL al proceso infractor cuando se alcance el límite estricto. El límite suave activa una SIGXCPU una vez por segundo y un mensaje de vigilancia.

Puede buscar otros límites y/o señales para obtener más detalles.

información relacionada