# cgroup

O `/sys/fs/cgroup/` é uma parte essencial do sistema de arquivos virtual no Linux que oferece uma interface para gerenciar e monitorar os **control groups** (cgroups). Cgroups são uma funcionalidade do kernel do Linux que permite limitar, priorizar, monitorar e isolar recursos (como CPU, memória, disco e rede) de processos ou grupos de processos.

## O que é um cgroup?

Um cgroup (control group) é um mecanismo que permite agrupar processos e controlar a quantidade de recursos que esses processos podem usar. Isso é útil em várias situações, como em servidores onde você deseja garantir que um processo não consuma todos os recursos, ou em ambientes de containers, onde cada container deve ser limitado em termos de recursos.

## Estrutura do `/sys/fs/cgroup/`

A estrutura de diretórios em `/sys/fs/cgroup/` reflete os diferentes tipos de recursos que podem ser controlados. Cada subdiretório em `/sys/fs/cgroup/` representa um subsistema ou controladora de cgroup, como `cpu`, `memory`, `blkio`, `net_cls`, entre outros.

### **Exemplos de subdiretórios:**

* `/sys/fs/cgroup/cpu/`: Controla o uso da CPU.
* `/sys/fs/cgroup/memory/`: Gerencia o uso de memória.
* `/sys/fs/cgroup/blkio/`: Controla as operações de entrada/saída em dispositivos de bloco.
* `/sys/fs/cgroup/net_cls/`: Marca pacotes de rede para classificação.

## Exemplos práticos

1. **Limitando o uso de CPU de um processo:**

   Suponha que você queira limitar o uso da CPU de um processo. Você pode criar um novo grupo dentro do cgroup de CPU e atribuir o processo a esse grupo.

   ```bash
   mkdir /sys/fs/cgroup/cpu/mygroup
   echo 100000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us
   echo <PID> > /sys/fs/cgroup/cpu/mygroup/tasks
   ```

   Aqui, `cpu.cfs_quota_us` é definido como `100000`, o que significa que os processos neste grupo só podem usar 10% de uma CPU. O `<PID>` é o identificador do processo que você deseja limitar.
2. **Limitando o uso de memória de um grupo de processos:**

   Suponha que você tenha um grupo de processos que não deve usar mais que 512MB de memória.

   ```bash
   mkdir /sys/fs/cgroup/memory/mygroup
   echo 536870912 > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes
   echo <PID1> > /sys/fs/cgroup/memory/mygroup/tasks
   echo <PID2> > /sys/fs/cgroup/memory/mygroup/tasks
   ```

   Neste exemplo, `memory.limit_in_bytes` é configurado para `536870912` bytes (512MB). Os processos `<PID1>` e `<PID2>` estarão sujeitos a esse limite de memória.
3. **Isolando I/O em disco:**

   Você pode controlar a quantidade de operações de entrada/saída que um grupo de processos pode realizar.

   ```bash
   mkdir /sys/fs/cgroup/blkio/mygroup
   echo "8:0 1048576" > /sys/fs/cgroup/blkio/mygroup/blkio.throttle.write_bps_device
   echo <PID> > /sys/fs/cgroup/blkio/mygroup/tasks
   ```

   Aqui, `8:0` se refere ao dispositivo (por exemplo, `/dev/sda`), e `1048576` limita as operações de gravação a 1MB/s.

## Monitoramento

Além de limitar e controlar recursos, o cgroup também permite monitorar o uso de recursos. Por exemplo:

* Para verificar o uso atual da CPU de um grupo:

  ```bash
  cat /sys/fs/cgroup/cpu/mygroup/cpuacct.usage
  ```
* Para verificar o uso de memória:

  ```bash
  cat /sys/fs/cgroup/memory/mygroup/memory.usage_in_bytes
  ```

## Conclusão

O diretório `/sys/fs/cgroup/` é uma interface poderosa para gerenciar recursos no Linux. Com cgroups, você pode garantir que os recursos do sistema sejam utilizados de forma eficiente e que processos ou grupos de processos não monopolizem esses recursos, melhorando a estabilidade e previsibilidade do sistema.
