Agendamento de afinidade NUMA
Conhecimento de fundo
Quando o nó executa muitos pods vinculados à CPU, a carga de trabalho pode mover-se para diferentes núcleos de CPU, dependendo se o pod é acelerado e quais núcleos de CPU estão disponíveis no momento do agendamento. Muitas cargas de trabalho não são sensíveis a essa migração e, portanto, funcionam bem sem qualquer intervenção. No entanto, em cargas de trabalho nas quais a afinidade de cache da CPU e a latência de agendamento afetam significativamente o desempenho da carga de trabalho, o kubelet permite que políticas alternativas de gerenciamento da CPU determinem algumas preferências de posicionamento no nó.
Ambos CPU Manager e Topology Manager são componentes do kubelet, mas têm as seguintes limitações:
- O agendador não está ciente da topologia. Portanto, a carga de trabalho pode ser agendada em um nó e, em seguida, falhar no nó devido ao Topology Manager. Isso é inaceitável para tarefas TensorFlow. Se algum trabalhador ou ps falhou no nó, a tarefa falhará.
- Os gerentes são nível de nó que resulta em uma incapacidade de combinar o melhor nó para a topologia NUMA em todo o cluster.
Para obter mais informações, consulte https://github.com/volcano-sh/volcano/blob/master/docs/design/numa-aware.md.
Metas do Volcano para resolver a limitação para fazer a topologia NUMA de agendador consciente, de modo a alcançar o seguinte:
- Não agende pods para os nós que a topologia NUMA não combina.
- Agende pods para o melhor nó para topologia NUMA.
Escopo da aplicação
- Suporte ao agendamento de topologia de recursos da CPU
- Suporte às políticas de topologia em nível de pod
Previsão de agendamento
Para pods com a política de topologia, predique a lista de nós correspondentes.
Política |
Ação |
---|---|
none |
1. Nenhuma ação de filtro |
best-effort |
1. Filtre o nó com a política de topologia best-effort. |
restricted |
1. Filtre o nó com a política de topologia restricted. 2. Filtre o nó que a topologia de CPU cumpre os requisitos de CPU para restricted. |
single-numa-node |
1. Filtre o nó com a política de topologia single-numa-node. 2. Filtre o nó que a topologia da CPU atende aos requisitos de CPU para single-numa-node. |
Prioridade de agendamento
A política de topologia visa agendar pods para o nó ideal. Neste exemplo, cada nó é pontuado para classificar o nó ideal.
Princípio: agende pods para os nós de trabalho que exigem o menor número de nós NUMA.
A fórmula de pontuação é a seguinte:
score = weight * (100 - 100 * numaNodeNum / maxNumaNodeNum)
Descrição do parâmetro:
- weight: indica o peso de NUMA Aware Plugin.
- numaNodeNum: indica o número de nós NUMA necessários para executar o pod no nó de trabalho.
- maxNumaNodeNum: indica o número máximo de nós NUMA em um pod de todos os nós de trabalho.
Habilitar o Volcano para suportar agendamento de afinidade NUMA
- Habilite a política de gerenciamento da CPU. Para mais detalhes, consulte Ativar a política de gerenciamento da CPU.
- Configure uma política de topologia de CPU.
- Faça logon no console do CCE, clique no nome do cluster, acesse a página de detalhes do cluster e escolha Nodes no painel de navegação. Na página exibida, clique na guia Node Pools. Escolha More > Manage na coluna Operation do pool de nós de destino.
- Altere o valor de topology-manager-policy em kubelet para a política de topologia de CPU necessária. Conforme mostrado na figura a seguir, a política de topologia da CPU é best-effort.
As políticas de topologia válidas são none, best-effort, restricted e single-numa-node. Para obter detalhes sobre essas políticas, consulte Previsão de agendamento.
- Habilite o complemento numa-aware e a função resource_exporter.
volcano 1.7.1 ou mais tarde
- Efetue logon no console do CCE e acesse o console do cluster. No painel de navegação, escolha Add-ons. À direita da página, localize o complemento do volcano e clique em Edit. Na área Parameters, configure os parâmetros do agendador de Volcano.
{ "ca_cert": "", "default_scheduler_conf": { "actions": "allocate, backfill", "tiers": [ { "plugins": [ { "name": "priority" }, { "name": "gang" }, { "name": "conformance" } ] }, { "plugins": [ { "name": "drf" }, { "name": "predicates" }, { "name": "nodeorder" } ] }, { "plugins": [ { "name": "cce-gpu-topology-predicate" }, { "name": "cce-gpu-topology-priority" }, { "name": "cce-gpu" }, { // add this also enable resource_exporter "name": "numa-aware", // the weight of the NUMA Aware Plugin "arguments": { "weight": "10" } } ] }, { "plugins": [ { "name": "nodelocalvolume" }, { "name": "nodeemptydirvolume" }, { "name": "nodeCSIscheduling" }, { "name": "networkresource" } ] } ] }, "server_cert": "", "server_key": "" }
volcano anterior a 1.7.1- O parâmetro resource_exporter_enable está ativado para o complemento de volcano coletar informações de nó NUMA.
{ "plugins": { "eas_service": { "availability_zone_id": "", "driver_id": "", "enable": "false", "endpoint": "", "flavor_id": "", "network_type": "", "network_virtual_subnet_id": "", "pool_id": "", "project_id": "", "secret_name": "eas-service-secret" } }, "resource_exporter_enable": "true" }
Depois que esta função é permitida, você pode ver a informação da topologia NUMA do nó atual.kubectl get numatopo NAME AGE node-1 4h8m node-2 4h8m node-3 4h8m
- Habilite o complemento do algoritmo numa-aware do volcano.
kubectl edit cm -n kube-system volcano-scheduler-configmap
kind: ConfigMap apiVersion: v1 metadata: name: volcano-scheduler-configmap namespace: kube-system data: default-scheduler.conf: |- actions: "allocate, backfill" tiers: - plugins: - name: priority - name: gang - name: conformance - plugins: - name: overcommit - name: drf - name: predicates - name: nodeorder - plugins: - name: cce-gpu-topology-predicate - name: cce-gpu-topology-priority - name: cce-gpu - plugins: - name: nodelocalvolume - name: nodeemptydirvolume - name: nodeCSIscheduling - name: networkresource arguments: NetworkType: vpc-router - name: numa-aware # add it to enable numa-aware plugin arguments: weight: 10 # the weight of the NUMA Aware Plugin
- Efetue logon no console do CCE e acesse o console do cluster. No painel de navegação, escolha Add-ons. À direita da página, localize o complemento do volcano e clique em Edit. Na área Parameters, configure os parâmetros do agendador de Volcano.
Usar o Volcano para dar suporte ao agendamento de afinidade NUMA
- Configure afinidade NUMA para Implementações. O seguinte é um exemplo:
kind: Deployment apiVersion: apps/v1 metadata: name: numa-tset spec: replicas: 1 selector: matchLabels: app: numa-tset template: metadata: labels: app: numa-tset annotations: volcano.sh/numa-topology-policy: single-numa-node # set the topology policy spec: containers: - name: container-1 image: nginx:alpine resources: requests: cpu: 2 # The value must be an integer and must be the same as that in limits. memory: 2048Mi limits: cpu: 2 # The value must be an integer and must be the same as that in requests. memory: 2048Mi imagePullSecrets: - name: default-secret
- Crie uma tarefa de volcano e use a afinidade NUMA.
apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: vj-test spec: schedulerName: volcano minAvailable: 1 tasks: - replicas: 1 name: "test" topologyPolicy: best-effort # set the topology policy for task template: spec: containers: - image: alpine command: ["/bin/sh", "-c", "sleep 1000"] imagePullPolicy: IfNotPresent name: running resources: limits: cpu: 20 memory: "100Mi" restartPolicy: OnFailure
- Verifique o uso de NUMA.
# Check the CPU usage of the current node. lscpu ... CPU(s): 32 NUMA node(s): 2 NUMA node0 CPU(s): 0-15 NUMA node1 CPU(s): 16-31 # Check the CPU allocation of the current node. cat /var/lib/kubelet/cpu_manager_state {"policyName":"static","defaultCpuSet":"0,10-15,25-31","entries":{"777870b5-c64f-42f5-9296-688b9dc212ba":{"container-1":"16-24"},"fb15e10a-b6a5-4aaa-8fcd-76c1aa64e6fd":{"container-1":"1-9"}},"checksum":318470969}