Simple Science

La science de pointe expliquée simplement

# Informatique# Informatique distribuée, parallèle et en grappes# Architecture matérielle# Architecture des réseaux et de l'Internet# Systèmes d'exploitation

LibPreemptible : Une nouvelle approche pour la planification dans le cloud

LibPreemptible améliore la planification dans les appli cloud, réduisant les délais et boostant les performances.

― 8 min lire


LibPreemptible :LibPreemptible :Révolution du schedulingdans le cloudtâches dans le cloud.qui transforme la planification desUne bibliothèque au niveau utilisateur
Table des matières

Les Applications Cloud modernes font souvent face à des retards lors du traitement des requêtes. Ces retards peuvent chambouler l'expérience utilisateur, surtout que les temps d'attente peuvent varier énormément d'un utilisateur à l'autre. Pour régler ça, des chercheurs ont essayé différentes manières d'améliorer la façon dont les systèmes planifient les tâches. Mais, beaucoup de ces approches viennent avec leurs propres problèmes, comme nécessiter de gros changements au niveau du système d'exploitation ou ne pas exploiter le matériel au maximum de son potentiel.

Présentation de LibPreemptible

Une nouvelle solution appelée LibPreemptible est une bibliothèque de threads au niveau utilisateur. Elle vise à être légère, flexible et à pouvoir s'adapter efficacement aux applications cloud. LibPreemptible utilise trois méthodes principales :

  1. Une méthode rapide et efficace pour envoyer des interruptions temporisées avec l'aide du matériel.
  2. Une interface de Planification qui fonctionne au niveau utilisateur.
  3. Une API qui permet aux utilisateurs de définir des règles de planification en fonction des besoins spécifiques de leur application.

LibPreemptible est conçue pour mieux fonctionner que les anciens systèmes de planification sans nécessiter de changements au noyau du système d'exploitation. Elle montre à quel point elle peut s'adapter à différentes règles de planification, même quand les applications font face à des charges et des motifs de requêtes changeants.

Applications Cloud et leurs Défis

La plupart des opérations de calcul aujourd'hui se déroulent dans des environnements cloud, qu'ils soient publics ou privés. Ce changement a modifié la façon dont les applications sont construites - passant de gros services uniques à des services plus petits et interconnectés appelés microservices. Ces applications modernes doivent gérer de nombreuses tâches en même temps, avec souvent des milliers de requêtes en cours d'exécution simultanément. Cependant, cette complexité a ses inconvénients, particulièrement le défi de respecter des normes de performance spécifiques appelées Objectifs de Niveau de Service (SLO), qui se concentrent souvent sur la réduction des retards dans le traitement des requêtes.

Les centres de données cloud font également face à un problème avec trop de threads essayant d'accéder à des ressources partagées. Par exemple, des données récentes de Google ont montré que certaines applications planifiaient régulièrement plus de 50 threads par cœur, avec des pics allant jusqu'à 500 threads. Pour répondre aux exigences d'un calcul rapide et de faibles délais, les systèmes doivent utiliser une planification intelligente, à la fois efficace et flexible.

Le Besoin de Planification Préemptive

La planification préemptive est une méthode qui permet aux tâches plus courtes de prendre le pas sur les plus longues, évitant ainsi les retards causés par des tâches longues bloquant les plus courtes. Sans planification préemptive, les tâches courtes peuvent se retrouver bloquées en attendant que les longues se terminent, ce qui augmente le délai global. Ça aboutit à des latences de queue élevées, où un petit nombre de requêtes prend beaucoup plus de temps à s'achever.

Les tentatives passées pour améliorer la planification préemptive dans les environnements cloud se sont souvent révélées inefficaces pour les charges de travail à l'échelle de la microseconde. Les approches traditionnelles, comme l'utilisation d'interruptions régulières au niveau utilisateur, entraînent des surcharges lors du processus de changement de contexte entre les niveaux utilisateur et noyau. D'autres méthodes peuvent réduire le temps de changement mais introduisent des problèmes de sécurité lors de l'exécution dans des environnements cloud partagés.

La Solution Assistée par Matériel

LibPreemptible tire parti d'une nouvelle fonctionnalité matérielle appelée interruptions utilisateur (UINTR) trouvée dans les processeurs Xeon Scalable d'Intel. Cette fonctionnalité permet aux applications au niveau utilisateur d'envoyer des interruptions directement les unes aux autres, contournant ainsi le noyau et réduisant les délais. Cependant, les configurations initiales de UINTR ne conviennent pas aux charges de travail dynamiques qui n'ont pas de temps de service connu.

LibPreemptible utilise UINTR pour créer une bibliothèque de threads qui permet une planification précise et configurable, définissant les tranches de temps nécessaires pour l'exécution des tâches. Elle comprend également des temporisateurs utilisateur qui aident les applications à établir des règles de planification spécifiques.

Tests de Performance de LibPreemptible

Pour montrer à quel point LibPreemptible fonctionne bien, elle a été testée avec un mélange de charges de travail synthétiques et d'applications réelles couramment utilisées dans des environnements cloud. Les résultats ont montré des améliorations significatives en termes de performance et de flexibilité par rapport aux anciens systèmes de planification.

En moyenne, la latence de queue expérimentée par les applications utilisant LibPreemptible était dix fois meilleure que celles utilisant des systèmes plus anciens. Ça a amélioré non seulement la performance mais a aussi géré divers types de charges de manière plus efficace.

