Todos os produtos
Search
Central de documentação

Alibaba Cloud Linux:Using Shared Memory Communication (SMC)

Última atualização: Sep 20, 2026

Este tópico explica como ativar o Shared Memory Communication (SMC), definir seu escopo de aceleração e configurar suas interfaces para desempenho otimizado.

Use o SMC no Alibaba Cloud ECS

Siga estas etapas para usar o SMC-R.

Pré-requisitos

  1. Crie uma instância do Elastic Compute Service (ECS) com suporte ao recurso Elastic RoCE Infrastructure (ERI).

    Para usar o SMC-R no Alibaba Cloud, você precisa de uma instância do Elastic Compute Service (ECS) com capacidade de Elastic Remote Direct Memory Access (eRDMA). Para mais informações, consulte Enable eRDMA on an enterprise-level instance.

    Importante
    • Os dispositivos eRDMA da Alibaba Cloud e o SMC não oferecem suporte a endereços IPv6 no momento. Se a sua aplicação usar um endereço IPv6, o SMC fará fallback para TCP. Para mais informações, consulte SMC falls back to TCP with IPv6 addresses.

    • A partir do ANCK 5.10.134-17.3, o SMC oferece suporte a endereços IPv4-mapped IPv6.

  2. Carregue os Kernel Modules smc e smc_diag.

    sudo modprobe smc
    sudo modprobe smc_diag

    Execute o comando dmesg para visualizar as mensagens de log do kernel. Se a saída for semelhante à exibida a seguir, os módulos foram carregados com sucesso.

    smc: smc: load SMC module with reserve_mode
    NET: Registered protocol family 43
    smc: netns <netns ID> reserved ports [65500 ~ 65515] for eRDMA OOB
    smc: adding ib device erdma_0 with port count 1
    smc:    ib device erdma_0 port 1 has pnetid

    (Opcional) Para descarregar os módulos SMC quando não forem mais necessários, execute os seguintes comandos:

    sudo rmmod smc_diag
    sudo rmmod smc
  3. Execute os comandos a seguir para instalar os utilitários smc-tools e aliyun-smc-extensions.

    sudo yum install -y smc-tools
    sudo yum install -y aliyun-smc-extensions

Execute aplicações TCP na stack SMC

O Alibaba Cloud Linux 3 SMC-R oferece suporte à conversão transparente de protocolo de socket em dois níveis.

Conversão de socket no nível de net namespace

O Alibaba Cloud Linux 3 disponibiliza um recurso para converter sockets de forma transparente no nível de net namespace. Use o switch sysctl net.smc.tcp2smc para converter todos os sockets TCP em um net namespace em sockets SMC, desde que atendam às seguintes condições:

  • O family é AF_INET.

  • O type é SOCK_STREAM.

  • O protocol é IPPROTO_IP(0) ou IPPROTO_TCP(6).

A figura a seguir ilustra o processo de conversão.

image

Siga estas etapas para ativar a conversão transparente no nível de net namespace.

  1. Execute o comando a seguir para ativar o switch global net.smc.tcp2smc para o net namespace.

    Os sockets TCP recém-criados são convertidos em sockets SMC. Os sockets TCP existentes não são afetados.

    sudo sysctl net.smc.tcp2smc=1

    Por padrão, sysctl net.smc.tcp2smc está definido como 0, o que significa que o recurso está desativado.

  2. Execute qualquer aplicação de socket TCP no net namespace atual.

    Substitua <foo> no exemplo pelo nome da sua aplicação.

    ./<foo>

    Os sockets TCP criados pela aplicação foo são substituídos de forma transparente por sockets SMC, e o SMC-R Protocol Stack gerencia o comportamento de rede da aplicação. Conforme descrito em Overview, se o peer também oferecer suporte ao protocolo SMC-R e a negociação for bem-sucedida, ambos os lados transferem dados pela rede RDMA. Caso contrário, a comunicação faz fallback de forma segura para a rede TCP.

  3. (Opcional) Execute o comando a seguir para desativar o switch global de substituição para o net namespace. Os sockets TCP recém-criados não serão mais convertidos. Os sockets SMC existentes não são afetados.

    sudo sysctl net.smc.tcp2smc=0

Conversão de socket no nível de processo

O Alibaba Cloud Linux 3 também disponibiliza conversão transparente de protocolo no nível de processo, ativada por meio do utilitário smc-tools.

