Como aplicar limites de memória a todas as tarefas do cron?

4

Em um servidor compartilhado (Debian Jessie), existem alguns limites de memória (e outros limites, como número de processos) que se aplicam a um grupo de usuários, configurados em /etc/security/limits.conf .

Parece que esses limites não se aplicam a processos iniciados pelo cron, e às vezes o trabalho cron das pessoas acidentalmente estraga o desempenho de todos os outros.

Existe alguma maneira de aplicar os limites de limits.conf aos trabalhos agendados também? Ou, se isso não for possível, pelo menos imponha alguns limites aos trabalhos agendados de todos os usuários?

Cron parece rodar todos os trabalhos no cgroup cron, não no cgroup dos usuários, então essa não é uma abordagem fácil: (

    
por moritz 04.08.2015 / 20:23

1 resposta

2

Tenho certeza que você não pode definir limites em um serviço através do limits.conf, mas apenas em um espaço de usuário.

O Crontab executa scripts no espaço de usuário designado, definido a partir de / etc / crontab via nome de usuário ou do crontab pessoal do usuário. Portanto, os limites devem ser aplicados em um nível de espaço do usuário ou de dentro do próprio script. Mas é correto que você precise ativar os limites em pam.d / cron, pois isso permite que o cron aplique os limites do usuário ao executar o script.

Configurei um pequeno cenário de teste para podermos verificar como limitar os cronjobs de um usuário.

1) Feito um usuário chamado crontest

2) Adicionada uma linha ao limits.conf

crontest        hard    as              50000

3) Feito um script de teste rápido para alocar memória. Você pode encontrar um exemplo de fonte na Internet que seja melhor do que o meu, mas funciona.

#include <malloc.h>
#include <unistd.h>
#include <memory.h>
#define MB 1024 * 1024
int main() {
        int size;
        size = 0;
    while (1) {
        void *p = malloc( 10*MB );
        memset(p,0, 10*MB );
        size = 10+size;
        printf("Using %d MB\n",size);
        sleep(1);
    }
}

Salve o código-fonte acima no mem.c e digite o seguinte para compilá-lo.

gcc mem.c -o mem
cp mem /bin/mem

Agora para testar

Como root, executei o script de teste de mem e esta é a saída. Como você pode ver eu posso alocar mais de 50MB de RAM (AddressSpace)

# mem
Using 10 MB
Using 20 MB
Using 30 MB
Using 40 MB
Using 50 MB
Using 60 MB
^C

Eu mudei para o meu novo usuário de teste e tentei o mesmo.

$ mem
Using 10 MB
Using 20 MB
Using 30 MB
Using 40 MB
Segmentation fault

Como você pode ver, o sistema me interrompeu quando tentei alocar os próximos 10 MB que teriam atingido 50 MB (meu limite).

Em seguida, adicionei o seguinte ao / etc / crontab

* * * * * crontest /bin/mem

Salvei o crontab e esperei o cron gerar meu script de espaço do usuário sob o usuário crontest. Agora eu podia ver que as mesmas coisas se aplicavam ao script crontab dos meus usuários.

Saída do cron.log mostrando o script iniciado

Nov 22 16:52:01 server CRON[31460]: (crontest) CMD (/bin/mem)

Saída do syslog mostrando o script morrendo novamente.

Nov 22 16:52:05 server kernel: [624832.216083] mem[31464]: segfault at 8 ip 00007f87868f51b8 sp 00007ffce83fa058 error 6 in libc-2.24.so[7f8786871000+195000]

Então, como você pode ver, o limite se aplica tanto ao ambiente do usuário ao fazer o login quanto ao cronjobs. Então eu acho que você precisa dar uma olhada no seu arquivo limits.conf eu não acho que está correto.

    
por 22.11.2016 / 17:00