Todos os produtos
Search
Central de documentação

Server Load Balancer:Prática de roteamento com base em carga

Última atualização: Aug 27, 2026

Neste tutorial, você configure o roteamento com base em carga no Application Load Balancer (ALB) Extensible Edition para otimizar a distribuição de tráfego de um service de inferência de IA generativa. Ao coletar métricas de backend em tempo real, como tamanho da fila de requisições, utilização de cache da GPU e quantidade de requisições em execução, o ALB encaminha as requisições para réplicas menos carregadas. Isso reduz a latência de inferência e melhora o throughput geral.

Cenários

O roteamento com base em carga é adequado para cenários em que as instâncias de backend apresentam diferenças significativas de carga, custos de requisição desiguais e alta sensibilidade à latência. Os casos típicos incluem:

  • Serviços de inferência de IA generativa — As requisições de inferência de LLM variam muito em custo. A memória da GPU, a utilização do cache KV e o status da fila flutuam em tempo real entre as instâncias. O roteamento com base em carga distribui as requisições para instâncias menos ocupadas, evitando acúmulo em instâncias sobrecarregadas e reduzindo o tempo até o primeiro token (TTFT) e a latência de cauda.

  • Carga de backend desigual — Tarefas individuais de alto custo podem sobrecarregar algumas instâncias, degradando o desempenho quando se usam algoritmos de agendamento estático. O roteamento com base em carga detecta a carga em tempo real e evita dinamicamente as instâncias mais ocupadas, melhorando a latência de cauda causada pelo desequilíbrio.

  • Clusters de inferência elástica de alta concorrência — Quando os backends são réplicas de inferência implantadas em lote em clusters de contêineres ACK ou ACS, o roteamento com base em carga otimiza a distribuição de requisições sob alta pressão geral do cluster. Isso reduz filas extremas e melhora o throughput global.

Arquitetura

Após as requisições do cliente chegarem à instância do ALB Extensible Edition, as regras de encaminhamento direcionam o tráfego para um grupo de servidores associado a um componente de roteamento com base em carga. Os nós de encaminhamento do ALB coletam periodicamente métricas em tempo real de cada backend no grupo de servidores. O componente de roteamento com base em carga pontua e classifica os backends com base nessas métricas, preferindo aqueles com menor carga (melhor pontuação). Quando vários backends têm pontuações ótimas semelhantes, o agendamento secundário utiliza o algoritmo weighted round-robin (WRR).

image
  • Instância do ALB Extensible Edition — Fornece balanceamento de carga e encaminhamento de tráfego. Os nós de encaminhamento também lidam com a coleta de métricas do backend.

  • Grupo de servidores — Suporta server type e IP type, podendo incluir backends de contêineres ACK ou ACS. O algoritmo de agendamento deve ser definido como weighted round-robin e o grupo deve estar associado a uma Service Extension que contenha o componente de roteamento com base em carga.

  • Service Extension — Hospeda o componente de roteamento com base em carga. Entra em vigor após a vinculação a um grupo de servidores.

  • Componente de roteamento com base em carga — Plugin integrado à cadeia de encaminhamento do ALB. Ele pontua e classifica os backends com base nas métricas coletadas pelos nós de encaminhamento e seleciona o backend ideal para o agendamento.

  • Serviço de inferência de backend — Expõe métricas de inferência no formato Prometheus (atualmente suporta o framework vLLM) para coleta pelo ALB.

Princípios de agendamento

  1. Coleta de métricas — Os nós de encaminhamento enviam periodicamente requisições HTTP para o caminho de coleta do backend (padrão /metrics) para obter métricas. O canal de coleta é independente do canal de health check. Se a coleta de métricas falhar para um backend específico, esse backend será removido do agendamento. Se a coleta falhar para todos os backends, o sistema retornará ao weighted round-robin.

  2. Pontuação e classificação — Cada métrica de pontuação é normalizada no conjunto de backends, ponderada e somada conforme os pesos configurados para produzir uma pontuação de carga para cada backend. Valores menores indicam backends mais ociosos; portanto, aqueles com melhores pontuações são selecionados primeiro.

  3. Agendamento secundário — Se os resultados da classificação contiverem vários backends com pontuações ótimas semelhantes (sobrepostas), o weighted round-robin selecionará entre esses backends com base no peso. Caso não haja sobreposição, o sistema selecionará diretamente o backend com a melhor pontuação.