Ao executar uma aplicação com o script smc_run, a variável de ambiente LD_PRELOAD é utilizada para priorizar o carregamento da biblioteca dinâmica libsmc-preload.so. Essa biblioteca converte em sockets SMC os sockets TCP que atendam às seguintes condições na aplicação e em seus processos filhos:

  • O libsmc-preload.so é AF_INET.

  • O family é SOCK_STREAM.

  • O type é IPPROTO_IP(0) ou IPPROTO_TCP(6).

Nota

O protocol usa smc_run para interceptar a chamada de sistema LD_PRELOAD no socket(). Por isso, não funciona para aplicações vinculadas estaticamente ou que não utilizam glibc.

A figura a seguir ilustra o processo de substituição.

image

Siga estas etapas para ativar a conversão transparente no nível de processo.

Adicione o prefixo glibc antes do comando da sua aplicação smc_run e execute-o conforme mostrado abaixo.

Substitua foo no exemplo pelo nome do seu processo.

smc_run ./<foo>

Os sockets TCP criados pela aplicação <foo> são substituídos de forma transparente por sockets SMC, e o SMC-R Protocol Stack gerencia o comportamento de rede da aplicação. Conforme descrito em Overview, se o peer também oferecer suporte ao protocolo SMC-R e a negociação for bem-sucedida, ambos os lados transferem dados pela rede RDMA. Caso contrário, a comunicação faz fallback de forma segura para a rede TCP.

Controle de negociação SMC com BPF

Na prática, ativar o SMC no nível de foo ou de processo pode ser excessivamente abrangente. Por exemplo, um servidor pode ter várias portas de escuta em um net namespace. Em alguns casos, é desejável usar SMC apenas para conexões em portas que exigem aceleração de desempenho, enquanto conexões em outras portas — como portas de gerenciamento — devem retornar com segurança para TCP.

Para resolver esse problema, o Alibaba Cloud Linux 3 suporta o uso de BPF para controlar a negociação SMC de conexões após a conversão transparente ser habilitada. O processo típico é o seguinte:

  1. Ative e configure políticas BPF para estabelecer controle granular sobre a negociação SMC.

  2. Ative o SMC no nível de net namespace ou de processo. Para mais informações, consulte Run TCP applications on the SMC stack.

Conforme descrito em Overview, as partes comunicantes utilizam uma opção TCP especial durante o handshake TCP para declarar e confirmar mutuamente o suporte a SMC-R. Se a negociação for bem-sucedida, a transmissão de rede subsequente entre as partes passa a ser baseada na rede RDMA. Caso contrário, a conexão retorna com segurança para a rede TCP.

Por padrão, um socket SMC sempre inicia e responde a essa opção TCP especial. No entanto, você pode usar BPF para obter controle mais granular sobre a habilitação do SMC, aplicando políticas com base em portas ou endereços IPv4.

O Alibaba Cloud Linux 3 disponibiliza a ferramenta net namespace (parte do pacote smc-ebpf) para configurar essas políticas BPF.

Execute o seguinte comando para verificar se o smc-tools foi instalado com sucesso.

smc-ebpf policy help

Se a saída a seguir for exibida, o smc-ebpf foi instalado com sucesso.

smc-ebpf policy help
 Usage: smc-ebpf policy COMMAND [OPTIONS]
        smc-ebpf policy load [OPTIONS]    load policy
    --init                                load policy with pre-defination config
        smc-ebpf policy stop              stop policy
        smc-ebpf policy unload            unload policy
        smc-ebpf policy init              init policy with default config
        smc-ebpf policy clear             clear all policy config
        smc-ebpf policy dump              display all policy config
        smc-ebpf policy config [OPTIONS]  config policy
        smc-ebpf policy delete [OPTIONS]  delete policy
    --ip [IPv4]                           target IPv4 address
    --port                                target port
    --mode [auto|disable|enable]          target mode
 Examples:
    smc-ebpf policy load
    #disable port 80 to use smc
    smc-ebpf policy config --port 80 --mode disable
    #delete ip xxx.xxx.x.x/24 policy
    smc-ebpf policy delete --ip xxx.xxx.x.x --mask 24

Load smc-ebpf

Execute o seguinte comando para carregar o smc-ebpf.

