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.
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 vercxl_pci,cxl_acpiecxl_mem. Sem eles, ocxl-clificará 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.
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. Usecxl list -Dpara encontrar um disponível commax_available_extentsuficiente.-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-clitenta 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).
Liste os dispositivos DAX:
daxctl listReconfigure 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.
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-aplicacaopara 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.
Verifique o estado do decoder:
cxl list -DProcure por
"state":"enabled"ou"locked":true. Se estiver bloqueado, você não pode criar novas regiões dinamicamente nesse intervalo de endereços.Verifique os logs do kernel:
dmesg | grep -i cxlErros 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.
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."