O roteamento com base em carga suporta as seguintes métricas de decisão por padrão:

Métrica

Tipo

Descrição

Métrica vLLM

TotalQueuedRequests (tamanho da fila de requisições)

Gauge

Número de requisições atualmente na fila aguardando processamento.

vllm:num_requests_waiting

KVCacheUtilization (utilização de cache da GPU)

Gauge

Percentual atual de utilização do cache KV usado para armazenar resultados intermediários de inferência.

vllm:gpu_cache_usage_perc

RunningRequests (quantidade de requisições em execução)

Gauge

Número de requisições sendo processadas no momento.

vllm:num_requests_running

Pré-requisitos

  • Você obteve ALB Extensible Edition public preview access.

  • Você criou uma VPC (VPC1) na região China (Shanghai), com o vSwitch VSW1 na Zona B e o vSwitch VSW2 na Zona F.

  • Você criou um cluster ACK com nós GPU na VPC1 e implantou um service de inferência que expõe métricas no formato Prometheus. Este tópico usa o modelo DeepSeek-R1-Distill-Qwen-1.5B implantado com vLLM como exemplo. O service escuta na porta 8000 e expõe as métricas em /metrics.

Procedimento

1. (Opcional) Implante um service de inferência de amostra

Esta etapa fornece um service de inferência vLLM de amostra que expõe métricas Prometheus (usa DeepSeek-R1-Distill-Qwen-1.5B como exemplo, com o tipo de instância ECS ecs.gn7i-c16g1.4xlarge). Esse service é usado para coleta de métricas e agendamento do roteamento com base em carga nas etapas subsequentes. A seção de teste de verificação também usa este modelo de amostra para benchmarking. Se você já implantou um service de inferência conforme descrito na seção de pré-requisitos, pule esta etapa. Você também pode consultar Deploy a Qwen large model inference service.

  1. Prepare o modelo e configure os volumes de armazenamento. Após baixe o modelo e fazer upload dele para o OSS, consulte Configure OSS storage volumes para configurar PV e PVC (como example-oss-swap) para o cluster. O service de inferência montará esses volumes para acessar o modelo. Armazenar o modelo no OSS e baixá-lo via rede interna evita o longo tempo necessário para downloads pela rede pública.

    # 1. Download the model
    GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B.git
    cd DeepSeek-R1-Distill-Qwen-1.5B
    git lfs pull
    
    # 2. Upload the model to OSS
    ossutil mkdir oss://<Your-Bucket-Name>/DeepSeek-R1-Distill-Qwen-1.5B
    ossutil cp -r ./DeepSeek-R1-Distill-Qwen-1.5B oss://<Your-Bucket-Name>/DeepSeek-R1-Distill-Qwen-1.5B
  2. Crie um Deployment e um Service para o service de inferência no cluster ACK. A configuração abaixo inicia um service de inferência usando vLLM e declara anotações de coleta do Prometheus no Pod, expondo /metrics da porta 8000 como endpoint de métricas.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: deepseek-r1-distill-qwen-1.5b
      name: deepseek-r1-distill-qwen-1.5b
      namespace: default
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: deepseek-r1-distill-qwen-1.5b
      template:
        metadata:
          labels:
            app: deepseek-r1-distill-qwen-1.5b
          annotations:
            prometheus.io/path: /metrics
            prometheus.io/port: "8000"
            prometheus.io/scrape: "true"
        spec:
          volumes:
            - name: model
              persistentVolumeClaim:
                claimName: example-oss-swap
            - name: dshm
              emptyDir:
                medium: Memory
                sizeLimit: 30Gi
          containers:
          - command:
            - sh
            - -c
            - vllm serve /models/DeepSeek-R1-Distill-Qwen-1.5B --port 8000 --trust-remote-code --served-model-name deepseek-r1-distill-qwen-1.5b --gpu-memory-utilization 0.95 --enforce-eager
            image: registry-cn-hangzhou.ack.aliyuncs.com/dev/vllm:0.10.0
            env:
            - name: SAFETENSORS_FAST_GPU_TRANSFER
              value: "0"
            - name: SAFETENSORS_MAX_HEADER_LENGTH
              value: "10000000"
            name: vllm
            ports:
            - containerPort: 8000
            readinessProbe:
              tcpSocket:
                port: 8000
              initialDelaySeconds: 30
              periodSeconds: 30
            resources:
              limits:
                nvidia.com/gpu: "1"
            volumeMounts:
              - mountPath: /models/
                name: model
              - mountPath: /dev/shm
                name: dshm
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: deepseek-r1-distill-qwen-1-5b-v1
    spec:
      type: ClusterIP
      ports:
      - port: 8000
        protocol: TCP
        targetPort: 8000
      selector:
        app: deepseek-r1-distill-qwen-1.5b
  3. Depois que os Pods estiverem prontos, execute exec em qualquer Pod para verifique se o endpoint de métricas está exposto corretamente. A resposta deve conter métricas como vllm:num_requests_waiting, vllm:gpu_cache_usage_perc e vllm:num_requests_running.

    curl http://<Pod-IP>:8000/metrics