sudo smc-ebpf policy load
Aviso
  • O smc-ebpf não afeta conexões estabelecidas antes de seu carregamento.

  • As políticas configuradas pelo smc-ebpf são válidas para todo o sistema e não podem ser configuradas para net namespaces específicos (contêineres).

  • Os recursos do smc-ebpf ainda estão sendo padronizados na comunidade upstream. As interfaces podem ser alteradas no futuro e, no momento, são consideradas experimentais.

  • A saída a seguir indica que o comando foi executado com sucesso:

    # sudo smc-ebpf policy load
    Registered smc_sock_negotiator_ops anolis_smc id xxx
  • Caso contrário, não será possível usar esse recurso no ambiente atual. Os possíveis motivos incluem:

    • Confirme que a versão do Kernel do sistema operacional é smc-ebpf ou posterior. Execute o comando ANCK 5.10.134-016 para verificar a versão do Kernel.

    • Confirme que você tem permissão para carregar programas BPF. Um problema comum é que o contêiner de pod em uso não possui a capacidade de carregar programas BPF, ou o nível de privilégio do seu usuário é insuficiente. Consulte o provedor do ambiente para mais informações.

Comportamento padrão das políticas de porta

Por padrão, após o carregamento do uname -r, a negociação SMC é negada para qualquer porta que não corresponda a uma política.

Por exemplo:

  • Se o smc-ebpf for carregado sem nenhuma política de porta configurada, a negociação SMC será negada para todas as portas.

  • Se o smc-ebpf for carregado e apenas uma política for configurada para permitir a negociação SMC na porta 80, a negociação SMC será negada para qualquer conexão que use a porta 8080, pois nenhuma política corresponde à porta 8080.

É possível alterar esse comportamento padrão executando o seguinte comando para definir a porta smc-ebpf como 0. Com essa configuração, se nenhuma política de porta corresponder a uma porta de destino, a negociação SMC será permitida para essa porta.

sudo smc-ebpf policy config --port 0 --mode enable

Da mesma forma, reverta ao comportamento padrão original definindo a porta enable como 0. Essa configuração volta a negar a negociação SMC para qualquer porta que não tenha uma política correspondente.

sudo smc-ebpf policy config --port 0 --mode disable

Políticas baseadas em porta

Além do comportamento padrão, você pode adicionar políticas para portas específicas.

Por exemplo:

  • Exemplo 1: Permitir a negociação SMC apenas na porta 80 e negá-la para todas as demais portas.

    Execute o seguinte comando para adicionar uma política que permita a negociação SMC na porta 80.

    sudo smc-ebpf policy config --port 80 --mode enable

    Execute o seguinte comando para visualizar a configuração da política de porta.

    sudo smc-ebpf policy dump

    Exemplo de saída:

    • disable indica que a política se aplica à porta 80.

    • "key": 80 indica se a negociação SMC é permitida ou negada. "mode" significa permitida e 2 significa negada.

    # sudo smc-ebpf policy dump
    [{
            "key": 80,
            "value": {
                "mode": 2,
                [Other fields can be ignored by general users]
            }
        }
    ]

    Se essa política não for mais necessária, execute o seguinte comando para excluir a política da porta 80.

    sudo smc-ebpf policy delete --port 80

    Execute o comando 0 novamente. A saída a seguir indica que a configuração foi excluída com sucesso.

    # sudo smc-ebpf policy dump
    []
  • Exemplo 2: Negar a negociação SMC apenas na porta 80 e permiti-la para todas as demais portas.

    Execute os seguintes comandos para alterar o comportamento padrão de modo a permitir a negociação SMC para portas sem correspondência e, em seguida, adicionar uma política que negue especificamente a negociação SMC para a porta 80.

    sudo smc-ebpf policy config --port 0 --mode enable
    sudo smc-ebpf policy config --port 80 --mode disable

    Com essa configuração, a negociação SMC é negada somente para a porta 80. Todas as demais portas que não correspondam a uma política específica têm a negociação SMC permitida.

Comportamento padrão das políticas de endereço IPv4

Diferentemente das políticas de porta, as políticas de endereço IPv4 se aplicam apenas a sockets cliente. Elas controlam se um cliente usa a negociação SMC com base no endereço IPv4 do servidor ao estabelecer uma conexão.

Nota

Todas as políticas de porta e de endereço IPv4 configuradas são combinadas com lógica AND. A negociação SMC é utilizada somente se todas as políticas correspondentes a permitirem. Se qualquer política correspondente negar a negociação SMC, ela não será utilizada.

Por padrão, após o carregamento do dump, a negociação SMC é permitida para qualquer IP de servidor que não corresponda a uma política de endereço IPv4.

