O Linux mata processos em segundo plano pesados e longos após atingir algum limite?

5

Se eu iniciar um processo muito demorado (memória / cpu intensiva) em execução realmente longa, o sistema operacional o terminará após um período de tempo arbitrariamente?
Ou seja existem limites além dos quais o sistema operacional impediria que um processo em segundo plano fosse executado?
Esses limites são configuráveis? Onde eles estão definidos?

    
por Jim 09.08.2013 / 21:33

2 respostas

4

Sim, existem esses limites. Eles são chamados de limites de recursos (rlimits). Existem mais de uma dúzia de limites diferentes. Por tempo de CPU, por memória, por número de arquivos abertos etc.

O kernel envia sinais diferentes para processar, quando o processo excede limites diferentes. Se o processo não reagir adequadamente, ele será morto.

Para cada rlimit existem dois valores. O primeiro é o limite atual. O segundo é o limite máximo (que é o limite máximo que você pode definir). Apenas root (mais precisamente usuário com CAP_SYS_RESOURCE de capacidade) permitiu aumentar o limite máximo ou definir um limite de corrente maior que o limite máximo.

Existem getrlimit() e setrlimit() chamadas do sistema para manipular limites.

Por padrão, a maioria dos limites de recursos contém um valor enorme, ou seja, sem limites. Obviamente, existem limites reais devido a restrições de design do kernel, RAM disponível, espaço disponível no disco, etc.

    
por 09.08.2013 / 22:22
4

Existem várias maneiras de implementar essa política, mas há um motivo bastante óbvio para que ela não exista por padrão: porque o sistema deve ser usado em seu potencial máximo. Por analogia: se você comprasse um carro que pudesse fazer 200 km / h e tivesse um tanque de 100 litros, provavelmente não o quereria controlado por um software que limitasse a velocidade a 100 km / h e parasse o carro quando o tanque estivesse 2/3 vazio mesmo se você estivesse dirigindo "por um longo tempo".

Note que não existe uma definição universal de "longa duração". Tem 40 minutos de duração? Como cerca de 8 horas? 24 horas? 3 dias? Uma semana, um mês ou um ano? Nenhum desses é tão incomum.

No que diz respeito aos limites de recursos mencionados por rasen, este é um meio principal pelo qual você pode "implementar tal política". Você realmente não perguntou como fazer isso, então eu não vou perder tempo indo em profundidade, no entanto, você perguntou sobre os limites. No que diz respeito à CPU e memória, não há nenhum. Isso é da página do manual de chamadas do sistema getrlimit / setrlimit :

The getrlimit() and setrlimit() system calls get and set resource limits respectively. Each resource has an associated soft and hard limit, as defined by the rlimit structure [...] The value RLIM_INFINITY denotes no limit on a resource (both in the structure returned by getrlimit() and in the structure passed to setrlimit()).

Por isso, é relativamente fácil verificar isso programaticamente:

#include <stdio.h>
#include <sys/resource.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>

int main (void) {
    struct rlimit rl;
    int resources[] = {
        RLIMIT_CPU,
        RLIMIT_DATA,
        RLIMIT_AS,
        RLIMIT_RSS
    };
    char labels[][16] = { "CPU", "Data", "Virtual", "Resident" };
    int rlen = sizeof(resources) / sizeof(int);
    printf("RLIM_INFINITY is %lu\n", (uint64_t)RLIM_INFINITY);
    for (int i = 0; i < rlen; i++) {
        if (getrlimit(resources[i], &rl) != 0) {
            fprintf(stderr,"!!%s\n", strerror(errno));
            return -1;
        }
        printf("%8s soft: %lu hard: %lu\n",
            labels[i],
            (uint64_t)rl.rlim_cur,
            (uint64_t)rl.rlim_max
        );
    }
    return 0;
}                            

Você pode compilar esse gcc -std=gnu99 e tentar você mesmo. Esta é a fonte mais definitiva de informações, pois consulta o kernel diretamente. A menos que alguém tenha configurado intencionalmente limites em seu sistema, você terá algo como:

RLIM_INFINITY is 18446744073709551615
     CPU soft: 18446744073709551615 hard: 18446744073709551615
    Data soft: 18446744073709551615 hard: 18446744073709551615
 Virtual soft: 18446744073709551615 hard: 18446744073709551615
Resident soft: 18446744073709551615 hard: 18446744073709551615

Para esclarecer para não-programadores: o valor "RLIM_INFINITY" é um valor destinado a indicar "infinito" ou nenhum limite (pois os computadores não podem representar o infinito como um número). Os campos RLIMIT são explicados na página man, para resumir:

RLIMIT_CPU: CPU time limit in seconds.

RLIMIT_DATA: The maximum size of the process's data segment (initialized data, uninitialized data, and heap).

RLIMIT_AS: The maximum size of the process's virtual memory (address space) in bytes.

RLIMIT_RSS: Specifies the limit (in pages) of the process's resident set (the number of virtual pages resident in RAM).

Eles correspondem aos valores reais de uso que você pode ver em top (CPU, DATA, VIRT e RSS).

Novamente: em um sistema linux normal, não há limite por processo na cpu ou na memória , mas você pode definir isso.

    
por 09.08.2013 / 22:20