Dominando o cxl-cli: guia prático de gestão de memória CXL no Linux

      Roberto Xavier 9 min de leitura
      Dominando o cxl-cli: guia prático de gestão de memória CXL no Linux

      Aprenda a utilizar o cxl-cli para listar, provisionar e diagnosticar dispositivos de memória CXL no Linux. Um tutorial técnico focado em comandos, flags e topologia de hardware.

      Compartilhar:

      Esqueça o que você sabe sobre a rigidez dos slots DIMM. O Compute Express Link (CXL) transformou a memória em um recurso flexível, trafegando via PCIe, e o cxl-cli é a ferramenta que nos permite domar essa nova camada da infraestrutura.

      Se você administra servidores modernos, especialmente em cenários de In-Memory Database ou IA, já deve ter ouvido falar que a memória agora pode ser desacoplada da CPU. Mas como isso se traduz no terminal? Não existe mágica; existe o subsistema CXL do kernel Linux e um utilitário de espaço de usuário que expõe essa topologia complexa em formato JSON.

      Resumo em 30 segundos

      • O que é: O cxl-cli é a ferramenta padrão para gerenciar dispositivos de memória CXL (Type 3), permitindo criar regiões, configurar decodificadores e gerenciar namespaces.
      • Requisito: Exige Kernel Linux 6.x ou superior e o pacote ndctl (do qual o cxl-cli faz parte) para operar corretamente.
      • Fluxo: O hardware CXL aparece como um dispositivo "memdev". Você precisa alocar um "decoder", criar uma "region" e, frequentemente, converter o modo de operação de "devdax" para "system-ram" para que o OS o enxergue como memória utilizável.

      O Ecossistema: Kernel 6.x e a Herança do NVDIMM

      O cxl-cli não nasceu do zero. Ele é mantido dentro do projeto ndctl (Non-Volatile Device Control), a mesma suíte usada para gerenciar memórias persistentes (PMEM/Optane). Isso é intencional: o Linux trata a memória CXL de maneira muito similar a um NVDIMM, mas com volatilidade.

      Para começar, você precisa estar em um ambiente "bleeding edge" ou Enterprise Linux muito recente (RHEL 9.x, Ubuntu 24.04+). O suporte robusto a CXL, incluindo hot-plug e interleaving dinâmico, amadureceu significativamente a partir do Kernel 6.3.

      💡 Dica Pro: Antes de rodar qualquer comando, verifique se os módulos estão carregados: lsmod | grep cxl. Você deve ver cxl_pci, cxl_acpi e cxl_mem. Sem eles, o cxl-cli ficará mudo.

      Reconhecimento de Terreno: cxl list

      O comando base é o cxl list. Se você rodá-lo sem argumentos, provavelmente receberá um JSON vazio ou muito básico. A mágica acontece com as flags de verbosidade. O CXL é hierárquico: temos o Root Port, o Switch (opcional), o Endpoint (o dispositivo de memória) e os Decoders.

      Para ver tudo o que importa:

      cxl list -M -u -D
      

      Vamos dissecar as flags:

      • -M (Media): Mostra os dispositivos de memória física (memdevs). É aqui que você vê o hardware real, como um módulo Samsung ou SK Hynix CXL.

      • -u (Human readable): Converte tamanhos de bytes para GiB/TiB. Essencial para sanidade mental.

      • -D (Decoders): Exibe os decodificadores ativos. Sem um decoder configurado, a memória existe fisicamente, mas a CPU não sabe como endereçá-la.

      O output típico se parece com isto (simplificado):

      [
        {
          "memdev":"mem0",
          "ram_size":"64.00 GiB",
          "serial":"0x12345678",
          "host":"cxl_mem.0",
          "ports":[
            {
              "port":"port1",
              "decoders":[{"decoder":"decoder1.0"}]
            }
          ]
        }
      ]
      

      Aqui, mem0 é o seu dispositivo físico. Se ele não estiver associado a uma região ativa, ele é apenas um peso de papel caro conectado ao barramento PCIe.

      A topologia hierárquica do CXL: do Root Port ao Memdev, mapeada pelos comandos do cxl-cli. Figura: A topologia hierárquica do CXL: do Root Port ao Memdev, mapeada pelos comandos do cxl-cli.

      A Anatomia de um Dispositivo CXL (Type 3)

      No contexto de infraestrutura de storage e servidores, focamos quase exclusivamente no CXL Type 3. São expansores de memória. Eles não possuem cache coerente para a CPU (como o Type 2), mas funcionam como um banco massivo de RAM adicional.

      Para entender onde o CXL se encaixa, precisamos compará-lo com o que já usamos. Ele não substitui a DDR5 local; ele a complementa, preenchendo o abismo entre a RAM principal e o SSD NVMe mais rápido.

      Característica DDR5 (Local) CXL (Type 3) NVMe SSD
      Latência ~80-100 ns ~170-250 ns (aprox. 1 NUMA hop) ~10.000+ ns (10us)
      Capacidade Limitada pelos slots da MB Alta (TB+ via expansores PCIe) Muito Alta (PB)
      Acesso Byte-addressable (Load/Store) Byte-addressable (Load/Store) Block I/O (Read/Write)
      Persistência Volátil Volátil (geralmente) Persistente
      Custo/GB $$$$ $$$ $$

      Provisionando Memória: cxl create-region

      O hardware foi detectado. Agora precisamos criar uma Região. Uma região CXL é um intervalo de endereços físicos do sistema (HPA - Host Physical Address) mapeado para um ou mais dispositivos CXL.

      Se você tem apenas um cartão CXL, a criação é direta. Mas o poder real do CXL está no Interleaving. Assim como o RAID 0 em discos, podemos espalhar os dados por múltiplos cartões CXL para aumentar a largura de banda.

      O comando para criar uma região x4 (intercalada em 4 dispositivos) usando o decoder raiz decoder0.0:

      cxl create-region -d decoder0.0 -t ram -w 4 -m mem0 mem1 mem2 mem3
      
      • -d: Especifica o Root Decoder. Use cxl list -D para encontrar um disponível com max_available_extent suficiente.

      • -t ram: Define o tipo como volátil (RAM).

      • -w 4: Largura do interleave (ways).

      • -m: Lista os memdevs que farão parte dessa região.

      Se o comando for bem-sucedido, o cxl-cli retornará um JSON descrevendo a nova região (ex: region0). Neste momento, o kernel criou um dispositivo de caractere, geralmente /dev/dax0.0.

      ⚠️ Perigo: O alinhamento e a granularidade do interleave (IG) são críticos. Se o hardware (BIOS/Switch) não suportar a granularidade solicitada, a criação da região falhará. O cxl-cli tenta adivinhar os melhores padrões, mas verifique as specs do seu switch CXL.

      O Pulo do Gato: daxctl e System RAM

      Aqui é onde muitos administradores travam. Você criou a região, mas o comando free -h não mostra a memória extra. Por quê?

      Por padrão, regiões CXL criadas via cxl-cli operam no modo devdax (Device DAX). Isso permite que aplicações mapeiem a memória diretamente (ótimo para bancos de dados específicos que sabem falar com /dev/dax), mas o sistema operacional não a usa como RAM geral.

      Para entregar essa memória ao kernel como "System RAM", usamos o daxctl (o irmão do cxl-cli).

      1. Liste os dispositivos DAX:

        daxctl list
        
      2. Reconfigure para System RAM:

        daxctl reconfigure-device --mode=system-ram dax0.0
        

      Ao rodar isso, o kernel "online" os blocos de memória. Agora, um free -h deve mostrar o incremento na capacidade total.

      Convertendo o hardware bruto em recurso do sistema: o fluxo de reconfiguração de DAX para System RAM. Figura: Convertendo o hardware bruto em recurso do sistema: o fluxo de reconfiguração de DAX para System RAM.

      Validação e Topologia NUMA

      Memória CXL não é igual à memória local. Ela é mais lenta. O Kernel Linux lida com isso criando um Nó NUMA sem CPU (CPU-less node).

      Para validar se sua operação funcionou e entender a topologia resultante, use o numactl:

      numactl -H
      

      Você verá algo como:

      • Node 0: CPUs 0-31, Memória 128GB (DDR Local)

      • Node 1: CPUs (vazio), Memória 512GB (CXL)

      As distâncias (SLIT - System Locality Information Table) confirmarão a penalidade de latência. A distância de Node 0 para Node 0 pode ser 10, enquanto de Node 0 para Node 1 (CXL) pode ser 20 ou 25.

      💡 Dica Pro: Use numactl --membind=1 ./sua-aplicacao para forçar um processo a rodar usando apenas a memória CXL, ideal para testes de benchmark e validação de impacto de latência.

      Troubleshooting: Quando o Decoder Falha

      O erro mais comum ao tentar criar uma região é ENXIO ou "No such device", mesmo quando o dispositivo aparece na lista. Isso geralmente ocorre por conflito de decodificadores.

      O CXL usa decodificadores programáveis no Root Port. Se a BIOS do servidor já programou esses decodificadores durante o boot (para uso do firmware ou configuração estática), o Linux não pode reprogramá-los.

      1. Verifique o estado do decoder:

        cxl list -D
        

        Procure por "state":"enabled" ou "locked":true. Se estiver bloqueado, você não pode criar novas regiões dinamicamente nesse intervalo de endereços.

      2. Verifique os logs do kernel:

        dmesg | grep -i cxl
        

        Erros de "HPA collision" indicam que você está tentando criar uma região em um endereço físico que já está em uso ou reservado.

      O Futuro é Tierizado

      Dominar o cxl-cli hoje é como aprender fdisk nos anos 90. Estamos na infância da memória desagregada. Em breve, não gerenciaremos apenas expansão de capacidade, mas pools de memória compartilhada entre múltiplos hosts (CXL 3.0+). A ferramenta vai evoluir, mas os conceitos de decodificadores, regiões e namespaces vieram para ficar. Prepare seus scripts e monitore seus nós NUMA; a hierarquia de memória acabou de ficar mais profunda.

      O que é o cxl-cli e como ele se relaciona com o ndctl? O cxl-cli é a ferramenta de espaço de usuário para gerenciar dispositivos CXL (Compute Express Link). Ele compartilha a mesma base de código e estilo do ndctl (usado para NVDIMMs), permitindo gerenciar regiões, namespaces e decodificadores de memória CXL.
      É possível testar o cxl-cli sem hardware CXL físico? Sim, utilizando o QEMU. Versões recentes do QEMU suportam a emulação de dispositivos CXL Type 3, permitindo que administradores pratiquem os comandos de provisionamento e criação de regiões em um ambiente virtualizado antes de aplicar em hardware real.
      Qual a diferença entre usar CXL como 'System RAM' e 'devdax'? No modo 'System RAM', a memória CXL é adicionada ao pool de memória do sistema operacional (geralmente como um nó NUMA sem CPU). No modo 'devdax', ela aparece como um dispositivo de caractere (/dev/dax), permitindo que aplicações mapeiem a memória diretamente, ignorando certas estruturas do kernel para menor latência ou uso específico.
      #cxl-cli #compute express link #linux storage #memória cxl #ndctl #provisionamento de memória #sysadmin tools
      Roberto Xavier
      Assinatura Técnica

      Roberto Xavier

      Comandante de Incidentes

      "Lidero equipes em momentos críticos de infraestrutura. Priorizo a restauração rápida de serviços e promovo uma cultura de post-mortem sem culpa para construir sistemas mais resilientes."