13.13. Limites de Recursos

Contribuído por Tom Rhodes.

O FreeBSD fornece vários métodos para um administrador limitar a quantidade de recursos do sistema que um indivíduo pode usar. As cotas de disco limitam a quantidade de espaço em disco disponível para os usuários. As cotas são discutidas em Seção 17.11, “Cotas de Disco”.

Limites para outros recursos, como CPU e memória, podem ser definidos usando um arquivo simples ou um comando para configurar um banco de dados de limites de recursos. O método tradicional define classes de login editando o arquivo /etc/login.conf. Embora esse método ainda seja suportado, qualquer alteração requer um processo de várias etapas para editar esse arquivo, reconstruir o banco de dados de recursos, fazer as alterações necessárias no arquivo /etc/master.passwd e reconstruir o banco de dados de senhas. Isso pode se tornar demorado, dependendo do número de usuários a serem configurados.

O comando rctl pode ser usado para fornecer um método mais refinado para controlar limites de recursos. Esse comando suporta mais que limites de usuário, já que também pode ser usado para definir restrições de recursos em processos e jails.

Esta seção demonstra os dois métodos para controlar recursos, começando com o método tradicional.

13.13.1. Configurando Classes de Login

No método tradicional, as classes de login e os limites de recursos a serem aplicados a uma classe de login são definidos no arquivo /etc/login.conf. Cada conta de usuário pode ser atribuída a uma classe de login, onde default é a classe de login padrão. Cada classe de login possui um conjunto de recursos de login associados a ele. Um recurso de login é um par name=value, em que name é um identificador conhecido e value é uma string arbitrária que é processada de acordo, dependendo do name.

Nota:

Sempre que o arquivo /etc/login.conf for editado, o /etc/login.conf.db deve ser atualizado executando o seguinte comando:

# cap_mkdb /etc/login.conf

Os limites de recursos diferem dos recursos de login padrão de duas maneiras. Primeiro, para cada limite, existe um limite soft e um hard. Um limite soft pode ser ajustado pelo usuário ou aplicativo, mas não pode ser definido como superior ao limite hard. O limite hard pode ser baixado pelo usuário, mas só pode ser aumentado pelo root. Segundo, a maioria dos limites de recursos se aplica por processo a um usuário específico.

Tabela 13.1, “Limites de Recursos de Classe de Login” lista os limites de recursos mais usados. Todos os limites de recursos disponíveis e capabilities são descritos em detalhes em login.conf(5).

Tabela 13.1. Limites de Recursos de Classe de Login
Limite de RecursoDescrição
coredumpsizeO limite do tamanho de um arquivo core gerado por um programa é subordinado a outros limites de uso do disco, como filesize ou cotas de disco. Esse limite é frequentemente usado como um método menos severo de controle do consumo de espaço em disco. Como os usuários não geram arquivos core e geralmente não os excluem, essa configuração pode evitar que eles fiquem sem espaço em disco caso ocorra um grande travamento de programa.
cputimeA quantidade máxima de tempo de CPU que o processo de um usuário pode consumir. Os processos ofensivos serão eliminados pelo kernel. Este é um limite no tempo de CPU consumido, não a porcentagem do CPU como exibido em alguns dos campos gerados pelo top e ps.
filesizeO tamanho máximo de um arquivo que o usuário pode possuir. Ao contrário das cotas de disco (Seção 17.11, “Cotas de Disco”), esse limite é imposto em arquivos individuais, não no conjunto de todos os arquivos que um usuário possui.
maxprocO número máximo de processos de primeiro plano e de plano de fundo que um usuário pode executar. Esse limite pode não ser maior que o limite do sistema especificado pela variável kern.maxproc. Definir um limite muito pequeno pode prejudicar a produtividade de um usuário, pois algumas tarefas, como compilar um programa grande, iniciam muitos processos.
memorylockedA quantidade máxima de memória que um processo pode solicitar para ser bloqueado na memória principal usando o mlock(2). Alguns programas críticos do sistema, como amd(8), se bloqueiam na memória principal para que, se o sistema começar a fazer swap, eles não contribuam para surrar o disco.
memoryuseA quantidade máxima de memória que um processo pode consumir a qualquer momento. Inclui tanto a memória principal quanto o uso de swap. Este não é um limite geral para restringir o consumo de memória, mas é um bom começo.
openfilesO número máximo de arquivos que um processo pode ter aberto. No FreeBSD, os arquivos são usados ​​para representar sockets e canais IPC, então tome cuidado para não definir isso muito baixo. O limite de todo o sistema para isso é definido por pela variável kern.maxfiles.
sbsizeO limite na quantidade de memória de rede que um usuário pode consumir. Isso geralmente pode ser usado para limitar as comunicações da rede.
stacksizeO tamanho máximo de uma pilha de processos. Isso por si só não é suficiente para limitar a quantidade de memória que um programa pode usar, por isso deve ser usado em conjunto com outros limites.

