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.