Como configuro o registro para ulimits?

4

Eu queria saber se alguma coisa é registrada quando qualquer ulimits é atingido (arquivos abertos, etc ). Se sim, onde isso é registrado e o que eu deveria estar procurando? Estou usando o CentOS 6.

    
por cat pants 24.06.2014 / 22:06

2 respostas

3

Você pode usar auditoria para registrar as falhas das chamadas de sistema correspondentes (syscalls ), embora nem todo excesso se manifeste dessa maneira. Por exemplo, como Henk Langeveld apontou, exceder RLIMIT_RTTIME faz com que o kernel envie um sinal.

Tomemos por exemplo o RLIMIT_NOFILE limite:

Specifies a value one greater than the maximum file descriptor number that can be opened by this process. Attempts (open(2), pipe(2), dup(2), etc.) to exceed this limit yield the error EMFILE. (Historically, this limit was named RLIMIT_OFILE on BSD.)

Portanto, você terá que monitorar, por exemplo, o open syscall. Sua página de manual diz:

RETURN VALUE

open(), openat(), and creat() return the new file descriptor, or -1 if an error occurred (in which case, errno is set appropriately).

ERRORS

open(), openat(), and creat() can fail with the following errors:

EMFILE - The process already has the maximum number of files open.

Isso significa que você precisa auditar as open syscalls que falham com EMFILE . A página man sugere que open retorna -1 e define errno a EMFILE , mas o que acontece é que o open syscall retorna -EMFILE e glibc converte para -1 e define errno para EMFILE * .

Agora que corrigimos isso, vamos adicionar uma regra de auditoria:

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

Vamos testar os limites:

[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'

E verifique os 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"
...

O "Guia de Segurança" para o Red Hat Enterprise Linux 6 tem um " Auditoria do sistema " capítulo onde você pode ler mais sobre o assunto.

* Obrigado a fche por apontar isso.

    
por 25.06.2014 / 20:28
1

Você precisa inspecionar a fonte do kernel para isso.

Exemplo:

Os temporizadores da CPU no kernel do Linux ( posix-cpu-timers.c ) enviará um SIGKILL para o processo ofensivo quando o limite rígido é atingido. O limite suave aciona um SIGXCPU uma vez por segundo e uma mensagem de Watchdog.

Você pode procurar os outros limites e / ou sinais para mais detalhes.

    
por 25.06.2014 / 00:39