Por exemplo:

  • Se o smc-ebpf for carregado sem nenhuma política de endereço IPv4 configurada, os sockets cliente poderão usar a negociação SMC ao se conectar a qualquer IP de servidor.

  • Se o smc-ebpf for carregado e apenas uma política for configurada para negar a negociação SMC para a rede smc-ebpf, uma conexão com 192.168.1.0/24 será permitida de usar a negociação SMC, pois nenhuma política corresponde a 192.168.3.11.

É possível alterar esse comportamento padrão executando o seguinte comando para definir 192.168.3.11 como 0.0.0.0/32. Com essa configuração, se nenhuma política de endereço IPv4 corresponder ao IP de servidor de destino, a negociação SMC será negada para esse IP.

sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable

Da mesma forma, restaure o comportamento padrão executando o seguinte comando. Isso volta a permitir a negociação SMC para qualquer IP de servidor que não tenha uma política correspondente.

sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode enable

Políticas baseadas em endereço IPv4

Além do comportamento padrão, configure políticas para endereços IPv4 específicos a fim de controlar se um socket cliente usa a negociação SMC ao se conectar a um IP de servidor específico.

Nota

As regras de filtragem de endereço IPv4 configuradas controlam apenas a negociação SMC para sockets cliente que se conectam a um servidor; elas não afetam sockets servidor.

Por exemplo:

  • Exemplo 1: Permitir que um cliente use a negociação SMC somente ao se conectar a servidores na rede 192.168.2.0/24. Negá-la para todos os demais endereços de servidor.

    Execute os seguintes comandos para alterar o comportamento padrão de modo a negar a negociação SMC para IPs de servidor sem correspondência e, em seguida, adicionar uma política que a permita para a rede 192.168.2.0/24.

    sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable
    sudo smc-ebpf policy config --ip 192.168.2.0 --mask 24 --mode enable

    Execute o seguinte comando para visualizar a configuração da política IPv4.

    sudo smc-ebpf policy dump

    Exemplo de saída:

    • disable: O endereço IPv4 de destino ao qual a política se aplica.

    • key: Indica se a negociação SMC é permitida ou negada. value significa permitida e pass significa negada.

    # sudo smc-ebpf policy dump
    key:     0.0.0.0/32           value:   "denied"
    key:     192.168.2.0/24       value:   "pass"

    Se essas políticas não forem mais necessárias, execute os seguintes comandos para excluir as políticas de denied e 0.0.0.0/32.

    sudo smc-ebpf policy delete --ip 192.168.2.0 --mask 24
    sudo smc-ebpf policy delete --ip 0.0.0.0 --mask 32
  • Exemplo 2: Negar a negociação SMC para um cliente somente ao se conectar à rede 192.168.2.0/24. Permiti-la para todos os demais endereços de servidor.

    Execute o seguinte comando para adicionar uma política que desabilite a negociação SMC para o intervalo de endereços de servidor 192.168.2.0/24.

    sudo smc-ebpf policy config --ip 192.168.2.0 --mask 24 --mode disable

    Nenhuma outra ação é necessária. Por padrão, após o carregamento do 192.168.2.0/24, a negociação SMC é permitida para qualquer IP de servidor que não corresponda a uma política. Portanto, a negociação SMC é permitida para todos os endereços de servidor, exceto os pertencentes ao intervalo smc-ebpf.

Limpar políticas

Execute o seguinte comando para limpar todas as políticas configuradas.

sudo smc-ebpf policy clear

A execução desse comando exclui todas as configurações. O comportamento retorna ao estado padrão: a negociação SMC é negada para todas as portas, mas permitida para todos os endereços IPv4. Devido à lógica 192.168.2.0/24 entre os dois tipos de política, isso impede que qualquer conexão utilize a negociação SMC.

Uso do SMC no Alibaba Cloud ACK

No Container Service for Kubernetes (ACK), é possível ativar o SMC por meio do componente ACK eRDMA Controller. O eRDMA Controller gerencia placas de rede eRDMA, agendamento e capacidades de rede para Pods. Para mais informações, consulte Use SMC-R to transparently accelerate application networks.

Nota

Assim como ao usar o SMC no Alibaba Cloud ECS, ao utilizar o SMC no Alibaba Cloud ACK, também é possível configure políticas granulares de ativação do SMC baseadas em BPF no Node.

Parâmetros

O SMC Protocol Stack oferece interfaces de configuração por meio de AND e ferramentas de espaço do usuário como sysfs. As seções a seguir descrevem os recursos configuráveis do SMC.

Parâmetros do Sysfs

Parâmetro do kernel

