Pesquisa de site

LFCS: Monitore o uso de recursos dos processos Linux e defina limites de processos por usuário - Parte 14


Devido às recentes modificações nos objetivos do exame de certificação LFCS em vigor a partir de 2 de fevereiro de 2016, estamos adicionando os artigos necessários à série LFCS publicada aqui. Para se preparar para este exame, recomendamos fortemente que você faça também a série LFCE.

Todo administrador de sistema Linux precisa saber como verificar a integridade e disponibilidade de hardware, recursos e processos principais. Além disso, definir limites de recursos por usuário também deve fazer parte de seu conjunto de habilidades.

Neste artigo, exploraremos algumas maneiras de garantir que o sistema, tanto o hardware quanto o software, estejam se comportando corretamente para evitar possíveis problemas que podem causar paradas inesperadas de produção e perda de dinheiro.

Estatísticas de processadores de relatórios Linux

Com mpstat você pode visualizar as atividades de cada processador individualmente ou do sistema como um todo, tanto como um instantâneo único ou dinamicamente.

Para usar esta ferramenta, você precisará instalar o sysstat:

yum update && yum install sysstat              [On CentOS based systems]
aptitutde update && aptitude install sysstat   [On Ubuntu based systems]
zypper update && zypper install sysstat        [On openSUSE systems]

Leia mais sobre sysstat e seus utilitários em Aprenda Sysstat e seus utilitários mpstat, pidstat, iostat e sar no Linux

Depois de instalar o mpstat, use-o para gerar relatórios de estatísticas dos processadores.

Para exibir 3 relatórios globais de utilização de CPU (-u) para todas as CPUs (conforme indicado por -P ALL) em um intervalo de 2 segundos , fazer:

mpstat -P ALL -u 2 3
Saída de amostra
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:41:07  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:09  IST  all    5.85    0.00    1.12    0.12    0.00    0.00    0.00    0.00    0.00   92.91
11:41:09  IST    0    4.48    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   94.53
11:41:09  IST    1    2.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:09  IST    2    6.44    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   92.57
11:41:09  IST    3   10.45    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   87.56

11:41:09  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:11  IST  all   11.60    0.12    1.12    0.50    0.00    0.00    0.00    0.00    0.00   86.66
11:41:11  IST    0   10.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   88.50
11:41:11  IST    1   14.36    0.00    1.49    2.48    0.00    0.00    0.00    0.00    0.00   81.68
11:41:11  IST    2    2.00    0.50    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:41:11  IST    3   19.40    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   79.60

11:41:11  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:13  IST  all    5.69    0.00    1.24    0.00    0.00    0.00    0.00    0.00    0.00   93.07
11:41:13  IST    0    2.97    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   95.54
11:41:13  IST    1   10.78    0.00    1.47    0.00    0.00    0.00    0.00    0.00    0.00   87.75
11:41:13  IST    2    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:13  IST    3    6.93    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   92.57

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    7.71    0.04    1.16    0.21    0.00    0.00    0.00    0.00    0.00   90.89
Average:       0    5.97    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   92.87
Average:       1    9.24    0.00    1.16    0.83    0.00    0.00    0.00    0.00    0.00   88.78
Average:       2    3.49    0.17    1.00    0.00    0.00    0.00    0.00    0.00    0.00   95.35
Average:       3   12.25    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   86.59

Para visualizar as mesmas estatísticas para uma CPU específica (CPU 0 no exemplo a seguir), use:

mpstat -P 0 -u 2 3
Saída de amostra
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:42:08  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:42:10  IST    0    3.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:42:12  IST    0    4.08    0.00    0.00    2.55    0.00    0.00    0.00    0.00    0.00   93.37
11:42:14  IST    0    9.74    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   89.74
Average:       0    5.58    0.00    0.34    0.85    0.00    0.00    0.00    0.00    0.00   93.23