Existem algumas outras coisas para se lembrar ao definir limites de recursos:

  • Os processos iniciados na inicialização do sistema pelo /etc/rc são atribuídos à classe daemon de login.

  • Embora o arquivo /etc/login.conf padrão seja uma boa fonte de valores razoáveis ​​para a maioria dos limites, eles podem não ser apropriados para todos os sistemas. Definir um limite muito alto pode abrir o sistema para uso abusivo, enquanto que defini-lo como muito baixo pode prejudicar a produtividade.

  • O Xorg utiliza muitos recursos e incentiva os usuários a executarem mais programas simultaneamente.

  • Muitos limites se aplicam a processos individuais, não ao usuário como um todo. Por exemplo, definir a variável openfiles como 50 significa que cada processo que o usuário executa pode abrir até 50 arquivos. A quantidade total de arquivos que um usuário pode abrir é o valor de openfiles multiplicado pelo valor de maxproc. Isso também se aplica ao consumo de memória.

Para mais informações sobre limites de recursos e classes de login e capacidades em geral, consulte cap_mkdb(1), getrlimit(2) e login.conf(5).

13.13.2. Ativando e Configurando Limites de Recursos

A variável configurável kern.racct.enable deve ser configurada para um valor diferente de zero. Kernels personalizados requerem configuração específica:

options         RACCT
options         RCTL

Depois que o sistema for reinicializado no novo kernel, o rctl poderá ser usado para definir regras para o sistema.

A sintaxe da regra é controlada por meio do uso de um subject, subject-id, resource e action, conforme visto nesta regra de exemplo:

user:trhodes:maxproc:deny=10/user

Nesta regra, o subject é user, o subject-id é trhodes, o resource, maxproc, é o número máximo de processos, e a action é deny, que bloqueia a criação de novos processos. Isso significa que o usuário, trhodes, será restrito a execução de no máximo 10 processos. Outras ações possíveis incluem o registro no console, passando uma notificação para o devd(8) ou enviando um sigterm para o processo.

Algum cuidado deve ser tomado ao adicionar regras. Como esse usuário está restrito a 10 processos, este exemplo impedirá que o usuário execute outras tarefas depois de efetuar login e executar uma sessão screen. Quando um limite de recurso for atingido, um erro será impresso, como neste exemplo:

% man test
    /usr/bin/man: Cannot fork: Resource temporarily unavailable
eval: Cannot fork: Resource temporarily unavailable

Como outro exemplo, uma jail pode ser impedida de exceder um limite de memória. Esta regra pode ser escrita como:

# rctl -a jail:httpd:memoryuse:deny=2G/jail

As regras persistirão durante as reinicializações se tiverem sido adicionadas ao arquivo /etc/rctl.conf. O formato é uma regra, sem o comando anterior. Por exemplo, a regra anterior pode ser adicionada como:

# Block jail from using more than 2G memory:
jail:httpd:memoryuse:deny=2G/jail

Para remover uma regra, use o rctl para removê-la da lista:

# rctl -r user:trhodes:maxproc:deny=10/user

Um método para remover todas as regras é documentado em rctl(8). No entanto, se for necessário remover todas as regras para um único usuário, esse comando poderá ser emitido:

# rctl -r user:trhodes

Existem muitos outros recursos que podem ser usados ​​para exercer controle adicional sobre vários subjects. Veja rctl(8) para aprender sobre eles.

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.