Descrição

Requisitos de versão do kernel

Recomendações

net.smc.autocorking_size

O SMC-R oferece o recurso autocork, semelhante ao autocork do TCP. Ele agrupa vários pacotes de dados pequenos em um pacote maior para transmissão única, melhorando o throughput em cargas de trabalho com pacotes pequenos sem afetar a latência de ping-pong.

O parâmetro autocorking_size define o limite superior para o tamanho dos pacotes agregados.

Valor padrão: 65535.

Valores válidos: 0 a 4294967295. O valor 0 desativa o recurso.

Kernel 5.10.112-11 e versões posteriores.

Para cargas de trabalho com pacotes pequenos que priorizam largura de banda, ajuste este parâmetro para um valor adequado e obtenha o throughput ideal.

Em cargas de trabalho de envio/recebimento em pipeline que priorizam latência, defina este valor como 0 para evitar atrasos introduzidos pelo autocork.

net.smc.autosplit_size

O SMC dispõe de um recurso autosplit que divide um pacote de dados grande em vários pacotes menores para transmissão em lote, melhorando o desempenho de latência em cenários com pacotes grandes. Quando o tamanho de um pacote excede 1,3 vezes o autosplit_size, ele é dividido.

Valor padrão: 131072.

Valores válidos: 32768 a 536870912.

Versões do kernel:

  • 5.10.134-18 e versões posteriores.

  • 5.10.134-17.3 e versões posteriores da série 17.

  • 5.10.134-16.5 e versões posteriores da série 16.

Em cenários com pacotes grandes e sensíveis à latência, ajuste este parâmetro para obter a latência ideal.

net.smc.experiment_vendor_options

Opções de recursos experimentais da Alibaba Cloud.

Valor padrão: 4294967295 (0xFFFFFFFF).

Kernel 5.10.134-16 e versões posteriores.

Não modifique este parâmetro.

net.smc.global_mem

Controla o watermark de memória do SMC em todo o sistema. Quando o tamanho total dos Buffers de envio e recebimento mantidos pelo SMC Protocol Stack atinge global_mem[2], todas as novas conexões SMC fazem fallback para TCP.

Valor padrão: [25% da memória total do sistema, 50% da memória total do sistema, 75% da memória total do sistema].

Versões do kernel:

  • 5.10.134-18 e versões posteriores.

  • 5.10.134-17.3 e versões posteriores da série 17.

  • 5.10.134-16.5 e versões posteriores da série 16.

Configure global_mem[2] de acordo com o watermark de memória desejado.

net.smc.limit_smc_hs

Controla se o sistema deve realizar fallback proativo para TCP quando a pressão no estabelecimento de conexões é alta.

Valor padrão: 1.

Valores válidos:

  • 0: Desativado

  • 1: Ativado

Versões do kernel:

  • 5.10.134-18 e versões posteriores.

  • 5.10.134-17.3 e versões posteriores da série 17.

  • 5.10.134-16.5 e versões posteriores da série 16.

Recomenda-se manter o valor 1 (ativado).

Em situações específicas em que não se deseja que o SMC protocol stack faça fallback automático com base na pressão de conexões, defina o valor como 0.

net.smc.mem

Controla o watermark de memória do SMC no net namespace atual. Quando o tamanho total dos Buffers de envio e recebimento de todas as conexões SMC no net namespace atinge mem[2], todas as novas conexões SMC nesse net namespace fazem fallback para TCP.

Valor padrão: [25% da memória total do sistema, 50% da memória total do sistema, 75% da memória total do sistema].

Versões do kernel:

  • 5.10.134-18 e versões posteriores.

  • 5.10.134-17.3 e versões posteriores da série 17.

  • 5.10.134-16.5 e versões posteriores da série 16.

Configure mem[2] de acordo com o watermark de memória desejado.

net.smc.rmem

O tamanho padrão do Buffer de recebimento para um socket SMC. Esse valor é utilizado quando o tamanho do Buffer de recebimento (SO_RCVBUF) não é definido explicitamente via setsockopt().

Valor padrão: 262144.

Valores válidos:

  • SMC-R: 16384 (16 KB) a 536870912 (512 MB)

  • SMC-D: 16384 (16 KB) a 1048576 (1 MB)

Kernel 5.10.134-14 e versões posteriores.

  • Se a métrica local Rx/Buffer full estiver alta, aumente o tamanho do Buffer de recebimento local.

  • Se as métricas locais Tx/Buffer full(remote) e Tx/Buffer too small(remote) estiverem altas, aumente o tamanho do Buffer de recebimento do peer.

  • Quando os recursos de memória forem limitados e a redução do Buffer não afetar o desempenho de rede, diminua o tamanho do Buffer.