2. Crie uma instância do ALB Extensible Edition

  1. Faça logon no console do ALB. Selecione a região China (Shanghai) e clique em Create ALB.

  2. Na página de compra, conclua a seguinte configuração e clique em Create Now.

    • Region: Selecione China (Shanghai).

    • Instance Network Type: Selecione Internet.

    • VPC e Zone: Selecione VPC1, marque Shanghai Zone B e Shanghai Zone F e selecione VSW1 e VSW2.

    • IP Version: Selecione IPv4.

    • Edition (Instance Fee): Selecione Extensible Edition.

  3. Na página Confirm Order, confirme os detalhes da configuração da instância e clique em Activate Now.

3. Crie uma Service Extension e adicione o componente de roteamento com base em carga

As requisições de coleta de métricas são enviadas via HTTP 1.1 usando apenas endereços IPv4. Backends IPv6 não são suportados. O corpo da resposta de coleta de métricas para um único backend é limitado a 10 KB por padrão. Coloque as métricas necessárias (vllm:num_requests_waiting, vllm:gpu_cache_usage_perc, vllm:num_requests_running) nos primeiros 10 KB da saída de métricas. Para mais detalhes, consulte Limits.

  1. No console da Service Extension, clique em Create Service Extension. Na seção Service Extension Configuration, insira um Extension name como ext-load-aware-routing.

  2. O Extension Type é definido como Plug-in por padrão. No menu suspenso Component name, selecione Load-Aware Routing. Conclua a seguinte configuração e clique em Create.

    • Collection Configuration:

      • Host: Valor do cabeçalho de requisição Host para requisições de coleta de métricas. Deixe este campo vazio neste exemplo. Assim, o sistema usará o IP:Port de cada backend no grupo de servidores para a coleta.

      • Path: Caminho da requisição para coleta de métricas. Este exemplo usa /metrics.

      • Response Timeout: O padrão é 5 segundos.

      • Interval: Defina como 1 segundo.

    • Metric Configuration: Selecione todas as três opções: Total Queued Requests, GPU Cache Utilization e Running Requests. Defina os pesos como 100, 90 e 80, respectivamente.

O componente de roteamento com base em carga deve ser usado com um grupo de servidores do tipo Server ou IP Address , e não pode ser adicionado à mesma Service Extension que outros componentes.

4. Crie um grupo de servidores e associe a Service Extension

Crie um grupo de servidores para hospedar as réplicas de inferência de backend e associe-o à Service Extension de roteamento com base em carga criada na Etapa 3.

  1. No console do Grupo de Servidores, selecione a região China (Shanghai). Clique em Create Server Group, conclua a seguinte configuração e clique em Create.

    • Server Group Type: Selecione IP Address.

    • Server Group Name: Insira um nome personalizado, como sgp-load-aware.

    • VPC: Selecione VPC1.

    • Scheduling Algorithm: Use o padrão Weighted Round-robin. O roteamento com base em carga só suporta combinação com weighted round-robin.

    • Desative o Health Check.

      Neste exemplo, os Pods de backend não fornecem a interface necessária para health checks do ALB. Se os health checks estiverem ativados, os backends serão considerados não saudáveis e o roteamento com base em carga será ignorado. Se seus backends fornecerem uma interface de health check, mantenha os health checks ativados. Não é recomendado desativar.
      A coleta de métricas no roteamento com base em carga possui detecção de atividade integrada: backends dos quais não é possível coletar métricas são removidos automaticamente, oferecendo capacidade semelhante aos health checks.
    • Marque a caixa de seleção For Extensible instances na parte inferior da página. Ative Associate Service Extension e Use Existing Service Extension. Selecione a ext-load-aware-routing criada na Etapa 3.

  2. Após a mensagem Server Group Created, clique em Add Backend Servers. No painel Add Backend Server, adicione os endereços dos Pods do service de inferência implantado (obtidos em lista de clusters ACK > Details > Network > Services). Clique em Add IP Address para adicionar várias entradas e clique em Next.

  3. Na etapa Ports/Weights, defina Port como 8000, mantenha o Weight no valor padrão e clique em OK.