A saída dos comandos acima mostra estas colunas:

  1. CPU: número do processador como um número inteiro ou a palavra all como uma média para todos os processadores.
  2. %usr: Porcentagem de utilização da CPU durante a execução de aplicativos em nível de usuário.
  3. %nice: O mesmo que %usr, mas com prioridade agradável.
  4. %sys: Porcentagem de utilização da CPU que ocorreu durante a execução de aplicativos do kernel. Isso não inclui o tempo gasto lidando com interrupções ou manipulando hardware.
  5. %iowait: Porcentagem de tempo em que uma determinada CPU (ou todas) ficou ociosa, durante o qual houve uma operação de E/S com uso intensivo de recursos agendada nessa CPU. Uma explicação mais detalhada (com exemplos) pode ser encontrada aqui.
  6. %irq: Porcentagem de tempo gasto atendendo interrupções de hardware.
  7. %soft: O mesmo que %irq, mas com interrupções de software.
  8. %steal: Porcentagem de tempo gasto em espera involuntária (roubo ou tempo roubado) quando uma máquina virtual, como convidada, está “ganhando” a atenção do hipervisor enquanto compete pela(s) CPU(s). Este valor deve ser mantido o menor possível. Um valor alto neste campo significa que a máquina virtual está paralisada – ou estará em breve.
  9. %guest: Porcentagem de tempo gasto executando um processador virtual.
  10. %idle: porcentagem de tempo em que CPU(s) não estavam executando nenhuma tarefa. Se você observar um valor baixo nesta coluna, isso é uma indicação de que o sistema está sob uma carga pesada. Nesse caso, você precisará dar uma olhada mais de perto na lista de processos, como discutiremos em um minuto, para determinar o que está causando isso.

Para colocar o processador sob uma carga um tanto alta, execute os seguintes comandos e, em seguida, execute mpstat (conforme indicado) em um terminal separado:

dd if=/dev/zero of=test.iso bs=1G count=1
mpstat -u -P 0 2 3
ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
mpstat -u -P 0 2 3

Finalmente, compare com a saída do mpstat em circunstâncias “normais”:

Como você pode ver na imagem acima, a CPU 0 estava sob carga pesada durante os dois primeiros exemplos, conforme indicado pela coluna %idle.

Na próxima secção discutiremos como identificar estes processos que exigem muitos recursos, como obter mais informações sobre eles e como tomar as medidas adequadas.

Relatório de processos Linux

Para listar os processos classificando-os por uso da CPU, usaremos o conhecido comando ps com o -eo (para selecionar todos os processos com formato definido pelo usuário) e --sort (para especificar uma ordem de classificação personalizada), assim:

ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

O comando acima mostrará apenas o PID, PPID, o comando associado ao processo e a porcentagem de uso de CPU e RAM classificada pela porcentagem de uso de CPU em ordem decrescente . Quando executado durante a criação do arquivo .iso, aqui estão as primeiras linhas da saída:

Depois de identificarmos um processo de interesse (como aquele com PID=2822), podemos navegar para /proc/PID (/proc/2822 neste caso) e faça uma listagem de diretórios.

Este diretório é onde vários arquivos e subdiretórios com informações detalhadas sobre este processo específico são mantidos enquanto ele está em execução.

Por exemplo:
  1. /proc/2822/io contém estatísticas de IO para o processo (número de caracteres e bytes lidos e escritos, entre outros, durante operações de IO).
  2. /proc/2822/attr/current mostra os atributos de segurança SELinux atuais do processo.
  3. /proc/2822/cgroup descreve os grupos de controle (abreviadamente cgroups) aos quais o processo pertence se a opção de configuração do kernel CONFIG_CGROUPS estiver habilitada, o que você pode verificar com:
cat /boot/config-$(uname -r) | grep -i cgroups

Se a opção estiver habilitada, você deverá ver:

CONFIG_CGROUPS=y

Usando cgroups você pode gerenciar a quantidade de uso de recursos permitido por processo, conforme explicado nos Capítulos 1 a 4 do guia Red Hat Enterprise Linux 7 Resource Management, no Capítulo 9 do openSUSE System Analysis e guia de ajuste e na seção Grupos de controle da documentação do servidor Ubuntu 14.04.

O /proc/2822/fd é um diretório que contém um link simbólico para cada descritor de arquivo que o processo abriu. A imagem a seguir mostra essas informações do processo iniciado em tty1 (o primeiro terminal) para criar a imagem .iso:

A imagem acima mostra que stdin (descritor de arquivo 0), stdout (descritor de arquivo 1) e stderr (descritor de arquivo 2) são mapeados para /dev/zero, /root/test.iso e /dev/tty1, respectivamente.

