Alguém pode explicar (ou conhecer uma fonte) que fornece detalhes sobre os itens no limits.conf? A página do manual não fornece muitos detalhes.
Por exemplo, diz:
rtprio
maximum realtime priority allowed for non-privileged processes (Linux 2.6.12 and higher)
priority
the priority to run user process with (negative values boost process priority)
Como isso é diferente? Que valores eles podem assumir? O que eles padrão?
Alguns dos itens são óbvios, mas onde posso encontrar melhores explicações (valores padrão, intervalos, o que eles realmente significam etc.) sobre:
data
maximum data size (KB)
fsize
maximum filesize (KB)
memlock
maximum locked-in-memory address space (KB)
cpu
maximum CPU time (minutes)
nice
maximum nice priority allowed to raise to (Linux 2.6.12 and higher) values: [-20,19]
O que acontece quando a CPU é excedida? Os processos estão mortos? Apenas um processo ou o usuário inteiro está proibido de usar a CPU? Isso é para uma sessão ou para um tempo máximo em cada minuto?
Tentei encontrar respostas, mas tudo o que consigo encontrar é a única página de manual que quase não fornece detalhes.
Respostas:
Por que isso é diferente?
Existem diferentes classes de agendadores de processos no linux. O padrão (CFQ) basicamente fornece uma quantidade igual de intervalos de tempo para cada processo que deseja executar e enfileira tarefas executáveis de maneira que todos esperem, em média, uma quantidade igual de tempo pela sua vez. Existem algumas exceções a essa regra, mas essa é a ideia básica.
Outra classe de agendador é o agendador em tempo real. Em tempo real é um pouco diferente, tarefas executáveis na fila em um esquema de enfileiramento justo, o processo em tempo real obterá o tempo da CPU assim que necessário pelo processo, isso despeja um processo em execução da CPU para liberar espaço para o 'tempo real ' processo.
Que valores eles podem assumir?
O que a “prioridade” faz é alterar a gentileza do processo para que, no login, seu processo principal inicie com uma certa gentileza, todos os processos filhos que você gera também com a mesma gentileza.
Isso tem o efeito de aumentar a probabilidade de ser programado em favor de outros processos concorrentes e a experiência do usuário pode ser mais responsiva / interativa para os valores mais baixos de gentileza e menos responsiva / interativa se a gentileza for aumentada.
Pode ser importante que os usuários de logon normais tenham uma prioridade mais baixa que os daemons que podem ser reparados, por exemplo, ou o root tenha uma prioridade mais alta no logon do que tudo o resto.
Quanto ao tempo real, a disputa é tratada com o campo 'rtprio'. Se você tiver duas tarefas em tempo real, ambas querendo executar, o valor 'rtprio' será usado para determinar qual dos processos escolher primeiro como prioridade. Um rtprio mais alto produz tarefas de prioridade mais alta.
Definir isso no limits.conf permite que as tarefas em tempo real sejam definidas em uma faixa de prioridade específica, sem a necessidade de o root definir o valor. Isso não afeta as tarefas não definidas para serem executadas usando um planejador em tempo real.
O valor 'nice' deve fazer o mesmo que 'rtprio', mas para o agendamento padrão do CFQ. Eu nunca tentei isso embora. Ele define o processo inicial gerado quando o PAM está definindo esses limites para aquele bom vaule; um usuário normal pode então atingir esse nível agradável ou superior sem precisar de raiz para defini-los. Se você não renovar explicitamente, significa que todos os processos gerados a partir de um shell desse logon (por exemplo) herdarão o bom valor definido no limits.conf do processo pai que foi criado inicialmente.
Quais são os padrões?
Os limites 'padrão' - tecnicamente, todos estão sendo definidos como o pid 1, a menos que seja explicitamente definido, os limites de recursos são herdados do processo pai, se nenhum limite tiver sido definido ou substituído em nenhum lugar, a herança
init
é o padrão.Outros valores
Quando um processo é inicializado, ele aloca alguma memória conhecida como 'segmento de dados' quando o processo é copiado na memória; é aqui que fica o espaço para os globais, talvez alguns outros dados e memória inicializados alocados da pilha. O limite controla a quantidade máxima alocada que um processo pode receber.
É improvável que você atinja esse limite porque malloc () raramente usa demais o segmento de dados para armazenar dados.
Isso literalmente define apenas o tamanho máximo em que um arquivo pode ser gravado, assim como com esse usuário.
Quase toda a memória que um aplicativo adquiriu é 'evitável'. Ou seja, pode ser trocado. Memória bloqueada A memória nunca é trocável e permanece residente. Esse valor é estritamente controlado porque pode ser abusado por pessoas que passam fome em um sistema de memória e causa trocas. Geralmente é útil com aplicativos de segurança (que nunca desejam que suas páginas sejam trocadas - e se tornem legíveis na partição de troca).
Isso representa a quantidade total de tempo que um processo pode consumir em uma CPU. Um processo que excede esse valor é eliminado. Observe que NÃO é o mesmo que a quantidade de tempo decorrida desde que o processo foi iniciado. Ou seja, um limite de tempo de processamento de 1 minuto levaria 1 minuto para ser consumido se o processo tivesse 100% de utilização da CPU, mas 2 minutos para consumir se o processo usasse 50% de utilização.
O que acontece quando a CPU é excedida?
O processo recebe um sinal de
SIGXCPU
interrupção que finaliza o processo. Isso pode ser capturado pelo processo pai e tratado lá.Apenas um processo ou o usuário inteiro é impedido de usar a CPU?
Quase todos os limites mencionados são tratados por processo. Tempo de CPU incluído. Acredito que os únicos que não são o número total de logins e o número total de processos por esse usuário.
Alguns outros truques com limites são:
fonte
Isto é para o
pam_limits
módulo ... ésetrlimit(2)
esysctl(8)
valores. Minha pesquisa não revelou limites rígidos, mas as páginas de manual citadas fornecem algumas explicações.fonte
Respostas rápidas são boas, então aqui vai.
schedtool -r
; eulimit -a
.Não se esqueça de definir os limites flexível e flexível, mesmo que tenham o mesmo valor. Nos meus testes, essa era a única coisa que mostraria uma diferença no comando ulimit.
Espero que isso ajude você.
fonte