5. Crie um listener

  1. No console do ALB, clique no ID da instância alvo para ir à página Instance Details. Na aba Listener, clique em Create Listener.

  2. Na etapa Configure Listener, defina Listener Protocol como HTTP e Listener Port como 80. Em Advanced Settings, defina Connection Request Timeout como 3600 segundos. Em seguida, clique em Next.

    Este exemplo usa um listener HTTP para simplificar a configuração e focar na verificação do efeito de agendamento do roteamento com base em carga. Em um ambiente de produção, use um listener HTTPS com certificados configurados para segurança de transporte.
    Requisições de inferência de LLM (especialmente ao gerar muitos tokens de saída) podem levar muito tempo por resposta. Se o tempo de resposta exceder o timeout de requisição padrão do listener (60 segundos), as requisições serão encerradas prematuramente. Este exemplo define o timeout de requisição como 3600 segundos para evitar que respostas longas sejam interrompidas. Ajuste esse valor com base na duração real das suas requisições.
  3. Na etapa Select Server Group, selecione o grupo de servidores sgp-load-aware criado na Etapa 4. Em seguida, clique em Next.

  4. Na etapa Configuration Review, confirme a configuração e clique em Submit.

6. Configure a resolução de DNS

Aponte seu domínio personalizado para o nome DNS da instância ALB por meio de um registro CNAME para que os clientes possam acessar o ALB através do seu domínio personalizado.

Este exemplo usa o Alibaba Cloud DNS. Para domínios não registrados no Alibaba Cloud, você deve primeiro add the domain to the DNS console.

  1. No console do ALB, copie o Domain Name da instância alvo.

  2. Faça logon no console do DNS. Na coluna Actions do domínio alvo, clique em Settings. Na página Settings, clique em Add Record.

  3. Adicione um registro CNAME com as seguintes informações e clique em OK.

    • Record Type: Selecione CNAME.

    • Hostname: Insira um prefixo de domínio como test. Se seu domínio raiz for example.com, o domínio para acessar o ALB será test.example.com.

    • Query Source e TTL: Mantenha os valores padrão.

    • Record Value: Insira o nome DNS da instância ALB.

  4. Na caixa de diálogo Change Resource Record Confirmation exibida, confirme as informações de resolução e clique em OK.

7. Teste de verificação

Use a ferramenta de benchmarking vllm bench serve para execute um teste de estresse nos backends. Para evitar interferências da largura de banda da rede pública, latência e jitter nos resultados do teste, este exemplo executa o benchmark a partir de um ambiente de rede interna na mesma VPC do ALB. Um Pod dedicado de benchmark é implantado (com apenas a ferramenta vLLM instalada e o mesmo modelo montado, sem iniciar o service de inferência) como cliente de teste, separado dos backends testados, para evitar consumo de recursos de inferência ou interferência na coleta de métricas.

Ao definir uma meta de concorrência muito superior ao limite de desempenho do service, as GPUs do backend operam sob carga extrema. Isso valida se o roteamento com base em carga consegue otimizar a distribuição de requisições, reduzir filas extremas e acelerar o throughput geral.

Encaminhamento via Kubernetes Service

Execute o benchmark contra o Kubernetes Service do service de inferência de backend. O Service distribui conexões igualmente entre todas as réplicas de inferência sem detectar a carga em tempo real.

Substitua --host pelo ClusterIP do Service (obtido em lista de clusters ACK > Details > Network > Services).

vllm bench serve \
  --backend vllm \
  --model /models/DeepSeek-R1-Distill-Qwen-1.5B \
  --served-model-name deepseek-r1-distill-qwen-1.5b \
  --trust-remote-code \
  --dataset-name random \
  --random-prefix-len 1000 \
  --random-input-len 3000 \
  --random-output-len 3000 \
  --random-range-ratio 0.2 \
  --num-prompts 3000 \
  --max-concurrency 600 \
  --host <Service-ClusterIP> \
  --port 8000 \
  --endpoint /v1/completions \
  --save-result \
  2>&1 | tee benchmark_svc.txt

