ack-koordinator offre une planification des workloads sensible aux objectifs de niveau de service (SLO), ce qui vous permet de colocaliser des workloads en ligne et hors ligne sur le même nœud. Votre service en ligne conserve ainsi ses performances, tandis que l'utilisation globale des ressources du cluster s'améliore. Cette rubrique explique comment colocaliser un service web NGINX et une application de transcodage vidéo FFmpeg à l'aide d'ack-koordinator.
Contexte
La colocalisation de workloads en ligne et hors ligne sur le même nœud est judicieuse car leurs besoins en ressources sont complémentaires : les services en ligne présentent une charge variable et consomment les ressources par à-coups, tandis que les travaux par lots hors ligne s'exécutent en continu et peuvent tolérer une priorité de ressource plus faible.
| Workload en ligne | Workload hors ligne | |
|---|---|---|
| Applications typiques | Services web, API, microservices | Transcodage vidéo, traitement big data, entraînement IA |
| Latence | Sensible | Insensible |
| SLO | Élevé | Faible |
| Modèle d'utilisation des ressources | Par à-coups, basé sur le temps | Continu |
| Tolérance aux pannes | Faible — nécessite une haute disponibilité | Élevée — permet l'échec et la nouvelle tentative |
ack-koordinator utilise des classes de qualité de service (QoS) pour gérer la priorité des ressources entre les workloads colocalisés. Les deux classes utilisées dans cette rubrique sont :
| Classe QoS | Valeur du libellé | Utilisation typique | Priorité CPU | Priorité mémoire |
|---|---|---|---|---|
| Sensible à la latence (LS) | koordinator.sh/qosClass: LS |
Services en ligne (par exemple, NGINX) | Élevée | Élevée |
| Best-effort (BE) | koordinator.sh/qosClass: BE |
Travaux par lots hors ligne (par exemple, FFmpeg) | Faible | Faible |
Fonctionnement
Dans cette rubrique, un service NGINX (classe QoS LS) et une application de transcodage vidéo FFmpeg (classe QoS BE) s'exécutent sur le même nœud. Deux fonctionnalités de colocalisation travaillent conjointement pour protéger les performances de NGINX :
Réutilisation des ressources : les workloads BE peuvent utiliser les ressources allouées aux workloads LS mais actuellement inactives, améliorant ainsi l'utilisation des ressources du cluster. Pour plus d'informations, consultez Dynamic resource overcommitment.
Isolation des ressources : divers mécanismes limitent l'utilisation des ressources par les workloads BE et donnent la priorité à la demande de ressources des workloads LS. Pour plus d'informations, consultez CPU QoS, CPU Suppress et Resource isolation based on the L3 cache and MBA.
Cette rubrique déploie les applications selon trois modes et compare les résultats :
| Mode | Description |
|---|---|
| Déploiement exclusif (référence) | Seul NGINX s'exécute sur le nœud. |
| Colocalisation Kubernetes par défaut (contrôle) | NGINX et FFmpeg s'exécutent sur le même nœud avec les classes QoS Kubernetes standard, sans ressources étendues ni fonctionnalités d'isolation ack-koordinator. |
| Colocalisation sensible aux SLO (expérimental) | NGINX et FFmpeg s'exécutent sur le même nœud avec les fonctionnalités d'isolation ack-koordinator activées. |
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
-
Un cluster ACK Pro avec deux nœuds :
Nœud 1 (machine de test) : exécute le service NGINX et l'application FFmpeg. Pour des performances de colocalisation optimales, utilisez une instance Bare Metal Elastic Compute Service (ECS) avec Alibaba Cloud Linux comme système d'exploitation.
Nœud 2 (machine de test de charge) : exécute l'outil de test de charge wrk et envoie des requêtes au service NGINX.
Pour les étapes de création du cluster, consultez Create an ACK Pro cluster.
ack-koordinator (anciennement ack-slo-manager) installé avec les politiques de colocalisation activées. Consultez Getting started. Cette rubrique utilise ack-koordinator 0.8.0.
La fonctionnalité CPU QoS nécessite Alibaba Cloud Linux comme système d'exploitation du nœud. L'isolation des ressources basée sur le cache L3 et MBA nécessite une instance ECS Bare Metal.
Déployer le service NGINX et wrk
Déployez le service NGINX sur la machine de test et l'outil de test de charge wrk sur la machine de test de charge.
Installer wrk sur la machine de test de charge
Exécutez les commandes suivantes sur le nœud 2 (la machine de test de charge) pour installer wrk 4.2.0 :
wget -O wrk-4.2.0.tar.gz https://github.com/wg/wrk/archive/refs/tags/4.2.0.tar.gz && tar -xvf wrk-4.2.0.tar.gz
cd wrk-4.2.0 && make && chmod +x ./wrk
Déployer l'application FFmpeg
Déployez l'application hors ligne de transcodage vidéo FFmpeg sur la machine de test. La configuration YAML diffère légèrement entre le mode de colocalisation Kubernetes par défaut et le mode de colocalisation sensible aux SLO ; les commentaires pertinents dans le fichier expliquent chaque différence.
-
Créez un fichier nommé
be-ffmpeg.yamlavec le contenu suivant : -
Déployez l'application FFmpeg :
kubectl apply -f be-ffmpeg.yaml -
Vérifiez que le pod est en cours d'exécution :
kubectl get pod -l app=ffmpeg -o wideSortie attendue :
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES be-ffmpeg 1/1 Running 0 15s 11.162.XXX.XXX cn-beijing.192.168.2.93 <none> <none>
Exécuter les tests de charge
Exécutez des tests dans chaque mode de colocalisation et comparez les résultats. Les métriques clés sont :
Percentiles du temps de réponse (RT) : RT-P90 correspond au temps maximal pour traiter 90 % des requêtes ; RT-P99 couvre 99 % des requêtes. Des valeurs plus faibles indiquent de meilleures performances NGINX.
Utilisation moyenne du processeur : mesurée avec
kubectl top node.
Mode 1 : Déploiement exclusif (référence)
Seul le service NGINX s'exécute sur la machine de test.
Déployez NGINX comme décrit dans Déployer le service NGINX et wrk.
-
Envoyez la charge depuis la machine de test de charge :
# Replace node_ip with the IP address of the tested machine. ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/ -
Vérifiez l'utilisation du processeur :
kubectl top nodeSortie attendue :
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-beijing.192.168.2.93 29593m 29% xxxx xxxx cn-beijing.192.168.2.94 6874m 7% xxxx xxxxL'utilisation du processeur sur la machine de test est d'environ 29 %.
-
Une fois le test terminé, examinez la sortie wrk. Pour des résultats précis, exécutez plusieurs tests. Sortie attendue :
Running 1m test @ http://192.168.2.94:8000/ 6 threads and 54 connections Thread Stats Avg Stdev Max +/- Stdev Latency 402.18us 1.07ms 59.56ms 99.83% Req/Sec 24.22k 1.12k 30.58k 74.15% Latency Distribution 50% 343.00us 75% 402.00us 90% 523.00us 99% 786.00us 8686569 requests in 1.00m, 6.88GB read Requests/sec: 144537.08 Transfer/sec: 117.16MBLa section
Latency Distributionaffiche les valeurs percentiles RT. En mode exclusif : RT-P50 est de 343 microsecondes, RT-P90 est de 523 microsecondes et RT-P99 est de 786 microsecondes.
Mode 2 : Colocalisation Kubernetes par défaut (contrôle)
NGINX et FFmpeg s'exécutent tous deux sur la machine de test sans les fonctionnalités d'isolation ack-koordinator.
Déployez NGINX comme décrit dans Déployer le service NGINX et wrk, puis déployez l'application FFmpeg en utilisant be-ffmpeg.yaml avec les modifications suivantes :
Supprimez le libellé
koordinator.sh/qosClass: BE.Supprimez les ressources étendues
kubernetes.io/batch-cpuetkubernetes.io/batch-memory.
Exécutez le test de charge wrk et collectez l'utilisation du processeur comme dans le mode 1. Dans cette configuration de contrôle, l'utilisation du processeur du nœud atteint environ 65 %.
Mode 3 : Colocalisation sensible aux SLO (expérimental)
NGINX et FFmpeg s'exécutent tous deux sur la machine de test avec les fonctionnalités d'isolation ack-koordinator activées.
-
Suivez le guide Getting started pour activer la colocalisation sensible aux SLO, puis configurez chaque fonctionnalité :
Dynamic resource overcommitment : Utilisez la configuration par défaut. Cela permet au système d'allouer les ressources inactives des pods LS aux pods BE sous forme de ressources par lots surengagées (
kubernetes.io/batch-cpuetkubernetes.io/batch-memory).CPU Suppress : Définissez
cpuSuppressThresholdPercentsur65. Conservez les paramètres par défaut pour les autres réglages. Lorsque l'utilisation du processeur du nœud dépasse 65 %, cette fonctionnalité limite l'utilisation du processeur des pods BE pour protéger les performances des pods LS.CPU QoS : Utilisez la configuration par défaut. Cela active la capacité CPU Identity sur Alibaba Cloud Linux, donnant aux pods LS la priorité de planification sur les pods BE, y compris lorsque le multithreading simultané (SMT) exécute des threads des deux pods sur le même cœur physique.
Resource isolation based on the L3 cache and MBA : Utilisez la configuration par défaut. Sur les instances ECS Bare Metal, cela isole le cache L3 (cache de dernier niveau) et l'allocation de bande passante mémoire (MBA) afin que les pods LS obtiennent un accès prioritaire.
ImportantLa fonctionnalité CPU QoS nécessite Alibaba Cloud Linux comme système d'exploitation du nœud. L'isolation du cache L3 et MBA nécessite une instance ECS Bare Metal.
Déployez NGINX comme décrit dans Déployer le service NGINX et wrk.
-
Créez un fichier nommé
besteffort-ffmpeg.yamlavec le contenu suivant : Afficher le contenu du fichier YAML# Pod for the offline FFmpeg video transcoding application (BE QoS class, SLO-aware mode) apiVersion: v1 kind: Pod metadata: name: besteffort-ffmpeg labels: app: ffmpeg # Set the QoS class to BE for SLO-aware scheduling. koordinator.sh/qosClass: BE spec: containers: - command: - start-ffmpeg.sh - '30' - '2' - /apps/ffmpeg/input/HD2-h264.ts - /apps/ffmpeg/ image: 'registry.cn-zhangjiakou.aliyuncs.com/acs/ffmpeg-4-4-1-for-slo-test:v0.1' imagePullPolicy: Always name: ffmpeg resources: # Request dynamically overcommitted resources. limits: kubernetes.io/batch-cpu: 70k kubernetes.io/batch-memory: 22Gi requests: kubernetes.io/batch-cpu: 70k kubernetes.io/batch-memory: 22Gi hostNetwork: true restartPolicy: Never nodeName: cn-beijing.192.168.2.93 # Replace with the node name of your tested machine. -
Déployez l'application FFmpeg :
kubectl apply -f besteffort-ffmpeg.yaml -
Vérifiez que le pod FFmpeg est en cours d'exécution :
kubectl get pod -l app=ffmpeg -o wideSortie attendue :
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES besteffort-ffmpeg 1/1 Running 0 15s 11.162.XXX.XXX cn-beijing.192.168.2.93 <none> <none> -
Envoyez la charge depuis la machine de test de charge :
# Replace node_ip with the IP address of the tested machine. ./wrk -t6 -c54 -d60s --latency http://${node_ip}:8000/ -
Vérifiez l'utilisation du processeur :
kubectl top nodeSortie attendue :
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% cn-beijing.192.168.2.93 65424m 63% xxxx xxxx cn-beijing.192.168.2.94 7040m 7% xxxx xxxxL'utilisation du processeur sur la machine de test est d'environ 63 %.
Une fois le test terminé, examinez la sortie wrk et comparez-la avec les résultats des autres modes.
Résultats des tests
Le tableau suivant compare le temps de réponse NGINX et l'utilisation du processeur du nœud dans les trois modes.
| Métrique | Référence (exclusif) | Contrôle (Kubernetes par défaut) | Expérimental (sensible aux SLO) |
|---|---|---|---|
| NGINX RT-P90 (ms) | 0,533 | 0,574 (+7,7 %) | 0,548 (2,8 %) |
| NGINX RT-P99 (ms) | 0,93 | 1,07 (+16 %) | 0,96 (+3,2 %) |
| Utilisation moyenne du processeur | 29,6 % | 65,1 % | 64,8 % |
Observations clés :
Colocalisation Kubernetes par défaut par rapport à la référence : l'utilisation du processeur augmente de 29,6 % à 65,1 %, mais le RT-P90 de NGINX augmente de 7,7 % et le RT-P99 de 16 %. La distribution de la latence présente une longue traîne.
Colocalisation sensible aux SLO par rapport à la référence : l'utilisation du processeur augmente de 29,6 % à 64,8 %, tandis que le RT-P90 n'augmente que de 2,8 % et le RT-P99 que de 3,2 %.
Colocalisation sensible aux SLO par rapport à la colocalisation Kubernetes par défaut : l'utilisation du processeur est similaire (~65 %), mais les temps de réponse NGINX sont nettement inférieurs et proches de la référence de déploiement exclusif.
La colocalisation sensible aux SLO permet d'obtenir à peu près la même amélioration de l'utilisation du processeur que la colocalisation standard, tout en maintenant la latence NGINX beaucoup plus proche de la référence sans colocalisation.
FAQ
Pourquoi wrk signale-t-il « Socket errors: connect 54, » ?
Cette erreur signifie que le client wrk ne peut pas établir de connexions avec le serveur NGINX car le nombre de connexions dépasse la limite du système d'exploitation. Corrigez le problème en activant la réutilisation des connexions TCP sur la machine de test de charge (et non sur la machine de test).
-
Vérifiez si la réutilisation des connexions TCP est activée :
sudo sysctl -n net.ipv4.tcp_tw_reuseUne valeur de retour de
0ou2signifie que la fonctionnalité est désactivée. -
Activez la réutilisation des connexions TCP :
sudo sysctl -w net.ipv4.tcp_tw_reuse=1 Relancez le test de charge wrk. Si
Socket errors: connect 54n'apparaît plus, la correction a fonctionné.
Une fois les tests terminés, désactivez la réutilisation des connexions TCP pour éviter des effets indésirables sur d'autres services : sysctl -w net.ipv4.tcp_tw_reuse=0 .