Politiques de Planification et Leur Importance

Les applications cloud traitent souvent des requêtes de longueurs variées, ce qui peut compliquer la planification. Avoir des politiques qui s'adaptent à ces différences est essentiel pour maintenir de faibles latences. Lorsqu'elles font face à de lourdes charges, la politique de planification doit s'adapter pour accueillir autant de requêtes que possible, tout en restant prioritaire sur les tâches plus courtes.

Différentes techniques de planification ont été testées, comme le Premier Arrivé, Premier Servi (FCFS), qui est adapté pour des distributions de charge de travail plus légères, et des stratégies plus complexes qui s'adaptent en fonction des données historiques des tâches traitées. Les résultats ont montré que les méthodes de planification dynamique qui s'ajustent selon des métriques en temps réel amélioraient la performance pendant les conditions de forte charge.

APIs de Planification au Niveau Utilisateur

LibPreemptible offre une interface de programmation d'application (API) conçue pour la flexibilité. Les développeurs peuvent créer et exécuter des fonctions préemptibles, gardant le contrôle sur l'exécution des tâches et la façon dont les requêtes sont gérées lorsqu'elles dépassent leurs limites de temps.

Les fonctions de cette API permettent de lancer et de reprendre facilement des tâches, de vérifier leurs statuts et de contrôler leur exécution en fonction de délais qui s'adaptent aux besoins de l'application.

Livraison de Temporisateurs Évolutive

Une des caractéristiques uniques de LibPreemptible est sa méthode de livraison de temporisateurs efficace, qui dépasse les méthodes traditionnelles basées sur le noyau. Les temporisateurs du noyau ont tendance à avoir des surcharges significatives lorsqu'ils sont en usage, surtout à mesure que le nombre de threads augmente. LibPreemptible contourne ces problèmes en utilisant son propre temporisateur au niveau utilisateur, ce qui évite une forte contention dans le noyau et permet de livrer les interruptions plus rapidement.

En gérant efficacement les temporisateurs, LibPreemptible peut gérer de nombreux threads tout en maintenant une faible surcharge, permettant aux applications de conserver leur performance même sous de fortes charges.

Scénarios de Charges de Travail Co-Localisées

Dans de nombreux environnements cloud, différents types d'applications tournent côte à côte, partageant souvent les mêmes ressources. Pour garantir que les applications critiques maintiennent de faibles latences, elles nécessitent souvent une planification préemptive pour récupérer des ressources sur des tâches moins importantes.

Avec LibPreemptible, les applications peuvent ajuster dynamiquement leurs intervalles préemptifs en fonction des charges de travail. Par exemple, des tests ont impliqué une application de stockage clé-valeur tournant en même temps qu'une application de compression de données. Les résultats ont indiqué que le planificateur préemptif pouvait garder la latence de queue de l'application clé-valeur basse tout en atténuant l'impact de performance de l'application de compression.

Conclusion

LibPreemptible représente une avancée significative dans la planification au niveau utilisateur pour les applications cloud. Elle tire parti de nouvelles capacités matérielles pour améliorer l'efficacité et la réactivité du traitement des requêtes. Cette nouvelle bibliothèque offre une solution plus adaptable et évolutive qui peut être facilement mise en œuvre dans les systèmes existants sans nécessiter de changements majeurs.

En intégrant des techniques assistées par matériel avec des politiques de planification flexibles, LibPreemptible améliore la performance tout en gérant les demandes complexes des applications cloud modernes. C'est un outil puissant pour les développeurs cherchant à améliorer les temps de réponse et à respecter les objectifs de niveau de service dans des environnements dynamiques.

Source originale

Titre: Towards Fast, Adaptive, and Hardware-Assisted User-Space Scheduling

Résumé: Modern datacenter applications are prone to high tail latencies since their requests typically follow highly-dispersive distributions. Delivering fast interrupts is essential to reducing tail latency. Prior work has proposed both OS- and system-level solutions to reduce tail latencies for microsecond-scale workloads through better scheduling. Unfortunately, existing approaches like customized dataplane OSes, require significant OS changes, experience scalability limitations, or do not reach the full performance capabilities hardware offers. The emergence of new hardware features like UINTR exposed new opportunities to rethink the design paradigms and abstractions of traditional scheduling systems. We propose LibPreemptible, a preemptive user-level threading library that is flexible, lightweight, and adaptive. LibPreemptible was built with a set of optimizations like LibUtimer for scalability, and deadline-oriented API for flexible policies, time-quantum controller for adaptiveness. Compared to the prior state-of-the-art scheduling system Shinjuku, our system achieves significant tail latency and throughput improvements for various workloads without modifying the kernel. We also demonstrate the flexibility of LibPreemptible across scheduling policies for real applications experiencing varying load levels and characteristics.

Auteurs: Lisa, Li, Nikita Lazarev, David Koufaty, Yijun Yin, Andy Anderson, Zhiru Zhang, Edward Suh, Kostis Kaffes, Christina Delimitrou

Dernière mise à jour: 2023-11-11 00:00:00

Langue: English

Source URL: https://arxiv.org/abs/2308.02896

Source PDF: https://arxiv.org/pdf/2308.02896

Licence: https://creativecommons.org/licenses/by/4.0/

Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.

Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.

Plus d'auteurs

Articles similaires