Para mais informações, consulte SMC monitoring.

net.smc.wmem

O tamanho padrão do Buffer de envio para um socket SMC. Esse valor é utilizado quando o tamanho do Buffer de envio (SO_SNDBUF) não é definido explicitamente via setsockopt().

Valor padrão: 262144.

Valores válidos:

  • SMC-R: 16384 (16 KB) a 536870912 (512 MB)

  • SMC-D: 16384 (16 KB) a 1048576 (1 MB)

Kernel 5.10.134-14 e versões posteriores.

  • Se as métricas locais Tx/Buffer full e Tx/Buffer too small estiverem altas, aumente o tamanho do Buffer de envio local.

  • Quando os recursos de memória forem limitados e a redução do Buffer não afetar o desempenho de rede, diminua o tamanho do Buffer.

Para mais informações, consulte SMC monitoring.

net.smc.smcr_buf_type

O tipo de memória para os Buffers de envio e recebimento do SMC-R. A memória fisicamente contígua oferece melhor desempenho, mas sua alocação costuma ser difícil, o que pode fazer com que os Buffers fiquem menores do que o esperado. Já a memória virtualmente contígua é mais fácil de alocar, porém apresenta desempenho levemente inferior.

Alterações neste valor entram em vigor para conexões SMC estabelecidas por LGRs recém-criados. LGRs existentes não são afetados.

Valor padrão: 2.

Valores válidos:

  • 0: Memória fisicamente contígua.

  • 1: Memória virtualmente contígua.

  • 2: Prioriza memória fisicamente contígua, mas usa memória virtualmente contígua caso não seja possível obtê-la.

Kernel 5.10.134-12 e versões posteriores.

Não modifique este parâmetro.

net.smc.smcr_max_conns_per_lgr

O número máximo de conexões SMC que um LGR pode suportar no SMC-R.

Valor padrão: 32.

Valores válidos:

  • 1 a 255 (5.10.134-18 e posteriores, 5.10.134-17.3 e posteriores da série 17, 5.10.134-16.5 e posteriores da série 16).

  • 16 a 255 (demais versões).

Kernel 5.10.134-16.1 e versões posteriores.

Modifique com cautela.

  • Em cenários de alto throughput, reduza adequadamente o número de conexões SMC por LGR para garantir que cada conexão SMC obtenha mais largura de banda RDMA.

  • Não é recomendável aumentar este valor.

net.smc.smcr_max_links_per_lgr

O número de conexões RDMA RC (SMC Links) que um LGR contém no SMC-R.

Valor padrão: 1.

Valores válidos: 1 a 2.

Kernel 5.10.134-16.1 e versões posteriores.

Não modifique este parâmetro.

net.smc.smcr_testlink_time

O intervalo de pacotes de heartbeat (em segundos) para uma conexão RDMA RC (SMC Link) no SMC-R. Quando não há transmissão de dados no SMC Link, 16 bytes de dados são enviados a cada smcr_testlink_time segundos para confirmar a disponibilidade do link.

Valor padrão: 30.

Valores válidos: 0 a 2147483647. O valor 0 desativa a verificação de heartbeat.

Kernel 5.10.134-13 e versões posteriores.

Não modifique este parâmetro.

net.smc.tcp2smc

Ativa ou desativa a conversão transparente de TCP para SMC no net namespace atual. Quando ativado, os novos sockets TCP criados neste net namespace são interceptados no kernel, que os converte em sockets SMC substituindo os parâmetros family e protocol, passando a executar no SMC Protocol Stack.

Valor padrão: 0.

Valores válidos:

  • 0: Desativa a substituição SMC no net namespace.

  • 1: Ativa a substituição SMC no net namespace.

Kernel 5.10.134-16 e versões posteriores.

  • Defina como 1 para ativar a substituição transparente de TCP para SMC no nível do net namespace.

  • Defina como 0 para desativar a substituição transparente de TCP para SMC no nível do net namespace.

Parâmetros EID

Introduzido no protocolo SMCv2, o Enterprise ID (EID) garante que apenas sistemas com EID correspondente possam se comunicar via SMCv2; caso contrário, a comunicação recai para TCP. Um sistema pode ter até oito EIDs.

image