Mais informações sobre /proc podem ser encontradas no documento “O sistema de arquivos /proc” mantido e mantido por Kernel.org, e no Manual do Programador Linux.

Definindo limites de recursos por usuário no Linux

Se você não tomar cuidado e permitir que qualquer usuário execute um número ilimitado de processos, você poderá eventualmente enfrentar um desligamento inesperado do sistema ou ser bloqueado quando o sistema entrar em um estado inutilizável. Para evitar que isso aconteça, você deve limitar o número de processos que os usuários podem iniciar.

Para fazer isso, edite /etc/security/limits.conf e adicione a seguinte linha na parte inferior do arquivo para definir o limite:

*   	hard	nproc   10

O primeiro campo pode ser usado para indicar um usuário, um grupo ou todos eles (*), enquanto o segundo campo impõe um limite rígido no número de processos (nproc) para 10. Para aplicar as alterações, basta sair e entrar novamente.

Assim, vamos ver o que acontece se um determinado usuário que não seja o root (legítimo ou não) tentar iniciar uma bomba shell fork. Se não tivéssemos implementado limites, isso iniciaria inicialmente duas instâncias de uma função e depois duplicaria cada uma delas em um loop sem fim. Assim, isso eventualmente levaria seu sistema a um rastreamento.

No entanto, com a restrição acima em vigor, o fork bomb não terá êxito, mas o usuário ainda será bloqueado até que o administrador do sistema elimine o processo associado a ele:

DICA: Outras possíveis restrições possibilitadas pelo ulimit estão documentadas no arquivo limits.conf.

Linux Outras ferramentas de gerenciamento de processos

Além das ferramentas discutidas anteriormente, um administrador de sistema também pode precisar:

a) Modifique a prioridade de execução (uso de recursos do sistema) de um processo usando renice. Isso significa que o kernel alocará mais ou menos recursos do sistema para o processo com base na prioridade atribuída (um número comumente conhecido como “niceness ” em um intervalo de -20 a 19).

Quanto menor o valor, maior será a prioridade de execução. Usuários regulares (exceto root) só podem modificar a qualidade dos processos que possuem para um valor mais alto (significando uma prioridade de execução mais baixa), enquanto o root pode modificar esse valor para qualquer processo e pode aumentá-lo ou diminuí-lo.

A sintaxe básica do renice é a seguinte:

renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

Se o argumento após o novo valor de prioridade não estiver presente (vazio), ele será definido como PID por padrão. Nesse caso, a qualidade do processo com PID=identificador é definida como .

b) Interromper a execução normal de um processo quando necessário. Isso é comumente conhecido como “matar” o processo. Nos bastidores, isso significa enviar ao processo um sinal para concluir sua execução corretamente e liberar quaisquer recursos usados de maneira ordenada.

Para encerrar um processo, use o comando kill da seguinte forma:

kill PID

Alternativamente, você pode usar pkill para encerrar todos os processos de um determinado proprietário (-u), ou proprietário de um grupo (-G), ou mesmo aqueles processos que possuem um PPID em comum (-P). Estas opções podem ser seguidas da representação numérica ou do nome real como identificador:

pkill [options] identifier

Por exemplo,

pkill -G 1000

eliminará todos os processos pertencentes ao grupo com GID=1000.

E,

pkill -P 4993 

eliminará todos os processos cujo PPID seja 4993.

Antes de executar um pkill, é uma boa ideia testar os resultados com pgrep primeiro, talvez usando também a opção -l para listar os nomes dos processos. Ele usa as mesmas opções, mas retorna apenas os PIDs dos processos (sem realizar nenhuma ação adicional) que seriam eliminados se pkill fosse usado.

pgrep -l -u gacanepa

Isso é ilustrado na próxima imagem:

Resumo

Neste artigo, exploramos algumas maneiras de monitorar o uso de recursos para verificar a integridade e a disponibilidade de componentes críticos de hardware e software em um sistema Linux.

Também aprendemos como tomar as medidas adequadas (seja ajustando a prioridade de execução de um determinado processo ou encerrando-o) em circunstâncias incomuns.

Esperamos que os conceitos explicados neste tutorial tenham sido úteis. Se você tiver alguma dúvida ou comentário, sinta-se à vontade para entrar em contato conosco através do formulário de contato abaixo.