Limitando o uso de CPU por processo no Ubuntu Server

Imagine a seguinte situação: seu provedor de VPS está suspendendo temporariamente o serviço contratado porque algum processo no seu servidor está usando 100% da CPU por muito tempo.

Como lidar com esse tipo de situação?

Usando o cpulimit, vamos tomar como exemplo que queremos limitar qualquer processo com nome ‘java’ à apenas parte de uma cpu, o comando é:

cpulimit -e java -l 50

Executando esse comando em um terminal, ele ficará aguardando até que um processo chamado ‘java’ apareça. Em seguida já irá limitar o uso da CPU para esse processo.

Se isso deve permanecer como regra no servidor, mesmo após reinícios, o melhor é deixar um processo em background monitorando os processos ativos.

Vamos salvar o script abaixo em /usr/local/bin/monitor_java.sh

#!/bin/bash
LIMITE=50

echo "Aguardando processo Java..."

while true; do
  PID=$(pgrep -x java | head -1)
  
  if [ -n "$PID" ]; then
    echo "Java encontrado (PID: $PID). Aplicando limite de ${LIMITE}%..."
    cpulimit -p "$PID" -l "$LIMITE" -z
    echo "Processo encerrado. Aguardando novo Java..."
  fi
  
  sleep 2
done

Agora vamos configurar o systemd para tratar isso como um serviço. Salve o arquivo abaixo em /etc/systemd/system/cpulimit-java.service

[Unit]
Description=Limita CPU do processo Java
After=network.target

[Service]
ExecStart=/usr/local/bin/monitor_java.sh
Restart=always
RestartSec=5
User=root

[Install]
WantedBy=multi-user.target

Para habilitar o serviço, use os comandos abaixo.

sudo chmod +x /usr/local/bin/monitor_java.sh
sudo systemctl daemon-reload
sudo systemctl enable --now cpulimit-java.service

# Acompanhar logs:
sudo journalctl -u cpulimit-java.service -f