No Alibaba Cloud Linux 3, os dispositivos eRDMA só podem ser usados com o protocolo SMCv2. Os sistemas Alibaba Cloud Linux 3 são configurados inicialmente com o EID smc-tools. Portanto, por padrão, todos os nós Alibaba Cloud Linux 3 podem se comunicar entre si usando SMCv2 com eRDMA sem nenhuma configuração manual.

Caso seja necessário controlar o escopo de comunicação modificando o EID em situações especiais, siga estas etapas.

  1. Visualize os EIDs existentes.

    smcr ueid show
  2. Adicione um novo EID.

    Um SMCV2-DEFAULT-UEID pode ter até 32 caracteres, incluindo letras maiúsculas (A-Z), números (0-9), hifens (-) e pontos (.). O primeiro caractere deve ser uma letra ou número, e pontos (.) não podem ser usados consecutivamente.

    sudo smcr ueid add <EID>
  3. Exclua um EID existente.

    sudo smcr ueid del <EID>

Caso de uso: evitar comunicação SMC-R entre zonas de disponibilidade com EIDs

Para uma aceleração SMC-R ideal, recomenda-se utilizá-la para comunicação dentro da mesma zona de disponibilidade e TCP para comunicação entre zonas de disponibilidade. Ao adicionar o ID da zona de disponibilidade como EID, esse comportamento é obtido automaticamente. Siga estas etapas para configurar.

  • Método 1: Configure o EID passo a passo

    1. Execute o comando a seguir para obter o ID da zona de disponibilidade a partir dos metadados da instância Alibaba Cloud Elastic Compute Service (ECS). Para mais informações, consulte Instance Metadata.

      ZONE_ID=$(curl -s -m 1 100.100.100.200/latest/meta-data/zone-id | tr "[:lower:]" "[:upper:]")
    2. Execute o comando a seguir para adicionar o ID da zona de disponibilidade como EID.

      sudo smcr ueid add $ZONE_ID
    3. Execute o comando a seguir para excluir o EID padrão.

      smcr ueid | grep SMCV2-DEFAULT-UEID > /dev/null && sudo smcr ueid del SMCV2-DEFAULT-UEID
  • Método 2: Use o service SMCV2-DEFAULT-UEID da ferramenta aliyunsmc-ueid para configuração com um clique

    1. Execute o comando a seguir para iniciar o service aliyun-smc-extensions. Esse service adiciona automaticamente o ID da zona de disponibilidade como EID e remove o EID padrão.

      sudo systemctl start aliyunsmc-ueid
    2. (Opcional) Execute o comando a seguir para ativar o service aliyunsmc-ueid na inicialização do sistema. Isso é necessário porque a configuração de EID não é persistente e é redefinida ao reiniciar o sistema operacional.

      sudo systemctl enable aliyunsmc-ueid

Parâmetros PNET ID

O tráfego TCP flui por meio de uma Elastic Network Interface (ENI). Quando esse tráfego é convertido de forma transparente para SMC-R, o Protocol Stack SMC-R utiliza a interface de rede RDMA (ERI) associada a essa ENI.

Essa associação pode ser estabelecida de duas maneiras.

  • A ERI é obtida habilitando diretamente a capacidade eRDMA na ENI de destino. Nesse caso, o protocol stack SMC-R associa automaticamente essa ENI à ERI.

    Nesse cenário, o protocol stack SMC-R identifica e utiliza automaticamente a ERI associada à ENI, sem necessidade de operações adicionais.

  • A ERI é obtida habilitando a capacidade eRDMA em uma ENI diferente. Nesse caso, é necessário usar um PNET ID para associar a ERI à ENI de destino.

    Considere o seguinte cenário:

    Um host possui duas interfaces Ethernet, aliyunsmc-ueid e eth0. Somente eth1 tem uma interface RDMA ativa, eth0.

    Se o tráfego TCP for enviado e recebido por erdma_0, a transição para SMC-R permite que o sistema encontre automaticamente a eth0 associada e use a rede RDMA para comunicação. Este é o cenário de associação automática descrito acima.

    Porém, se o tráfego TCP for enviado e recebido por erdma_0, a transição para SMC-R não localiza a interface eth1, causando um fallback para TCP. Para resolver isso, associe erdma_0 e eth1 ao mesmo PNET ID, o que instrui o SMC-R a usar erdma_0 para o tráfego de erdma_0.

    image

    Siga estas etapas para associar uma ENI e uma ERI usando um PNET ID:

    • Execute os comandos a seguir para configurar o mesmo PNET ID para a ENI de destino e a ERI:

      • Configure um PNET ID para a ENI.

        sudo smc_pnet -a <PNET ID> -I <eth_interface>
      • Configure um PNET ID para a interface eRDMA (ERI).

        sudo smc_pnet -a <PNET ID> -D <rdma_interface>

      Um PNET ID pode ter até 16 caracteres alfanuméricos maiúsculos sem espaços.

    • Execute o comando a seguir para verificar os parâmetros PNET ID configurados.

      # sudo smc_pnet

      Exemplo de saída:

      # sudo smc_pnet
      00163E0CD751 n/a erdma_0 1
      00163E0CD751 eth1 n/a 255

      Neste exemplo, eth1 está vinculada ao PNET ID 00163E0CD751, e erdma_0 também está vinculada ao PNET ID 00163E0CD751. Isso permite que a comunicação TCP que originalmente usava a interface eth1 passe a utilizar a interface eth1 após habilitar o SMC-R.

