15 min de leitura · Guia técnico
Limitar uso de CPU por usuário no Rocky Linux 9 é o processo de definir cotas máximas de processamento para contas do sistema usando cgroups v2 integrados ao systemd. Para aplicar essa restrição, siga estes passos:
- Identifique o UID do usuário com
id nome_usuario - Crie o diretório de override do slice:
mkdir -p /etc/systemd/system/user-1001.slice.d/ - Crie o arquivo
cpu.confcom a diretivaCPUQuota=50% - Execute
systemctl daemon-reloadpara aplicar a configuração - Verifique com
systemctl show user-1001.slice | grep CPUQuota - Monitore em tempo real com
systemd-cgtop
Pré-requisitos para limitar uso de CPU por usuário no Rocky Linux 9
- Sistema operacional: Rocky Linux 9 (com cgroups v2 ativo por padrão)
- Acesso root ou usuário com privilégios
sudo - systemd versão 245+ — verifique com
systemctl --version - Usuário alvo já criado no sistema com UID conhecido
- Familiaridade básica com terminal Linux e edição de arquivos de configuração
- Conexão SSH ativa ao servidor — veja como em Acessando servidores VPS Linux da AviraHost
Como funcionam os cgroups v2 e o systemd no controle de CPU
O controle de grupos (cgroups v2) é o mecanismo do kernel Linux responsável por isolar e limitar o uso de recursos — CPU, memória, I/O — por grupos de processos. No Rocky Linux 9, o cgroups v2 é o padrão, com ponto de montagem unificado em /sys/fs/cgroup, diferente das versões anteriores onde cada subsistema tinha hierarquia própria.
O systemd atua como gerenciador de cgroups, criando automaticamente um slice para cada usuário logado. Quando o usuário de UID 1001 inicia uma sessão, o systemd cria o slice user-1001.slice e todos os processos desse usuário ficam subordinados a ele. Ao definir CPUQuota nesse slice, você instrui o kernel a não conceder mais do que aquele percentual de tempo de CPU para qualquer processo pertencente àquele usuário.
Isso é especialmente útil em ambientes de hospedagem compartilhada, servidores VPS com múltiplos clientes ou máquinas de desenvolvimento onde um processo mal otimizado pode monopolizar os núcleos disponíveis. Para entender melhor como um VPS funciona internamente, consulte Compreendendo o Servidor VPS: O que é e Como Funciona.
A unidade de medida do CPUQuota é percentual por núcleo: 100% equivale a um núcleo inteiro, 200% equivale a dois núcleos. Em um servidor com 4 núcleos, definir CPUQuota=400% permitiria uso total da máquina, enquanto CPUQuota=25% limitaria o usuário a um quarto de um único núcleo.
Identificando o UID do usuário e verificando o slice existente
Antes de criar qualquer configuração de cota de CPU por usuário, você precisa confirmar o UID correto. Um erro no UID resulta em um slice que nunca é aplicado ao usuário pretendido.
Execute o comando abaixo para obter o UID:
id nome_usuario
uid=1001(nome_usuario) gid=1001(nome_usuario) groups=1001(nome_usuario)
Com o UID em mãos, verifique se o slice já existe no systemd:
systemctl status user-1001.slice
● user-1001.slice - User Slice of UID 1001
Loaded: loaded (/usr/lib/systemd/system/user-.slice.d/10-defaults.conf; static)
Active: active since Mon 2025-01-13 10:22:31 UTC; 2h 15min ago
Se o slice aparecer como inactive, o usuário não está logado no momento, mas a configuração de limite ainda será aplicada na próxima sessão. Você também pode listar todos os slices de usuário ativos:
systemctl list-units --type=slice
UNIT LOAD ACTIVE SUB DESCRIPTION
-.slice loaded active active Root Slice
system.slice loaded active active System Slice
user-1001.slice loaded active active User Slice of UID 1001
user.slice loaded active active User and Session Slice
Criando a configuração de CPUQuota para o usuário
A forma recomendada de restringir processamento por conta de sistema no Rocky Linux 9 é usando arquivos drop-in do systemd, que sobrescrevem configurações padrão sem modificar arquivos do sistema. Isso facilita atualizações e reversões.
Crie o diretório de override para o slice do usuário:
mkdir -p /etc/systemd/system/user-1001.slice.d/
Agora crie o arquivo de configuração:
nano /etc/systemd/system/user-1001.slice.d/cpu.conf
Insira o seguinte conteúdo:
[Slice]
CPUQuota=50%
Salve o arquivo (Ctrl+O, Enter, Ctrl+X no nano). Esse valor de 50% limita o usuário a metade de um núcleo de CPU. Ajuste conforme a necessidade do seu ambiente.
Recarregue o daemon do systemd para que ele reconheça o novo arquivo:
systemctl daemon-reload
Se o usuário já estiver logado e o slice estiver ativo, reinicie-o para aplicar imediatamente:
systemctl restart user-1001.slice
Atenção: reiniciar o slice encerrará todos os processos do usuário em execução no momento. Avise o usuário antes de executar este comando em ambiente de produção.
Verificando e monitorando o limite de CPU aplicado
Após aplicar a configuração de limite de processador via systemd, é essencial confirmar que o kernel está respeitando a cota definida. Existem três formas principais de verificação.
1. Verificar o valor configurado no slice:
systemctl show user-1001.slice | grep CPUQuota
CPUQuotaPerSecUSec=500ms
CPUQuotaPeriodUSec=100ms
O valor 500ms por segundo corresponde a 50% de um núcleo — exatamente o que foi configurado.
2. Monitorar consumo em tempo real com systemd-cgtop:
systemd-cgtop
Control Group Tasks %CPU Memory Input/s Output/s
/ 142 12.3 2.1G - -
/user.slice 18 8.4 512.0M - -
/user.slice/user-1001.slice 6 4.9 128.0M - -
3. Ler diretamente o arquivo de estatísticas do cgroup:
cat /sys/fs/cgroup/user.slice/user-1001.slice/cpu.stat
usage_usec 4823910
user_usec 3201450
system_usec 1622460
nr_periods 48239
nr_throttled 1203
throttled_usec 120300000
O campo nr_throttled indica quantas vezes o slice foi limitado pelo kernel. Um valor alto pode indicar que a cota está muito restritiva para as necessidades do usuário.
Aplicando limites de CPU para múltiplos usuários simultaneamente
Em servidores com vários usuários — como ambientes de hospedagem ou servidores de desenvolvimento compartilhado — você pode automatizar a criação de cotas de CPU por conta Linux com um script simples.
Crie o script /usr/local/bin/set-cpu-quota.sh:
#!/bin/bash
# Uso: ./set-cpu-quota.sh 1001 50%
UID_ALVO=$1
QUOTA=$2
if [ -z "$UID_ALVO" ] || [ -z "$QUOTA" ]; then
echo "Uso: $0 "
echo "Exemplo: $0 1001 50%"
exit 1
fi
SLICE_DIR="/etc/systemd/system/user-${UID_ALVO}.slice.d"
mkdir -p "$SLICE_DIR"
cat > "${SLICE_DIR}/cpu.conf" </dev/null || true
echo "CPUQuota=${QUOTA} aplicada ao usuário UID ${UID_ALVO}"
Torne o script executável:
chmod +x /usr/local/bin/set-cpu-quota.sh
Para aplicar limites a três usuários diferentes:
set-cpu-quota.sh 1001 50%
set-cpu-quota.sh 1002 75%
set-cpu-quota.sh 1003 100%
Você também pode combinar CPUQuota com MemoryMax no mesmo arquivo para um controle mais abrangente de recursos:
[Slice]
CPUQuota=50%
MemoryMax=512M
MemorySwapMax=0
Essa combinação é especialmente útil em servidores VPS onde os recursos são compartilhados entre múltiplos serviços. Veja também as Dicas de Otimização de Servidores Linux para outras técnicas de tuning.
Tornando os limites persistentes após reinicialização
Os arquivos drop-in criados em /etc/systemd/system/ são persistentes por padrão no Rocky Linux 9 — eles sobrevivem a reinicializações do servidor. No entanto, há um detalhe importante: o slice do usuário só é criado quando o usuário faz login.
Para garantir que o slice seja iniciado automaticamente mesmo sem login ativo, habilite o serviço de lingering para o usuário:
loginctl enable-linger nome_usuario
loginctl show-user nome_usuario | grep Linger
Linger=yes
Com o lingering ativo, o systemd mantém o slice do usuário carregado mesmo quando não há sessão ativa, garantindo que os limites sejam aplicados desde o início de qualquer processo iniciado por aquele usuário — incluindo jobs cron e serviços de sistema rodando sob aquela conta.
Para verificar todos os usuários com lingering ativo:
ls /var/lib/systemd/linger/
nome_usuario
Removendo ou ajustando limites de CPU existentes
Para remover a restrição de CPU de um usuário, basta excluir o arquivo de configuração e recarregar o daemon:
Atenção: o comando abaixo remove permanentemente a configuração de limite para o usuário especificado. Confirme o UID antes de executar.
rm /etc/systemd/system/user-1001.slice.d/cpu.conf
systemctl daemon-reload
systemctl restart user-1001.slice
Para apenas ajustar o valor sem remover, edite o arquivo e altere o percentual:
nano /etc/systemd/system/user-1001.slice.d/cpu.conf
Altere CPUQuota=50% para o novo valor desejado, salve e execute:
systemctl daemon-reload
systemctl restart user-1001.slice
Para confirmar que o limite foi removido:
systemctl show user-1001.slice | grep CPUQuota
CPUQuotaPerSecUSec=infinity
O valor infinity indica que não há limite aplicado ao slice.
Problemas comuns e como resolver
Sintoma: CPUQuota não aparece após daemon-reload
Causa: O arquivo drop-in foi criado com nome ou caminho incorreto. O systemd exige que o diretório se chame exatamente user-UID.slice.d e o arquivo tenha extensão .conf.
Solução: Verifique o caminho com ls /etc/systemd/system/user-1001.slice.d/ e confirme que o arquivo existe e tem extensão .conf. Execute systemd-analyze verify user-1001.slice para checar erros de sintaxe na configuração.
Sintoma: Limite aplicado mas usuário ainda consome 100% de CPU
Causa: O slice foi configurado mas não reiniciado, ou o processo do usuário foi iniciado antes da aplicação do limite e está em um cgroup diferente.
Solução: Execute systemctl restart user-1001.slice para forçar a reaplicação. Confirme que o processo está dentro do slice correto com cat /proc/PID/cgroup — o output deve conter user-1001.slice.
Sintoma: Erro "Failed to restart user-1001.slice: Unit not found"
Causa: O usuário nunca fez login e o slice ainda não foi criado pelo systemd, ou o UID está incorreto.
Solução: Verifique o UID com id nome_usuario e confirme que o número bate com o nome do slice. Se necessário, ative o lingering com loginctl enable-linger nome_usuario para que o slice seja criado automaticamente.
Sintoma: systemd-cgtop não mostra o slice do usuário
Causa: O usuário não tem processos ativos no momento, então o slice aparece vazio ou não é listado.
Solução: Faça login com o usuário em questão ou inicie um processo de teste: su - nome_usuario -c "stress --cpu 1 --timeout 30 &". Em seguida, execute systemd-cgtop novamente para visualizar o consumo sendo limitado.
Sintoma: Configuração perdida após atualização do sistema
Causa: Arquivos em /etc/systemd/system/ não são sobrescritos por atualizações, mas se o administrador usou /usr/lib/systemd/system/ por engano, o arquivo pode ter sido substituído.
Solução: Sempre use /etc/systemd/system/ para configurações locais. Verifique com systemctl cat user-1001.slice qual arquivo está sendo carregado e de qual diretório.
Perguntas frequentes sobre limite de CPU por usuário no Linux
Como limitar o uso de CPU de um usuário específico no Linux?
No Rocky Linux 9, você pode usar cgroups v2 via systemd para criar um slice por usuário e definir CPUQuota. Por exemplo, criando o arquivo /etc/systemd/system/user-1001.slice.d/cpu.conf com CPUQuota=50% você restringe o usuário de UID 1001 a metade de um núcleo. Após salvar, execute systemctl daemon-reload para aplicar. A configuração é persistente e sobrevive a reinicializações do servidor.
O que é CPUQuota no systemd e como funciona?
CPUQuota é uma diretiva do systemd que define o percentual máximo de tempo de CPU que um cgroup pode consumir. Um valor de 100% equivale a um núcleo inteiro; 200% equivale a dois núcleos. O kernel distribui o tempo de CPU restante para outros processos quando o limite é atingido, sem matar o processo — o processo simplesmente fica em espera até que seu tempo de CPU seja renovado no próximo período de medição.
Qual a diferença entre cgroups v1 e cgroups v2 no Rocky Linux 9?
O Rocky Linux 9 usa cgroups v2 por padrão, que unifica a hierarquia de controle em um único ponto de montagem em /sys/fs/cgroup. No cgroups v1, cada subsistema (cpu, memory, blkio) tinha sua própria hierarquia separada, o que tornava a gestão mais complexa e propensa a inconsistências. Com cgroups v2, o systemd gerencia tudo de forma integrada e consistente, simplificando tanto a configuração quanto o monitoramento de recursos.
Como verificar se o limite de CPU está sendo aplicado corretamente?
Execute systemctl show user-1001.slice | grep CPUQuota para confirmar o valor configurado. Para monitorar o consumo em tempo real, use systemd-cgtop ou cat /sys/fs/cgroup/user.slice/user-1001.slice/cpu.stat. O campo usage_usec mostra o tempo acumulado de CPU consumido pelo slice, e nr_throttled indica quantas vezes o kernel aplicou o throttling ao grupo.
Posso limitar CPU por usuário sem reiniciar o servidor?
Sim. Após criar ou editar os arquivos de configuração do slice, basta executar systemctl daemon-reload e systemctl restart user-1001.slice. As alterações são aplicadas imediatamente sem necessidade de reinicialização do servidor ou interrupção dos serviços em execução em outros slices. Apenas os processos do usuário afetado são brevemente interrompidos durante o restart do slice.
Conclusão
- Use arquivos drop-in em
/etc/systemd/system/user-UID.slice.d/cpu.confpara definir CPUQuota de forma persistente e não destrutiva — nunca edite arquivos em/usr/lib/systemd/. - Monitore regularmente com
systemd-cgtopecpu.statpara identificar usuários que estão sendo throttled com frequência e ajustar as cotas conforme o uso real. - Combine CPUQuota com MemoryMax e loginctl enable-linger para um controle completo de recursos por usuário, garantindo que os limites sejam aplicados mesmo para processos iniciados via cron ou serviços de sistema.
Leia também
- Guia para Configurar Limite de Uso de CPU por Processo no Linux
- Solucionar erros de DNS no Bind9 no Rocky Linux 9
- Otimizar Rsync no Rocky Linux 9: velocidade e eficiência
Precisa de ajuda com gerenciamento de recursos no seu VPS Linux?
Configurar cgroups e limites de CPU manualmente exige acesso root e conhecimento do systemd — recursos disponíveis em qualquer VPS Linux da AviraHost, com suporte técnico para auxiliar na configuração inicial do seu ambiente.