A luta por recursos, parte 3: há pouca memória

Continuamos estudando os Grupos de Controle (Cgroups) no Red Hat Enterprise Linux 7. Vamos cuidar da memória. Você se lembra de que há dois ajustes na alocação do tempo do processador: CPUShares para definir compartilhamentos relativos e CPUQuota para limitar o usuário, serviço ou máquina virtual (VM) em valores absolutos (porcentagem) do tempo do processador. Além disso, esses dois ajustes podem ser usados ​​simultaneamente. Por exemplo, se um usuário tiver uma cota de CPU de 50%, sua esfera de CPU também será levada em consideração até que ele selecione completamente sua cota em 50% do tempo do processador.



Quanto à RAM, o systemd oferece apenas uma maneira de ajustar, a saber ...

A quantidade de memória que pode ser alocada para um usuário ou serviço. Suponha que desejamos limitar o usuário rico a 200 MB de RAM. Se você se lembra, seu UID é 1000, então inserimos o seguinte comando:

  systemctl set-property user-1000.slice MemoryLimit = 200M

Agora, a mrichter deseja verificar seus limites e lança o utilitário de teste de estresse, que começa a consumir memória intensivamente. E o estresse produz rapidamente um erro:


De acordo com o log do sistema, o estresse foi simplesmente interrompido pelo OOM (Out Of Memory) Killer.


Aqui é importante prestar atenção a isso: por padrão, o limite de RAM se aplica apenas à memória residente. Ou seja, se o processo puder ir para o arquivo de swap ("swap"), ele ignorará o limite estabelecido. No nosso exemplo, o estresse caiu porque excedeu o limite da memória residente.

E se não queremos que o programa seja mesclado em uma troca?

Isso, em geral, é fácil de banir. Bem, ou relativamente fácil ... Em geral, você tem que subir em algum lugar.

Existem configurações do cgroup que não podem ser alcançadas pelo comando systemctl ou pelos arquivos da unidade. No entanto, essas configurações podem ser alteradas rapidamente através dos arquivos na pasta / sys / fs / cgroup /. Aqui está como, por exemplo, o crich do usuário mrichter se parece na memória:


O arquivo responsável por quanta memória pode ser usada na troca é chamado obviamente de memory.swappiness. Vamos ver o que há dentro:


Se você jogar com as configurações do kernel e o subsistema de troca, verá imediatamente o valor padrão padrão para o parâmetro swappiness aqui. Se você alterar para zero, o controlador de RAM do usuário mrichter geralmente o proíbe de usar uma troca.


A propósito, aqui você pode ver as estatísticas de memória do usuário mrichter:


O valor do parâmetro hierarchical_memory_limit é o mesmo MemoryLimit que especificamos com o comando systemctl. O parâmetro hierarchical_memsw_limit representa o limite total (memória residente e memória no arquivo do arquivo). Impedimos que o usuário mrichter usasse o arquivo de paginação, portanto o valor desse parâmetro é muito estranho.

Agora, sobre os problemas da abordagem que acabamos de descrever:

  • Você só pode fazer alterações nesses arquivos quando o usuário mrichter estiver conectado ao sistema. Até que ele efetue login, seu cgroup ficará inativo.
  • Essas configurações não são salvas após uma reinicialização. Além disso, eles serão perdidos se o especialista se mover.

O script pam_exec ajudará a lidar com esses problemas (consulte access.redhat.com/solutions/46199 para obter detalhes ).

Aqui está o script que criaremos na pasta / usr / local / bin:


E adicione sua chamada à última linha do /etc/pam.d/sshd. Como resultado, esse script será executado toda vez que um usuário efetuar login via ssh. É por isso que verificamos no script que este é o usuário rico antes de alterar as configurações.


Portanto, cortamos o usuário mrichter do arquivo de paginação.


Obviamente, você pode ir ainda mais longe e alterar os arquivos de configuração do cgroup ativo em tempo real, mas por enquanto adiaremos esse negócio arriscado. No entanto, o método geral para alterar as configurações do usuário é algo que você capturou.

E com serviços ainda é mais fácil. No arquivo da unidade de serviço, você pode usar a diretiva ExecStartPost = para executar um script que altera as configurações. Por exemplo, veja como alterar o arquivo da unidade de serviço foo para desativar a troca:


Execute foo - e sem troca:


Bem, por hoje, talvez, esse xamanismo seja suficiente para nós.

Mas antes de terminarmos, vamos nos concentrar na documentação do cgroup, onde você pode encontrar informações sobre todas essas configurações ocultas do regulador. Você pode instalar o pacote kernel-doc no seu computador, como fiz baixando-o do repositório rhel-7-server-rpms.


Após a instalação, abra a pasta / usr / share / docs que corresponde ao seu kernel e vá para a pasta cgroups, que contém as informações mais recentes sobre todos os reguladores.


Da próxima vez, falaremos sobre E / S. A propósito, quase chegamos a descobrir como o cgroups levou ao surgimento de contêineres (na verdade, o cgroups é um componente-chave dos contêineres no Red Hat Enterprise Linux e Red Hat OpenShift Container Platform).

Source: https://habr.com/ru/post/pt425803/


All Articles