Roteamento com base em carga do ALB

Execute o benchmark contra a instância ALB. O roteamento com base em carga agenda requisições nas mesmas réplicas de inferência com base na carga em tempo real.

Substitua --host pelo endereço IP virtual (VIP) da instância ALB (obtido na página do product da instância). Mantenha todos os outros parâmetros iguais.

vllm bench serve \
  --backend vllm \
  --model /models/DeepSeek-R1-Distill-Qwen-1.5B \
  --served-model-name deepseek-r1-distill-qwen-1.5b \
  --trust-remote-code \
  --dataset-name random \
  --random-prefix-len 1000 \
  --random-input-len 3000 \
  --random-output-len 3000 \
  --random-range-ratio 0.2 \
  --num-prompts 3000 \
  --max-concurrency 600 \
  --host <ALB-VIP> \
  --port 80 \
  --endpoint /v1/completions \
  --save-result \
  2>&1 | tee benchmark_alb.txt

A comparação das principais métricas entre as duas abordagens é apresentada a seguir. Os dados abaixo são do ambiente de teste deste exemplo e servem apenas como referência. Os resultados reais dependem do seu próprio ambiente.

Métrica

Encaminhamento via Kubernetes Service

Roteamento com base em carga do ALB

P99 TTFT (ms)

71.872,40

60.504,53

Média TTFT (ms)

12.709,49

12.043,91

Mediana TTFT (ms)

7.156,46

5.492,57

Throughput total de tokens (tokens/s)

18.285,60

18.784,43

Duração do benchmark (segundos)

959,95

935,97

Com o mesmo número de backends, o roteamento com base em carga reduz significativamente o tempo até o primeiro token (TTFT) ao agendar preferencialmente requisições para réplicas menos carregadas. Neste teste, o P99 TTFT diminuiu aproximadamente 16% e a Mediana TTFT diminuiu cerca de 23%, enquanto o throughput geral melhorou ligeiramente e a distribuição de latência das requisições tornou-se mais estável.

Mais informações

Faturamento

  • ALB Extensible Edition — Atualmente em public preview e disponível gratuitamente.

  • Cluster ACK e instâncias GPU — O service de inferência de backend é executado em nós GPU em um cluster ACK. O faturamento segue as regras de preços correspondentes de Container Service e ECS instance. Se criados para fins de teste, use instâncias de pagamento conforme o uso e libere-as prontamente.

  • Taxas de domínio e resolução de DNS público — Além das taxas de domínio do seu provedor de domínios, a configuração de resolução de DNS público no Alibaba Cloud incorre em public authoritative resolution fees.

Limites

  • As requisições de coleta de métricas são enviadas usando HTTP 1.1 sobre endereços IPv4. Backends IPv6 não são suportados atualmente.

  • O corpo da resposta de coleta de métricas para um único backend é limitado a 10 KB por padrão. Conteúdo que exceder esse limite é descartado, o que pode causar coleta incompleta de métricas. O roteamento com base em carga usa apenas três métricas: vllm:num_requests_waiting, vllm:gpu_cache_usage_perc e vllm:num_requests_running. Coloque essas métricas nos primeiros 10 KB da saída de métricas para garantir que sejam coletadas adequadamente.

FAQ

Após ativar o roteamento com base em carga, a distribuição de requisições continua igual ao weighted round-robin?

Verifique as seguintes configurações:

  • Algoritmo de agendamento — O algoritmo de agendamento do grupo de servidores está definido como weighted round-robin.

  • Associação da Service Extension — O grupo de servidores está corretamente associado a uma Service Extension contendo o componente de roteamento com base em carga.

  • Exposição de métricas — Os backends expõem corretamente as métricas vLLM no caminho de coleta de métricas. Se a coleta de métricas falhar, o roteamento com base em carga retorna ao weighted round-robin.

  • Health check — Verifique se o status do health check está normal. Quando ativado, backends que falham nos health checks são removidos e ignorados pelo agendamento com base em carga. Quando todos os backends estão não saudáveis, o roteamento com base em carga retorna totalmente ao weighted round-robin.