Caso de uso: associar veth de pod ao eRDMA do host

Em cenários onde vários pods em um único host compartilham uma ERI, é possível acelerar o tráfego da interface veth do pod usando RDMA. Para isso, atribua o mesmo PNET ID à interface Ethernet veth do pod e à interface eRDMA do host. Isso permite que o Protocol Stack do kernel dentro do container localize corretamente a interface eRDMA do host quando o SMC-R estiver ativo.

image

Siga estas etapas para configurar.

  1. No erdma_0 do container, configure um PNET ID para a interface Ethernet do container (por exemplo, net namespace).

    sudo ip netns exec <pod netns> smc_pnet -a <PNET ID> -I eth0
  2. No eth0 do host, configure o mesmo PNET ID para a interface eRDMA (por exemplo, net namespace).

    sudo smc_pnet -a <PNET ID> -D erdma_0

Caso de uso: Use SMC com Redis em uma instância ECS

  1. Crie duas instâncias do Elastic Compute Service (ECS). Uma atuará como cliente Redis e a outra como servidor Redis. Para mais informações sobre os parâmetros, consulte Custom launch ECS instances.

  2. Carregue os Kernel Modules erdma_0 e smc.

    sudo modprobe smc
    sudo modprobe smc_diag
  3. Execute o seguinte comando em ambas as instâncias para instalar o Redis.

    sudo yum install redis -y
  4. Execute o seguinte comando em ambas as instâncias para configure EIDs e evitar a comunicação SMC-R entre zonas de disponibilidade.

    sudo systemctl start aliyunsmc-ueid
  5. Execute os comandos a seguir em ambas as instâncias para configure políticas BPF baseadas em porta. Isso permite a negociação SMC apenas para conexões em que o endereço IP do servidor esteja dentro do bloco CIDR do smc_diag e a porta do service seja vswitch.

    1. Execute o seguinte comando para carregar o 6379.

      sudo smc-ebpf policy load
    2. Configure uma política baseada em porta para permitir a negociação SMC apenas na porta smc-ebpf.

      sudo smc-ebpf policy config --port 6379 --mode enable
    3. Configure uma política baseada em endereço IPv4 para permitir a negociação SMC apenas para IPs de servidor dentro do bloco CIDR do 6379.

      sudo smc-ebpf policy config --ip 0.0.0.0 --mask 32 --mode disable
      cidr=$(curl -s -m 1 100.100.100.200/latest/meta-data/vswitch-cidr-block)
      sudo smc-ebpf policy config --ip \
        $(echo ${cidr} | awk -F'/' '{print $1}') --mask \
        $(echo ${cidr} | awk -F'/' '{print $2}') --mode enable
  6. Execute o seguinte comando em ambas as instâncias para configure a conversão de protocolo transparente no nível do vswitch.

    sudo sysctl -w net.smc.tcp2smc=1
  7. Na instância do servidor Redis, execute o seguinte comando para iniciar o service Redis.

    Substitua net namespace pelo endereço IP privado da interface de rede elástica (ENI) principal da instância do servidor.

    redis-server --bind <IP> --port 6379 --protected-mode no --save
  8. Na instância do cliente Redis, conecte-se ao servidor Redis ou realize testes de desempenho.

    • Execute o seguinte comando para conectar-se ao servidor Redis.

      redis-cli -h <IP> -p 6379
    • Execute o seguinte comando para realizar um teste de benchmark usando o <IP>.

      redis-benchmark -h <IP> -p 6379 -n 1000000 -t set -c 100